Как регистрировать использование памяти приложения Django для каждого запроса
Знаете ли вы об эффективном способе записи в память приложения django для каждого запроса?
У меня есть стек apache/mod_wsgi/django, который работает обычно хорошо, но иногда один процесс заканчивается тем, что он потребляет огромное количество памяти. Серверы заканчиваются короткой памятью, значительно меняя местами, а службы резко замедляются.
Эта ситуация довольно сложно исправить, потому что я не знаю, какой запрос должен быть обвинен в этом поведении, я не могу воспроизвести его.
Я хотел бы иметь что-то развернутое в производстве, которое регистрирует использование памяти процесса до и после каждого запроса с минимальными накладными расходами.
Прежде чем я начну изобретать колесо, сообществу моих коллег-джангоистов известно какое-либо существующее решение для решения этой проблемы?
Советы, промежуточное программное обеспечение, фрагмент или, возможно, конфигурация журнала apache оценены.
Что (я думаю) мне не нужно:
- набор инструментов для профилирования/отладки dev-stage, я уже знаю некоторые, и я бы использовал их, если бы знал, что делать с профилем/отлаживать, он выглядит немного слишком много, чтобы быть навсегда службами мониторинга, работающими на производстве. Кроме того, то, что обычно отображается этими tol, - это отчет об использовании памяти для фрагмента кода для фрагментов. Было бы очень полезно просто определить ошибочный запрос.
- общие советы о том, как оптимизировать использование памяти в приложении django, хорошо это всегда хорошо читать, но идея здесь скорее "как эффективно отслеживать запросы, которые нужно оптимизировать".
Самые близкие результаты поиска:
Ответы
Ответ 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?
Однако, вероятно, было бы лучше, если бы вы могли избежать этого при производстве. Только для разработчиков и тестов для выявления реальной проблемы.