pm2与go的完美结合
发布于 2 个月前 作者 zengming00 1653 次浏览 来自 分享

最近用go语言重写了一个node的小项目,因为并发量大到两台node也只能勉强扛住的地步,顺便说一下,pm2的cluster模式在极高的并发量下其实不行,不知道为什么,后来用fork模式+node原生的cluster模块才搞定。 因为go重写的版本匆忙上线,测试时我居然用的是screen在后台跑。看了beego关于supervisor部署的介绍,感觉那不是我想要的东西,因为我觉得pm2应该也有这样的功能,于是去查了文档,果然有,测试跑了几天,完全没有问题。配置很简单,与node完美并存

$ cat pm2.config.js 
module.exports = {
    apps: [
        {
            name: "goapp",
            script: "./config.product.json",   // script当成配置文件,在go中通过os.Args[1]获取到
            instances: 1,
            exec_mode: "fork",    // 一定要是fork
            interpreter: "./main",   // windows下加.exe
            env: {              // 环境变量
                myenv: "product",
            },
        }
    ]
}
10 回复

用go重写后,和之前相比性能如何呢

@dengnan123 cpu使用量降低50%+,内存使用量降低80%+ , 同时开发难度也上升了很多,一不小心内存就暴涨挂掉,以前两台node才能勉强扛住现在一台go足够了

淘气奥,不许在这里吹go o( ̄︶ ̄)o

golang123(开源)也是这样玩的哦,pm2管理golang进程 golang123 是使用 vue、nuxt、node.js 和 golang 开发的知识分享系统 https://www.golang123.com Github: https://github.com/shen100/golang123

@zengming00 那准确性能数据来说,别yy

@i5ting 没有yy,实际的数据,两台机对比,左边go右边node,这不是最高峰 image.png 这是最高峰时用单台go测得的qps,用我自己写的https://github.com/zengming00/go-qps放在echo的中间件里统计的 image.png 之前没换go时是两台node,一台挂另一台最多几十秒马上也挂掉,现在一台go足够了。目前是高并发业务用go去做,其它仍然node 下面是pm2的情况,node之所以只有一个是因为pm2的cluster不行我用node的cluster模块去启动的多进程 image.png go版本测试上线时还遇到了内存问题,你也在gopher群,应该有看到

比较好奇go的内存暴涨后为何会迅速挂掉,go的gc应该完善不少了吧

@royalrover 涨到无法申请内存了还不挂掉?物理内存都没了

经过研究,发现其实PM2还可以用更优雅的方式启动任意二进制程序:(参考 https://github.com/Unitech/pm2/issues/471

apps:
  - name: myapp
    interpreter: none
	script: ./main
	args:
	  - ./config.product.json

@leizongmin 好像不能监听内存状况

回到顶部