这就是 uwsgi 优雅地重新加载的方式。保留旧进程,直到请求得到服务为止,并创建新进程来接管传入请求。
Read 可能出错的事情 https://uwsgi-docs.readthedocs.io/en/latest/articles/TheArtOfGracefulReloading.html#things-go-wrong
不要忘记,您的工作人员/线程仍在运行请求
可能会阻止重新加载(由于各种原因)超过几秒
您的代理服务器可以容忍。
And this
优雅重载的另一个重要步骤是避免破坏
仍在管理请求的工作人员/线程。明显要求
可能会被卡住,所以你应该有一个运行工人的超时(在
uWSGI被称为“工人的怜悯”,它的默认值为
60 秒)。
所以我建议尝试工人重载怜悯 https://uwsgi-docs.readthedocs.io/en/latest/Options.html?highlight=mercy#worker-reload-mercy
默认值是等待 60 秒,只需将其降低到服务器可以处理的值即可。
告诉我是否有效。
Uwsgi链重新加载
这是解决您的问题的另一次尝试。正如您提到的,您的 uwsgi 工作人员正在以下述方式重新启动:
- send
SIGHUP
向主人发出信号
- 等待正在运行的工人。
- 关闭除映射到套接字的文件描述符之外的所有文件描述符。
- 对自身调用 exec()。
这种重新加载的缺点之一可能是工作人员被卡住。
此外,您报告说,当 uwsgi 维护 10 个进程(5 个旧进程和 5 个新进程)时,您的服务器崩溃。
我建议尝试链条重新加载。文档中的直接引用解释了这种重新加载的最佳方式:
当触发时,它会一次重启一名工人,并且直到前一个工作人员准备好接受新请求之前,不会重新加载后面的工作人员。
这意味着您的服务器上不会有 10 个进程,而是只有 5 个。
应该有效的配置:
# your .ini file
lazy-apps = true
touch-chain-reload = /path/to/reloadFile
有关链重载和其他类型的一些资源位于以下链接中:
链重载 uwsgi 文档 https://uwsgi-docs.readthedocs.io/en/latest/articles/TheArtOfGracefulReloading.html?highlight=chain#chain-reloading-lazy-apps
uWSGI 优雅的Python代码部署 http://zarnovican.github.io/2016/02/15/uwsgi-graceful-reload/#pre-fork-vs-lazy-app