Django 应用程序内存使用情况

Bob*_*ban 5 python django gunicorn

我在具有以下特征的 Digital Ocean 服务器上运行 Django 应用程序(基于 Django Rest Framework):

  • 4GB 内存
  • 2 个 CPU
  • 60 GB 驱动器

我正在使用 Gunicorn 运行 Django 应用程序和 Celery 来管理队列。数据库是 MySQL。

正如我所看到的,CPU 使用率非常低,但内存使用率似乎很大。

在此处输入图片说明

在此处输入图片说明

部署后,我注意到python3进程使用了​​更多内存(大约 75%)。每当我部署时,我都会运行after_deploy脚本,其中包含以下内容:

service nginx restart
service gunicorn restart
chmod +x /mnt/myapplication/current/myapplication/setup/restart.sh
source /mnt/env/bin/activate
cd /mnt/myapplication/current/
pip3 install -r requirements.txt
python3 manage.py migrate --noinput >>  /mnt/migrations/migrations.log
rm -f celerybeat.pid
rm -f celeryd.pid
celery -A myapplication beat -l info -f /var/log/celery/celery.log --detach
celery -A myapplication worker -l info -f /var/log/celery/celery.log --detach
Run Code Online (Sandbox Code Playgroud)

这些数字是预期的吗?如果没有,我该如何调查出了什么问题?

bru*_*ers 7

Python 进程倾向于保留分配的内存,因此如果您的一个 Python 进程为给定的操作(Django 视图、celery 任务......)分配了大量内存,它确实会在它运行时保留它。

只要内存使用保持基本稳定(我的意思是:在进程启动后增长到一定数量然后保持在这个数量)并且您的服务器不交换,通常没有什么可担心的,因为进程将继续重用已经分配的内存。

现在,如果您发现内存使用量一直在增长,那么您可能确实在某处存在内存泄漏。

请注意,运行 celery - 或 django FWIW -settings.DEBUG 导致内存泄漏 - 但无论如何你都不应该在设置了 `settings.DEBUG 标志的情况下运行你的生产过程,因为这也是一个安全问题。

如果这不是您的情况,那么您可以开始在此处和网络上的其他地方搜索“调试 python 内存泄漏”。你可以在这里找到一个很好的起点:

Python 应用程序泄漏内存并不容易。通常有以下三种情况:

  • 一些低级 C 库正在泄漏
  • 您的 Python 代码具有随时间增长的全局列表或字典,并且您在使用后忘记删除这些对象
  • 您的应用中有一些参考周期

这里

特别是对于 celery,您可以定期滚动 celery 工作进程。这正是 CELERYD_MAX_TASKS_PER_CHILD 设置所做的。