【问题标题】:Have Supervisord Periodically restart child processes让 Supervisord 定期重启子进程
【发布时间】:2012-09-24 18:51:49
【问题描述】:

我在 ubuntu 12.04 上使用 Supervisor (3.0a12) 来管理 php gearman 工作人员。有时工人会陷入一种奇怪的状态,他们使用大量的 CPU 和内存。当我在解决这个问题时,我认为让 Supervisor 偶尔自动杀死和刷新工作人员会很好。我查看了http://supervisord.org/configuration.html 配置文档,似乎没有看到任何允许这样做的选项。

有谁知道是否可以让 supervisord 定期重启它管理的所有进程?

【问题讨论】:

    标签: php python gearman supervisord


    【解决方案1】:

    您可以使用 crontab 将命令直接传递给 supervisorctl。例如,以下将每 20 分钟重新启动一个进程。

    0,20,40 * * * * /path/to/supervisorctl restart [supervisor_process]
    

    【讨论】:

    • 这将重新启动进程,但我怀疑它也会杀死可能正在运行的正常进程,因此可能会导致数据丢失。 (例如,工作进程不仅仅是无状态应用程序)
    • 进程死亡的原因有很多:对意外重启保持健壮是很重要的。所以如果这个策略会导致数据丢失,那就是一个bug,无论使用cron来实现这个是不是正确的解决方案。
    • 我投了反对票,如果 supervisorctl 失败了怎么办?什么会重新启动它?该应用程序可以永远保持卸载状态。为什么不包含在 supervisord 中?
    【解决方案2】:

    superlance package 为主管提供memmon pluginmemmon 监控主管控制下的程序的内存使用情况。

    您将memmon 配置为主管事件监听器:

    [eventlistener:memmon]
    command=memmon -a 200MB
    events=TICK_60
    

    如果内存使用量超过 200MB,上述配置将 memmon 设置为在主管控制下重新启动 any 程序。它每 60 秒检查一次。

    您可以配置 memmon 来监控特定程序或程序组,并为每个程序设置限制。

    【讨论】:

    • 如果我使用的主管使用诸如“xvfb-run”之类的进程来启动另一个进程,比如xul runner,那么memmon是否只记录xvfb正在使用的内存,或者所有的孩子进程?
    • 我相信它只会监控直接子进程。手册指出:memmon 无法监控非supervisord 子进程的进程状态。 xul runner 不是 supervisord 的孩子,而是 xvfb-run 的孩子。
    • memmon codebase 的快速扫描显示它通过 RPC 查询 supervisord 以获取正在管理的程序列表,并直接查看 pid。我猜你也必须扩展它来查看这些 pid 的子进程。
    • 我想我找到了一个针对 memmon 的拉取请求来解决这个问题?它声明它将跟踪“进程树”。 github.com/Supervisor/superlance/issues/21
    • 源代码跟踪每个 PID 的内存,它不会跨多个 PID 累积内存。
    【解决方案3】:

    有一个简单的仅限主管的解决方案。让另一个主管进程休眠适当的时间,然后重新启动您想要的进程。

    [program:my_program]
    process_name = python something.py
    
    [program:periodicrestarter]
    command = sh -c "echo 'restart my_program' | supervisorctl;sleep 600"
    ; restarts all (sleeps first because this restarts itself):
    ;command = sh -c "sleep 600; echo 'restart all' | supervisorctl"
    autorestart = true
    

    【讨论】:

    • 当重启的唯一原因不是高内存使用率时,这是公认答案的一个很好的选择。
    • 只是一个简短的说明 - 'restart all' 也会重新启动 periodrestarter 本身,因此可能无法按预期工作。
    猜你喜欢
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    • 2019-12-07
    • 2013-09-26
    • 2015-07-30
    • 2011-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多