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