【问题标题】:uWSGI downtime when restart重启时uWSGI停机时间
【发布时间】:2017-09-11 03:41:17
【问题描述】:

当我有代码更新时,每次我重新启动服务器时都会遇到 uwsgi 问题。

  1. 当我使用“sudo restart accounting”重新启动 uwsgi 时,停止和启动实例之间存在一个小间隙,导致停机并停止所有当前请求。

  2. 当我尝试“sudo reload accounting”时,它可以工作,但我的内存增加了(双倍)。当我运行命令“ps aux | grep accounting”时,它显示我有 10 个正在运行的进程 (accounting.ini) 而不是 5 个,并且当内存达到限制时它会冻结我的服务器。

accounting.ini

我在跑步

  • Ubuntu 14.04
  • Django 1.9
  • nginx 1.4.6
  • uwsgi 2.0.12

【问题讨论】:

  • 除了我的回答,考虑减少进程数,因为您的服务器无法运行 10
  • 我的进程目前有5个。顺便问一下,我应该怎么知道我应该设置多少个进程?我正在运行 4gb RAM 和 15mb 内存。请看这个链接。 pasteboard.co/HIfZxxh.png
  • 我已经用另一个解决方案提议Chain reloads 尝试更新我的答案。

标签: django nginx uwsgi


【解决方案1】:

这就是 uwsgi 如何优雅地重新加载。保留旧进程直到请求得到处理,并创建新的进程来接管传入的请求。

阅读Things that could go wrong

不要忘记,您的工作人员/线程仍在运行请求 可能会阻止重新加载(出于各种原因)超过几秒钟 您的代理服务器可以容忍。

还有这个

优雅重载的另一个重要步骤是避免破坏 仍在管理请求的工作人员/线程。明显要求 可能会卡住,所以你应该有一个运行工人的超时时间(在 uWSGI 它被称为“工人的怜悯”,它的默认值为 60 秒)。

所以我建议尝试worker-reload-mercy

默认值是等待 60 秒,只需将其降低到您的服务器可以处理的时间即可。

告诉我它是否有效。


Uwsgi 链重载

这是解决您问题的又一次尝试。正如您提到的,您的 uwsgi 工作人员正在以下述方式重新启动:

  1. 向主控发送SIGHUP信号
  2. 等待运行工人。
  3. 关闭所有文件描述符,除了映射到套接字的文件描述符。
  4. 自行调用 exec()。

这种重新加载的缺点之一可能是工人卡住了。 另外,您报告说,当 uwsgi 维护 10 个进程(5 个旧进程和 5 个新进程)时,您的服务器崩溃了。

我建议尝试链式重载。文档中的直接引用最好地解释了这种重新加载:

当被触发时,它会每次重启一个worker,并且在前一个worker准备好接受新请求之前不会重新加载下一个worker。

这意味着您的服务器上不会有 10 个进程,而只有 5 个。

应该工作的配置:

# your .ini file
lazy-apps = true
touch-chain-reload = /path/to/reloadFile

关于链式重载和其他类型的一些资源在下面的链接中:

Chain reloading uwsgi docs

uWSGI graceful Python code deploy

【讨论】:

  • 嗨,卡米尔。再次感谢你。对此,我真的非常感激。好的,我会让你知道它成功了。
  • 我更新了我的 .ini 文件。但是当我重新加载时,这个过程仍然加倍。我等了几分钟,但旧进程仍在占用内存。 pasteboard.co/HIgQGLp.pngpasteboard.co/HIgRMWQ.png
  • @aldesabido 我没有看到你在ini 文件中设置了worker-reload-mercy。您的服务需要多少流量?你能告诉我一些关于请求响应时间的统计数据吗?
  • 如果你说响应时间是指加载页面需要多长时间?或在每个页面请求中。有时系统速度很快,但随着流量增加而变慢。
  • 我应该增加我的硬件规格以增加进程/工人的数量吗?
猜你喜欢
  • 1970-01-01
  • 2019-03-31
  • 2022-08-22
  • 1970-01-01
  • 2021-03-10
  • 2014-12-02
  • 2015-09-02
  • 2020-11-10
  • 2023-03-10
相关资源
最近更新 更多