Подтвердить что ты не робот

Как регистрировать использование памяти приложения Django для каждого запроса

Знаете ли вы об эффективном способе записи в память приложения django для каждого запроса?

У меня есть стек apache/mod_wsgi/django, который работает обычно хорошо, но иногда один процесс заканчивается тем, что он потребляет огромное количество памяти. Серверы заканчиваются короткой памятью, значительно меняя местами, а службы резко замедляются.

Эта ситуация довольно сложно исправить, потому что я не знаю, какой запрос должен быть обвинен в этом поведении, я не могу воспроизвести его.

Я хотел бы иметь что-то развернутое в производстве, которое регистрирует использование памяти процесса до и после каждого запроса с минимальными накладными расходами.


Прежде чем я начну изобретать колесо, сообществу моих коллег-джангоистов известно какое-либо существующее решение для решения этой проблемы? Советы, промежуточное программное обеспечение, фрагмент или, возможно, конфигурация журнала apache оценены.

Что (я думаю) мне не нужно:

  • набор инструментов для профилирования/отладки dev-stage, я уже знаю некоторые, и я бы использовал их, если бы знал, что делать с профилем/отлаживать, он выглядит немного слишком много, чтобы быть навсегда службами мониторинга, работающими на производстве. Кроме того, то, что обычно отображается этими tol, - это отчет об использовании памяти для фрагмента кода для фрагментов. Было бы очень полезно просто определить ошибочный запрос.
  • общие советы о том, как оптимизировать использование памяти в приложении django, хорошо это всегда хорошо читать, но идея здесь скорее "как эффективно отслеживать запросы, которые нужно оптимизировать".

Самые близкие результаты поиска:

4b9b3361

Ответ 1

Связующее ПО Django для отслеживания использования памяти и получения полезного результата немедленно, необходимо подключить как запрос процесса, так и ответ процесса. Другими словами, посмотрите разницу между началом и завершением запроса и запишите предупреждение, если оно превышает некоторый порог.

Полный пример промежуточного программного обеспечения:

import os
import psutil
import sys

THRESHOLD = 2*1024*1024

class MemoryUsageMiddleware(object):

    def process_request(self, request):
        request._mem = psutil.Process(os.getpid()).get_memory_info()

   def process_response(self, request, response):
        mem = psutil.Process(os.getpid()).get_memory_info()
        diff = mem.rss - request._mem.rss
        if diff > THRESHOLD:
            print >> sys.stderr, 'MEMORY USAGE %r' % ((diff, request.path),)
        return response

Для этого требуется, чтобы модуль psutil был установлен для вычисления памяти.

Является грубой силой и может приводить к ложным срабатываниям в многопоточной системе. Из-за ленивой загрузки вы также увидите, что она запускает первые несколько запросов против нового процесса, когда материал загружается.

Ответ 2

Это может не полностью охватывать ваш вопрос, но я рекомендую попробовать nginx + uwsgi вместо apache2 + mod_wsgi. В моих тестах он оказался намного более стабильным (mod_wsgi задохнулся в какой-то момент полностью), намного быстрее и использует намного меньше памяти (он может полностью исправить все ваши проблемы).

О отслеживании использования памяти вы можете создать простую промежуточную информацию:

class SaveMemoryUsageMiddleware(object):
    def process_response(self, request, response):
        # track memory usage here and append to file or db
        return response

и добавьте его в свои средние.

Для кода отслеживания памяти я рекомендую проверить: Общая память, используемая процессом Python?

Однако, вероятно, было бы лучше, если бы вы могли избежать этого при производстве. Только для разработчиков и тестов для выявления реальной проблемы.