Оптимизация QuerySetSequence в Django - PullRequest
       9

Оптимизация QuerySetSequence в Django

0 голосов
/ 11 сентября 2018

В одном из моих представлений у меня есть проблема, что вход в этот URL делает использование процессора 100% в течение 5-10 минут.Это означает, что в течение следующих 5-10 минут моя веб-страница будет бесполезной.

Моя ставка заключается в том, сколько запросов к базе данных я пытаюсь отправить.Views.py, который доставляет мне неприятности:

def guild_details(request, guild_name):
    fixed_guild_name = urllib.parse.unquote(guild_name)
    players = Player.objects.filter(guild=fixed_guild_name)

    last_month = datetime.today() - timedelta(days=30)
    deaths = reduce(QuerySetSequence, [Deaths.objects.filter(killed=player, date__gte=last_month) for player in players])
    kills = reduce(QuerySetSequence, [Deaths.objects.filter(killer=player, date__gte=last_month) for player in players])

    return render(request, 'guild.html', {'players': players,
                                          'deaths': deaths.order_by('-date'),
                                          'kills': kills.order_by('-date'),
                                          'guild_name': guild_name})

Кажется, не так уж плохо , но учтите, что:

  • База данных включает более 6000+ "игроков",(и растет)
  • База данных включает в себя более 26000+ "Смертей".(и поднимается)

Сначала я думал о создании кэша для этой веб-страницы, но число смертей / убийств может меняться каждые 30 минут или около того, поэтому я не думаю, что это сильно поможет -учитывая, что у меня проблемы с доступом к этой странице в первый раз , если количество игроков велико (10+).Если количество игроков мало, у меня нет проблем с доступом к этой странице.Кроме того, я использую redis / celery с утилизацией на том же сервере.

Есть ли что-то, что я мог бы оптимизировать, чтобы он работал?Или мне просто нужно добавить больше CPU?

Моя команда "top":

    last pid: 69974;  load averages:  4.28,  4.78,  5.49                                                                                                    up 2+11:16:22  12:40:46
14 processes:  5 running, 9 sleeping
CPU: 33.1% user,  1.4% nice,  6.0% system,  0.0% interrupt, 59.4% idle
Mem: 8965M Active, 30G Inact, 112K Laundry, 82G Wired, 3594M Free
ARC: 64G Total, 41G MFU, 19G MRU, 17M Anon, 857M Header, 2934M Other
     55G Compressed, 97G Uncompressed, 1.76:1 Ratio
Swap:

  PID USERNAME       THR PRI NICE   SIZE    RES STATE   C   TIME    WCPU COMMAND
41281 xxxx             1 103    0 65500K 61516K CPU0    0  15:27 100.34% python3.6
42147 xxxx             1 103    0 52956K 48584K CPU1    1   6:33  99.98% python3.6
41637 xxxx             1 103    0 56284K 52352K CPU9    9  14:44  96.18% python3.6
44812 xxxx             1  35   15 65132K 57864K CPU3    3   0:05   0.05% python3.6
51296 xxxx             4  35   15 12444K  7880K kqread  3   0:03   0.03% redis-server
69122 xxxx             1  35   15  7920K  3236K CPU5    5   0:00   0.02% top
40866 xxxx             1  35   15 13192K  8336K select  5   0:00   0.00% sshd
44823 xxxx             1  35   15 73836K 66868K select  2   1:03   0.00% python3.6
93909 xxxx             1  35   15 62060K 55860K select  5   0:04   0.00% python3.6
44811 xxxx             1  35   15  7668K  3688K select  4   0:01   0.00% screen
66149 xxxx             1  21    0  4691M    98M accept  3   0:00   0.00% php-fpm
93908 xxxx             1  35   15  7668K  3708K select  3   0:00   0.00% screen
40867 xxxx             1  35   15  8056K  4336K wait    3   0:00   0.00% bash
51295 xxxx             1  35   15  7668K  3656K select  1   0:00   0.00% screen

Первые 3 - passenger_wsgi, который включает manage.py ON.

1 Ответ

0 голосов
/ 11 сентября 2018

Вы можете использовать поиск __in [Django-doc] и передать список Player s здесь:

def guild_details(request, guild_name):
    fixed_guild_name = urllib.parse.unquote(guild_name)
    players = Player.objects.filter(guild=fixed_guild_name)

    last_month = datetime.today() - timedelta(days=30)
    deaths = Deaths.objects.filter(killed<b>__in</b>=players, date__gte=last_month)
    kills = Deaths.objects.filter(killer<b>__in</b>=players, date__gte=last_month)

    return render(request, 'guild.html', {'players': players,
                                          'deaths': deaths.order_by('-date'),
                                          'kills': kills.order_by('-date'),
                                          'guild_name': guild_name})

Таким образом, мысоздайте запрос, который также выполняет ORDER BY в том же запросе .

...