Docker容器内多进程管理——supervisor VS monit

前面简单介绍了Docker容器内多进程管理的两个组件,supervisor和monit,现在我们来对比一下这两个组件的优缺点。

supervisor

优点:

  1. 轻量、特性丰富、内存友好(好客套的优点。。。)
  2. 对被监控进程的状态获取迅速且精确——通过子进程管理,没办法不精确

缺点:

  1. 被监控进程必须运行在前台(可以理解为有自己的控制终端)——这也是最为致命的一点
  2. 无法管理依赖,也就是说无法控制服务启动先后顺序
  3. 无法管理被监控进程创建的子进程——重启服务时被监控进程的子进程无法正常退出,隐患大
  4. 无法控制进程失败重试的间隔时间——有些进程需要清理资源,不过这点还好

monit

优点:

  1. 安装配置简单,同样轻量(似乎也是很客套了)
  2. 可以监控前台进程和非前台进程——完美的弥补了supervisor的致命缺点
  3. 除了监控进程还能监控文件、文件系统,甚至系统资源,CPU利用率,内存使用也是可以的
  4. 被监控的进程可以设置依赖,控制启动顺序

缺点:

  1. 无法监控没有pid文件的进程,如shell脚本
  2. 对进程监控的状态感知有延时,即精度不够——采用轮训决定了它无法像supervisor一样实时感知被监控进程状态

这样看起来还是monit更为普适一点。

不过这催生了一个大胆的想法,使用supervisor管理容器内多进程,monit作为一个被监控进程挂在supervisor之下。这样对于无法前台运行的程序,就可以通过monit监控,而对服务中断感知强烈的则直接挂在supervisor之下。看起来似乎是个好办法,有机会试试,哈哈哈。

从实际容器中运行的表现看,monit经常出现各种未知异常,而supervisor表现得十分稳定。


参考资料:
1、https://www.pixelstech.net/article/1511631611-Supervisord-God-and-Monit-which-one-to-choose
2、https://stackoverflow.com/questions/12156434/what-is-the-advantage-of-using-supervisord-over-monit

你可能感兴趣的:(Docker)