Django использует много памяти
Я использую django в качестве бэкенда для фронтенда React и развертываю оба приложения на Heroku. Я использую Gunicorn для обслуживания приложения и подписал план Hobby на Heroku, который предлагает 512 МБ оперативной памяти для запуска приложения. Но django dyno почти всегда использует много памяти, превышая лимит в 512 Мб. Она снижается до 40 Мб при перезагрузке или развертывании изменений, но как только какой-либо пользователь использует систему и вызывает некоторые запросы. Память сильно возрастает. Я читал об оптимизации памяти django и django-rest-framework уже несколько дней, и попробовал некоторые изменения, такие как: использование --preload на Gunicorn, установка --max-requests для уничтожения запросов, когда они слишком нагружают память, я установил CONN_MAX_AGE для базы данных и WEB_CONCURRENCY, как указано на:
https://devcenter.heroku.com/articles/python-concurrency-and-database-connections
Но ничего из этого не дало мне достаточно хорошего результата. Сейчас я предполагаю, что неправильными являются мои запросы, потому что я видел несколько статей об использовании .iterator() в запросах и о том, как это предотвращает кэширование запросов приложением, но я не использовал его ни в одном из своих запросов. Я не думаю, что кэширование запросов вообще поможет моему приложению, я даже храню некоторые результаты в React state, чтобы не вызывать запросы снова.
Я попробовал использовать iterator() для некоторых запросов, но заметил, что когда память контейнера увеличивается, она остается очень долго. Я видел, как потребление оставалось неизменным до 6 часов подряд, и я не думаю, что кэш запросов будет храниться в памяти так долго (или будет?).
Итак, теперь я немного запутался в том, что пробовать дальше и на чем мне следует сосредоточиться, и любая помощь приветствуется. Заранее спасибо!
Вам необходимо использовать профилировщик memroy, чтобы увидеть, какая функция или метод выделяют память
.
Примером инструмента является memray, после его установки запустите сервер django следующим образом:
python -m memray run ./manage.py runserver
Посетите страницы или вызовите API, которые могут использовать много памяти, затем завершите выполнение программы (в linux используйте CTRL+c)
Он сгенерирует файл с данными об использовании памяти и покажет вам, как преобразовать его в читаемый формат, вы можете вставить его сюда, чтобы получить некоторое представление, если вы не можете прочитать его самостоятельно