uwsgi killed NO MERCY 小记

django nginx uwsgi mongoengine 2017年05月02日 星期二

最近的一项目使用的技术栈为django + mongoengine ,部署一如既往的是nginx + uwsgi ,这次却发生了一个令人匪夷所思的问题,uwsgi 会自动杀掉自己的进程,uwsgi log 会显示如下错误:

worker 1 (pid: 83581) is taking too much time to die...NO MERCY !!!

然而发生这个错误却发生在只单单增加了一个mongoengine的connect,settings 如下:

"""
UserWarning: MongoClient opened before fork, Create MongoClient with connect=False
"""

connect('irory', alias='default',
        host='mongodb://rory.local:2001,rory.local:2002,rory.local:2003',
        read_preference=ReadPreference.SECONDARY_PREFERRED, connect=False)
connect('irory', alias='default1',
        host='mongodb://rory.local:2001,rory.local:2002,rory.local:2003',
        read_preference=ReadPreference.SECONDARY_PREFERRED, connect=False)

若仅仅只有 default 这个connect,uwsgi 无任何报错,增加了default1 则这个错误出现了。

随后,各种Google,并无好的解决方式。

后来还是要感谢好友 @Danny @Felix 帮忙提示简化uwsgi配置进行尝试,果然有了效果,最后锁定了原因在于uwsgi的两个参数。

reload-on-as : reload if address space is higher than specified megabytes
reload-on-rss : reload if rss memory is higher than specified megabytes

大概意思就是,限制每个uwsgi进程所能使用内存的最大阈值,若超出则会自动重启该进程。

mongoengine connect 链接初始化的在 settings.py 文件中,启动uwsgi会初始化对mongo的连接池,若这两个参数过小,则出现刚启动就超出阈值,进程就会一直强制杀死重启,以致整个uwsgi死掉。

最后,加大了这两个参数阈值,算是愉快的解决了问题。