YvesX
V2EX  ›  Django

Apache 沉睡进程导致 OOM 的问题

  •  
  •   YvesX · Apr 17, 2018 · 2981 views
    This topic created in 2972 days ago, the information mentioned may be changed or developed.
    Apache2+mod_wsgi+Django,其中 wsgi 工作在 DaemonProcess 模式下,Apache 的 MPM 模式是 event。
    Django 有两个应用需要 load 大体积文件,所以每个 apache 进程占用内存 1.5GB 左右。服务器资源是双核+8GB。

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

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

    请问这样的问题怎样排查和解决呢?
    8 replies    2018-04-17 20:17:50 +08:00
    tailf
        1
    tailf  
       Apr 17, 2018   ❤️ 1
    想办法把 Apache 换了。
    clino
        2
    clino  
       Apr 17, 2018   ❤️ 1
    话说为什么不换成 nginx+uwsgi 之类的部署方式来解决这个问题呢?
    uwsgi 还可以设置内存上限,超过了自动 kill worker 然后重启
    YvesX
        3
    YvesX  
    OP
       Apr 17, 2018
    @tailf #1
    @clino #2

    谢谢建议,我会尝试一下。
    myyou
        4
    myyou  
       Apr 17, 2018   ❤️ 1
    nginx+gunicorn+django 很方便,nginx 本身比 Apache 占用也小
    julyclyde
        5
    julyclyde  
       Apr 17, 2018   ❤️ 1
    load 大文件的事可不可以拆出去做呢?
    MeteorCat
        6
    MeteorCat  
       Apr 17, 2018 via Android   ❤️ 1
    看下是不是 apache 加载了一些模块导致的,apache 历史包裹很多,你看下某些 Mod 在吃资源
    YvesX
        7
    YvesX  
    OP
       Apr 17, 2018
    @myyou #4

    谢谢你的建议,结合上面几位朋友的说法,换了你所说的组合。开销减少并不是很明显(每个进程少了 80MB 左右),但问题似乎得到了彻底解决。
    YvesX
        8
    YvesX  
    OP
       Apr 17, 2018
    @MeteorCat #6
    现在已经换掉 Apache 了,但在之前的观察中,每个新建的 Apache 进程内存占用都是基本一致的,略大于那几个大文件的体积和。所以应该就是 WSGI 的问题,只是确实不太想得通为什么会出现这种情况……
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2864 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 05:50 · PVG 13:50 · LAX 22:50 · JFK 01:50
    ♥ Do have faith in what you're doing.