内存不足:杀死进程(gunicorn)得分或牺牲 child
Out of memory: Kill process (gunicorn) score or sacrifice child
我正在 运行在 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的输出,显示内存使用量在稳步增加:
上传图片前的最高输出(基线):
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
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,即使我只上传了 < 5MB 的文件?
Gunicorn 服务器在收到图像后对它做了什么?我曾经遇到过一个特定的损坏的 JPEG 图像,该图像在(现在是旧的)ImageMagick 版本中触发了内存泄漏,最终导致服务器崩溃。
您可以通过在接受文件作为命令行参数的相同代码中创建 CLI 入口点来测试问题是否出在 Gunicorn 与您的代码上。
如果从 CLI 加载文件时仍然出现内存泄漏,则问题出在您的应用程序代码上。
如果您在 CLI 测试中没有发现内存泄漏,则问题出在您的 Gunicorn 配置上。
此外,继续为机器添加一些交换作为安全缓冲区。我会添加 1 Gig。 Instructions for adding swap on Digital Ocean。只是这样做可能会让任务完成,无论如何都是很好的做法。
我正在 运行在 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的输出,显示内存使用量在稳步增加:
上传图片前的最高输出(基线):
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
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,即使我只上传了 < 5MB 的文件?
Gunicorn 服务器在收到图像后对它做了什么?我曾经遇到过一个特定的损坏的 JPEG 图像,该图像在(现在是旧的)ImageMagick 版本中触发了内存泄漏,最终导致服务器崩溃。
您可以通过在接受文件作为命令行参数的相同代码中创建 CLI 入口点来测试问题是否出在 Gunicorn 与您的代码上。 如果从 CLI 加载文件时仍然出现内存泄漏,则问题出在您的应用程序代码上。
如果您在 CLI 测试中没有发现内存泄漏,则问题出在您的 Gunicorn 配置上。
此外,继续为机器添加一些交换作为安全缓冲区。我会添加 1 Gig。 Instructions for adding swap on Digital Ocean。只是这样做可能会让任务完成,无论如何都是很好的做法。