首页 > 系统相关 >go进程管理工具Pmon2实践

go进程管理工具Pmon2实践

时间:2023-01-09 14:57:06浏览次数:68  
标签:systemd Pmon2 nginx 管理工具 进程 go pmon2

360导航团队使用 go 语言开发 web 服务时间也比较早,对于 go 服务的进程管理工具的选择上也做了很多尝试。

go 官方并没有提供任何进程管理工具供大家使用,所以我们往往部署线上的 go 服务时会借助其他工具。常用的方式无非是如下这几种:

  1. nohup + &
  2. 系统内置常驻进程管理工具(initsystemd
  3. 第三方开源工具(supervisorpm2monit等)
  4. 自研(pmon2

1. nohup + &

nohup 结合 & 符号双剑合璧,估计是我们经常使用的启动常驻进程(daemon)的选择方式。它的优势在于,使用超级简单。

# 启动 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 打印结果如下:

systemd(1)───supervisord(22443)───test(22472)───{test}(22473,22472)

我们会发觉我们管理的 test 进程其父进程为 supervisord ,而非直接指向 linux 的 init 1号进程。

如果有用过 systemd 进程管理工具经验的朋友,你会发觉,当一个进程启动后,这个进程的父进程会交给 init 进程托管。不妨看看 systemd 托管的 nginx 进程:

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 这款进程管理工具应运而生,快速使用命令如下:

sudo pmon2 run [./二进制进程文件] [参数1]  ...

Pmon2 基于 go 语言实现,线上部署只需要部署编译后的二进制文件即可,不再需要其他依赖。目前也提供 rpm 包可直接使用 yum 安装一键部署:

sudo yum install -y pmon2

类似 systemd 进程管理工具, pmon2 管理的进程本身脱离 pmon2 进程管理工具本身,因此不会产生因 pmon2 进程异常崩溃而造成的连带影响。

并且, pmon2 提供了优雅的进程管理界面,用以提升用户使用体验。对于公司内部使用项目来说, pmon2 未来规划中还希望提供集成公司 odin 平台自动报警实现。

对于 pmon2 具体详细使用说明,请参考:https://github.com/ntt360/pmon2 欢迎大家拍砖!

标签:systemd,Pmon2,nginx,管理工具,进程,go,pmon2
From: https://www.cnblogs.com/lidabo/p/17037051.html

相关文章

  • 使用pm2管理go应用进程
    pm2是一个进程管理工具,可以用它来管理你的node进程,并查看node进程的状态,当然也支持性能监控,进程守护,负载均衡等功能,在前端和nodejs的世界中用的很多。但是pm2强大之处不......
  • pm2与go的完美结合(转)
    最近用go语言重写了一个node的小项目,因为并发量大到两台node也只能勉强扛住的地步,顺便说一下,pm2的cluster模式在极高的并发量下其实不行,不知道为什么,后来用fork模式+node原......
  • Egon推荐零基础转行IT全套精品课程
    1、python全栈高级项目开发精品课程如下,适用于零基础小白自学入行python开发、在职工程师高级提升,详情请咨询唯一指定微信tutu191920102、linux高级云算计课程(80%都是Ego......
  • 管理工具造成的阻塞
    背景上午10点50分左右,客户接到SQL专家云的告警短信,数据库发生了严重的阻塞,登录到SQL专家云中发现阻塞的源头是SQLServerManagementStudio,KILL掉该会话后解决。但是不理......
  • (5)go-micro微服务domain层开发
    目录一domain层介绍说明二model层开发三repository层开发四service层开发五最后一domain层介绍说明domain层专注于数据库数据领域开发,我们把数据库相关操作全部......
  • 让 Java Agent 在 Dragonwell 上更好用
    本文是《容器中的Java》系列文章之3/n,欢迎关注后续连载 ......
  • Go语言学习Day3
    1.go的函数定义格式为函数名,参数列表,返回值列表和函数体。如果函数没有返回值,则返回列表可以省略。函数从第一条语句开始执行,直到执行return语句或者执行函数的最后一条语......
  • django_博客练习(文章详情/点赞/评论)
    文章详情页渲染文章内容侧边栏有分类显示通过设置路由的方式传递参数文章id作者用户名文章是通过文章对象渲染到前端的,所以你点击文章时也可以告诉后端你点击的是哪......
  • go语言环境配置(windous)
    1.下载go语言安装包:https://golang.google.cn/dl/2.配置环境变量:GOBIN:项目bin目录 GOPATH:项目目录(src下)GOROOT(go的环境变量)GOROOT,Go解释器安装路径,用于之后去调用g......
  • (转)Go test 详解
    原文:https://www.jianshu.com/p/b28595a281ecGotest的测试用例形式测试用例有四种形式:TestXxxx(t*testing.T)//基本测试用例BenchmarkXxxx(b*testing.B)//......