Apache 沉睡进程导致 OOM 的问题

2018-04-17 18:11:12 +08:00
 YvesX
Apache2+mod_wsgi+Django,其中 wsgi 工作在 DaemonProcess 模式下,Apache 的 MPM 模式是 event。
Django 有两个应用需要 load 大体积文件,所以每个 apache 进程占用内存 1.5GB 左右。服务器资源是双核+8GB。

现在的问题是服务器会时不时自行启动新的进程,而旧的进程却并没有被释放掉。猜测是在尝试重启进程,因为 graceful restart Apache 的时候会有相同的进程沉积问题。
由于我们 Apache 进程开销很大,所以这样几次以后就会占满内存导致服务崩溃,活不过半天。
而定期重启的 dirty hack 也不是很理想,因为服务整个启动起来会花十多秒,如果太频繁会影响可用性。

Apache 的错误日志已经是 info 级别,只能看到 wsgi 进程启动的事实,看不到任何别的异常。

请问这样的问题怎样排查和解决呢?
2343 次点击
所在节点    Django
8 条回复
tailf
2018-04-17 18:13:56 +08:00
想办法把 Apache 换了。
clino
2018-04-17 18:14:14 +08:00
话说为什么不换成 nginx+uwsgi 之类的部署方式来解决这个问题呢?
uwsgi 还可以设置内存上限,超过了自动 kill worker 然后重启
YvesX
2018-04-17 18:21:21 +08:00
@tailf #1
@clino #2

谢谢建议,我会尝试一下。
myyou
2018-04-17 18:30:06 +08:00
nginx+gunicorn+django 很方便,nginx 本身比 Apache 占用也小
julyclyde
2018-04-17 19:39:45 +08:00
load 大文件的事可不可以拆出去做呢?
MeteorCat
2018-04-17 20:02:57 +08:00
看下是不是 apache 加载了一些模块导致的,apache 历史包裹很多,你看下某些 Mod 在吃资源
YvesX
2018-04-17 20:15:23 +08:00
@myyou #4

谢谢你的建议,结合上面几位朋友的说法,换了你所说的组合。开销减少并不是很明显(每个进程少了 80MB 左右),但问题似乎得到了彻底解决。
YvesX
2018-04-17 20:17:50 +08:00
@MeteorCat #6
现在已经换掉 Apache 了,但在之前的观察中,每个新建的 Apache 进程内存占用都是基本一致的,略大于那几个大文件的体积和。所以应该就是 WSGI 的问题,只是确实不太想得通为什么会出现这种情况……

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/447566

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX