【问题标题】:Out of memory: Kill process (gunicorn) score or sacrifice child内存不足:杀死进程(gunicorn)得分或牺牲孩子
【发布时间】:2016-04-22 04:09:18
【问题描述】:

我在 DigitalOcean VPS(512 MB RAM、1 个 CPU、20GB SSD)上运行 Django 1.8 项目。我有 Nginx 代理到 gunicorn 的流量。这是我的 gunicorn 命令(通过主管运行):

gunicorn my_web_app.wsgi:application --worker-class gevent --bind 127.0.0.1:8001 --timeout=1200

我注意到,当我将大约 3-5 MB 的图像上传到我的网络应用程序时,gunicorn worker 崩溃并出现以下错误:

Jan 16 12:39:46 dev-1 kernel: [663264.917312] Out of memory: Kill process 31093 (gunicorn) score 589 or sacrifice child
Jan 16 12:39:46 dev-1 kernel: [663264.917416] Killed process 31093 (gunicorn) total-vm:560020kB, anon-rss:294888kB, file-rss:8kB

我从顶部监控了输出,显示内存使用量稳步增加:

上传图片前的顶部输出(基线):

top - 13:19:45 up 7 days, 16:54,  2 users,  load average: 0.00, 0.03, 0.05
Tasks:  96 total,   1 running,  95 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.4 us,  0.2 sy,  0.0 ni, 99.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:    501780 total,   298384 used,   203396 free,    17112 buffers
KiB Swap:        0 total,        0 used,        0 free.    72048 cached Mem

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                                                                                   
 902 my_user   20   0  145336  32332   3900 S  0.0  6.4   0:01.00 gunicorn

上传大约一分钟(中途标记):

top - 13:22:00 up 7 days, 16:56,  2 users,  load average: 0.05, 0.03, 0.05
Tasks:  98 total,   1 running,  97 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.4 us,  0.2 sy,  0.0 ni, 99.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:    501780 total,   313976 used,   187804 free,    18100 buffers
KiB Swap:        0 total,        0 used,        0 free.    77196 cached Mem

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                                                                                   
  902 my_user   20   0  171492  40076   5352 S  0.0  8.0   0:01.33 gunicorn

独角兽坠毁前的时刻:

top - 13:23:14 up 7 days, 16:57,  2 users,  load average: 0.19, 0.07, 0.06
Tasks:  99 total,   3 running,  96 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.4 us,  0.2 sy,  0.0 ni, 99.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:    501780 total,   341836 used,   159944 free,    18236 buffers
KiB Swap:        0 total,        0 used,        0 free.    90228 cached Mem

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                                                                                   
  902 my_user   20   0  239184  52492   5568 R 80.9 10.5   0:01.65 gunicorn

最后,崩溃的那一刻:

top - 13:23:15 up 7 days, 16:57,  2 users,  load average: 0.19, 0.07, 0.06
Tasks:  99 total,   4 running,  95 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.4 us,  0.2 sy,  0.0 ni, 99.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:    501780 total,   495800 used,     5980 free,      176 buffers
KiB Swap:        0 total,        0 used,        0 free.    31564 cached Mem

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                                                                                   
  902 my_user   20   0  545520 284012   5264 R 80.1 56.6   0:02.74 gunicorn

什么可能导致 gunicorn worker 的内存使用量超过 200MB,即使我只上传了一个

【问题讨论】:

    标签: django python-2.7 nginx gunicorn gevent


    【解决方案1】:

    Gunicorn 服务器收到图像后会如何处理它?我曾经遇到过一个特定的损坏的 JPEG 图像,它触发了 ImageMagick(现在是旧的)版本中的内存泄漏,最终导致服务器崩溃。

    您可以通过在接受文件作为命令行参数的同一代码中创建 CLI 入口点来测试问题是否是 Gunicorn 与您的代码。 如果您仍然遇到从 CLI 加载文件的内存泄漏,则问题出在您的应用程序代码上。

    如果您在 CLI 测试中没有发现内存泄漏,则问题出在您的 Gunicorn 配置上。

    另外,继续为机器添加一些交换作为安全缓冲区。我会添加 1 Gig。 Instructions for adding swap on Digital Ocean。这样做可能会让任务完成,无论如何都是一种好的做法。

    【讨论】:

    • 我不确定 Gunicorn 是否会在文件完全上传之前缓冲,或者是否将其流式传输到应用服务器,但最终,该文件由我的 Django 视图处理,该视图创建一个对象(ImageField 模型)。 Strangley,我对 Django 的内置 Web 服务器没有任何问题。我会尝试你提到的命令行方法。
    • 感谢您的调查提示。事实证明,问题出在某些应用程序代码上。我正在尝试在这里寻求帮助:stackoverflow.com/questions/34835725/…
    猜你喜欢
    • 2018-09-08
    • 2022-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-03
    • 2012-02-25
    • 2018-09-30
    相关资源
    最近更新 更多