最近用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",
},
}
]
}
用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,这不是最高峰 这是最高峰时用单台go测得的qps,用我自己写的https://github.com/zengming00/go-qps放在echo的中间件里统计的 之前没换go时是两台node,一台挂另一台最多几十秒马上也挂掉,现在一台go足够了。目前是高并发业务用go去做,其它仍然node 下面是pm2的情况,node之所以只有一个是因为pm2的cluster不行我用node的cluster模块去启动的多进程 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 好像不能监听内存状况