uWSGI worker 卡住了:为什么

uWSGI workers stuck: why

我正在使用具有以下配置的 uwsgi 版本 2.0.13.1:

bin/uwsgi  -M -p 5 -C -A 4 -m -b 8192 -s :3031 --wsgi-file bin/django.wsgi --pidfile var/run/uwsgi.pid --touch-reload=var/run/reload-uwsgi.touch --max-requests=1000 --reload-on-rss=450 --py-tracebacker var/run/pytrace --auto-procname --stats 127.0.0.1:3040 --threads 40 --reload-mercy 600 --listen 200

(绝对路径名截断)

当我运行uwsgitop时,5个工人都显示为忙碌。当我尝试使用 py-tracebacker 获取每个工作线程/线程的堆栈跟踪时,我没有得到任何答案。进程只是挂起。

我如何研究导致 uwsgi 进程挂起的确切事实?

我怎样才能避免这种情况?

我知道 harakiri 参数,但我不确定如果进程有其他活动线程是否会被终止。

PD:"reload mercy" 设置为一个非常高的值,避免杀死具有仍然活动线程的工作人员(似乎是一个错误)。我们有一些 Web 请求仍然需要很长时间(正在转换为作业)。

提前致谢。

虽然我已经添加了评论,但这里有更长的描述。

警告:仅当使用多个工作进程和多个线程 (-p --threads) 时才会出现此问题。

简短版本:在 Python 2.7.x 中,某些模块在导入期间不是 100% 线程安全的(日志记录、编解码器的隐式导入)。尝试在提供给 uwsgi 的 wsgi 文件中导入所有此类有问题的模块(即,在 uwsgi 分叉之前)。

长版:在 https://github.com/unbit/uwsgi/issues/1599 I analysed the problem and found that it could be related to python bug with the logging module 中。在执行给 uwsgi 的 wsgi 脚本之后发生的 uwsgi 分叉之前导入和初始化任何关键模块可以解决这个问题。

我终于解决了直接或间接从 wsgi 文件导入 django settings.ROOT_URLCONF 的问题。这还有减少内存消耗(因为工作人员之间共享的代码库更大)和每个工作人员初始化时间的好处。