35

我们有一个自定义设置,其中运行了多个守护进程(Web 应用程序 + 后台任务)。我正在考虑使用一种服务来帮助我们监控这些守护进程,并在它们的资源消耗超过一个级别时重新启动它们。

我会很感激任何关于什么时候比另一个更好的见解。据我了解,monit 启动了一个新进程,而 supervisord 启动了一个子进程。这种方法的优缺点是什么?

我还将使用 upstart 来监控 monit 或 supervisord 本身。webapp 部署将使用 capistrano 完成。

谢谢

4

2 回答 2

38

我没有使用过 monit,但 supervisord 存在一些重大缺陷。

  1. 程序应该在前台运行

这意味着您不能只执行 /etc/init.d/apache2 start。大多数情况下,您可以只编写一行代码,例如“source /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND”,但有时您需要自己的包装脚本。包装脚本的问题在于您最终会得到两个进程,一个父进程和一个子进程。看下一个缺陷...

  1. supervisord 不管理子进程

如果您的程序启动子进程,supervisord 不会检测到这一点。如果父进程死亡(或者如果使用 supervisorctl 重新启动),子进程将继续运行,但将被 init 进程“采用”并继续运行。这可能会阻止将来调用您的程序运行或消耗额外的资源。最近的配置选项 stopasgroup 和 killasgroup 应该可以解决这个问题,但对我不起作用。

  1. supervisord 没有依赖管理 - 见#122

我最近用 qlproxy 设置了 squid。qlproxyd 需要先启动,否则 squid 可能会失败。即使这两个程序都由 supervisord 管理,但也无法确保这一点。我需要为 squid 编写一个启动脚本,让它等待 qlproxyd 进程。添加启动脚本导致出现缺陷 2 中描述的孤立进程问题

  1. supervisord 不允许您控制 startretries 之间的延迟

有时当一个进程无法启动(或崩溃)时,这是因为它无法访问另一个资源,可能是由于网络不稳定。可以设置主管多次重启进程。在重新启动之间,该过程将进入“BACKOFF”状态,但没有文档或对回退持续时间的控制。

在其防御主管中,80% 的时间确实满足了我们的需求。配置很合理,文档也很好。

于 2014-12-31T09:09:27.637 回答
31

如果你想额外监控资源,你应该满足于 monit。除了仅检查进程是否正在运行(可用性)之外,monit 还可以执行一些资源使用情况(性能、容量使用情况)、负载级别甚至基本安全检查(二进制文件、配置文件等的 md5sum)。它有一个基于规则的配置,非常容易理解。还有很多现成的配置:http: //mmoni.com/wiki/Monit/ConfigurationExamples

Monit 需要进程来创建 PID 文件,这可能是一个缺陷,因为如果进程不创建 pid 文件,则必须创建一些包装器。请参阅http://mmonit.com/wiki/Monit/FAQ#pidfile

另一方面,Supervisord 更多地绑定到一个进程,它自己产生它。它不能将任何基于资源的检查作为监视器。不过,它有一个不错的 CLIservicectl和一个 Web GUI。

于 2012-10-24T09:55:36.817 回答