go进程管理工具Pmon2实践

apptut · · 2515 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

![](http://p0.qhimg.com/t017d6cbb68aed4b693.png) [360导航团队](https://hao.360.com)使用 `go` 语言开发 `web` 服务时间也比较早,对于 `go` 服务的进程管理工具的选择上也做了很多尝试。 `go` 官方并没有提供任何进程管理工具供大家使用,所以我们往往部署线上的 `go` 服务时会借助其他工具。常用的方式无非是如下这几种: 1. `nohup + &` 2. 系统内置常驻进程管理工具(`init`,`systemd`) 3. 第三方开源工具(`supervisor`,`pm2`,`monit`等) 4. 自研([pmon2](https://github.com/ntt360/pmon2)) ## 1. nohup + & `nohup` 结合 `&` 符号双剑合璧,估计是我们经常使用的启动常驻进程(`daemon`)的选择方式。它的优势在于,使用超级简单。 ```bash # 启动 app 进程 nohup bin/app >/tmp/app.daemon.log 2>&1 & ``` 但低成本的使用,往往也给我们增加了后期维护的成本;比如,如果通过它启动的进程异常退出时,如何重启? 因此,如果使用这种方式启动进程,我们或许还会增加一个 `crontab` 定时任务,来定期检测进程是否正常运行,如果进程异常,则尝试重启。 但 `linux` 内置 `crontab` 最小粒度是分钟级别,也就是说如果你使用这种方式,就需要忍受服务至少会有分钟级别的不可用状态。或者,自己实现一个 `crontab` 服务。(感觉这条巷子,越走越深) 因此,在线上环境时不推荐这种方式,但在开发环境或者临时调试程序时,可以使用这种便捷方式。 ## 2. 系统级进程管理工具 对于 `linux` 操作系统都提供了系统级别的进程管理工具,例如: `CentOS6` 的 `init.d` 脚本或 `initctl` ; `CentOS7` 开始的 `systemd` 进程管理工具。 利用系统进程管理工具确实很便利,而且这些系统管理工具启动的进程是真正意义的常驻进程,即进程的父进程不再是这些进程管理工具而是由 `init` 进程接管。因此,就算是进程管理工具本身异常退出,也不会影响所启动的业务进程本身。 使用这种方式的唯一不足的是,需要开发不同操作系统对应的进程部署脚本,有一定的开发工作量。 且不同系统的进程管理操作方式也不一样,有一定的学习成本。 ## 3. 第三方进程管理工具 第三方比较出众的进程管理工具也比较多,比如 `supervisor` 、 `pm2` 、 `monit` 等,这些进程管理工具都可以直接胜任 `go` 服务二进制文件管理工作,应该有很多团队也在使用。但使用第三方工具也并非十全十美,会面临如下一些问题: 1. 第三方软件环境部署,对线上环境有侵入性(尚能接受)。 2. 进程管理使用 `fork()` 方式,存在服务不可用风险。 3. 进程管理使用体验问题。 安装第三方软件,确实对线上环境有一定侵入性,如果你想用 `supervisor` 那系统就得安装 `python` ,如果想选择 `pm2` 那就得装个 `node` 环境。不过好在 `linux` 都有包管理工具帮我们来决绝这些环境的快速安装问题,所以这一点,目前来说尚能接受。 其次,就是这些进程管理工具启动的进程使用的是 `fork()` 子进程方式,拿 `supervisor` 举例来说,当我们运行一个进程后,使用 `pstree` 打印结果如下: ```bash systemd(1)───supervisord(22443)───test(22472)───{test}(22473,22472) ``` 我们会发觉我们管理的 `test` 进程其父进程为 `supervisord` ,而非直接指向 `linux` 的 `init` 1号进程。 如果有用过 `systemd` 进程管理工具经验的朋友,你会发觉,当一个进程启动后,这个进程的父进程会交给 `init` 进程托管。不妨看看 `systemd` 托管的 `nginx` 进程: ```bash ps -ef | grep nginx root 21626 1 0 Jul07 ? 00:00:18 nginx: master process /usr/local/nginx/sbin/nginx nobody 29148 21626 0 Aug12 ? 00:00:10 nginx: worker process nobody 29149 21626 0 Aug12 ? 00:00:35 nginx: worker process ``` 你会发觉, `nginx` 的父进程 `id` 竟然是为 1,而不是 `systemd` 的进程ID. 这样做的好处在于,就算是 `systemd` 进程管理工具异常挂掉,也不会致使业务进程受到牵连。 此外,就用户使用体验来说,这些进程管理工具中 `pm2` 体验是最好的,它提供高大上的进程管理界面,当你用过 `pm2` 工具后,再看其他进程管理工具,你会有一种:"曾经沧海难为水" 的感觉。 ## 4. Pmon2 诞生 分析了如上集中进程管理方式优缺点,我们打算自己实现一个进程管理工具,有如下几个目标: 1. 部署简单,减少的线上环境侵入性。 2. 进程由 `init` 直接托管,脱离进程管理工具,规避进程连带影响。 3. 优雅的用户体验。 基于上述三点目标,于是 `Pmon2` 这款进程管理工具应运而生,快速使用命令如下: ```bash sudo pmon2 run [./二进制进程文件] [参数1] ... ``` `Pmon2` 基于 `go` 语言实现,线上部署只需要部署编译后的二进制文件即可,不再需要其他依赖。目前也提供 `rpm` 包可直接使用 `yum` 安装一键部署: ```bash sudo yum install -y pmon2 ``` 类似 `systemd` 进程管理工具, `pmon2` 管理的进程本身脱离 `pmon2` 进程管理工具本身,因此不会产生因 `pmon2` 进程异常崩溃而造成的连带影响。 并且, `pmon2` 提供了优雅的进程管理界面,用以提升用户使用体验。对于公司内部使用项目来说, `pmon2` 未来规划中还希望提供集成公司 `odin` 平台自动报警实现。 对于 `pmon2` 具体详细使用说明,请参考:[https://github.com/ntt360/pmon2](https://github.com/ntt360/pmon2) 欢迎大家拍砖!

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2515 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传