pm2与go的完美结合
发布于 6 年前 作者 zengming00 12259 次浏览 来自 分享

最近用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",
            },
        }
    ]
}
18 回复

用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 好像不能监听内存状况

@243011068 通过pm2 monit 确实无法试试查看内存

nodejs的未来就非常尴尬了

fibjs重写一下

go的生态圈有node那么繁荣的话肯定早取代了 毕竟自己造轮子gorutinue使用不恰当是容易爆内存的 另外使用array、slice也比较讲究

@yuu2lee4 fibjs 理念可以,生态确实不行~
V8 现在也在优化。 多核其实可以考虑开启多个docker ~

@youth7 脚本语言跟 golang 比,本身就有失偏颇。 这个程度觉得可以了。 多核再用 docker 。 再稍微优化下,找性能瓶颈,必要的时候用C++ 实现

请问你linux下用的任务管理器是什么命令的?能图形化看每个核心的CPU占用率

把go编译成二进制,直接pm2 start main ,我看默认的模式就是fork,不知道会不会有问题:)

──┬────────────────────┬──────────┬──────┬───────────┬──────────┬──────┐
│ id │ name               │ mode     │ ↺    │ status    │ cpu      │ memory   │
├────┼────────────────────┼──────────┼──────┼───────────┼──────────┼─────┤
│ 1  │ main               │ fork     │ 0    │ online    │ 0%       │ 24.5mb 
回到顶部