pm2单个实例和多个实例的区别探索
本文主要记录一次探索 pm2 单个实例和多实例的过程和验证结果。也遗留了问题,大佬们有解决办法的希望分享给我一下。
背景
前段时间遇到了一个问题:
服务器运行一切正常,CPU 使用率和内存使用率都比较低,但是当某一个 Node.js SSR 工程并发高量时,工程的整体性能会变差,也就是同样的请求,服务器处理时间会更久,但其实并发量对于服务器来说,压力仍然很小。
思路
这个问题最后也没有解决,但是也有了一些思路:
- 注意代码细节,不要在 Node.js 服务执行特别耗费性能的功能,但这是一个很被动方法,难以排查和解决;
- 服务器的压力小,那么是否可以利用服务器的性能,让 Node.js 服务更加稳定?
第一种思路可以对现有核心代码实现进行排查,也可以调整渲染方式来优化性能,比如让页面尽量静态化的方案。
第二种思路出现了一个想法:
node 服务是用 pm2 启动的,我们服务器上使用一个 pm2 运行了多个 SSR 工程,是不是相互之间也会有一些影响?毕竟 pm2 cluster 模式也只有一个主进程来管理多个项目的多个进程。那么如果有多个 cluster 来管理会不会可以更多的利用服务器资源,来让 nodejs 中每个进程更稳定?
单个 pm2 管理模型(一对多):
多个 pm2 管理模型(一对一):
测试验证
测试对照条件:请求并发量、pm2 启动方式(一对多,还是一对一) 测试主要记录数据点:
- 请求响应时间
- nodejs 所在服务器的吞吐量、服务器CPU、内存资源
- nodejs 进程CPU、内存使用情况、eventloop
然后经过了多轮测试(具体数据不好拿出来),得出的结果却是:
- 不管是单
一对多
还是多一对一
,两个工程相互不会直接影响,只会间接性受到服务器性能的影响,且影响很小; - 失败率(502 bad getway)随着吞吐量的提升而提升;
- 正常吞吐量情况下,两种方式的性能无明显差别;
- 较高吞吐量情况下,
一对一
方式服务器 CPU 使用率更高一些(不明显),性能表现比一对多
方式会更差一些(也不是很明显),猜测是机器 cpu 使用率会影响性能表现; - 接近极限吞吐量情况下,
一对一
方式的吞吐量比一对多
方式的吞吐量高一些,但失败率明显也比一对多
方式高出不少,除去失败情况下,吞吐量相差并不大,反而服务器 CPU 使用率也更高一些。 - 并发请求量突破一定值时,服务器吞吐量可能会变得更低,但服务器 cpu 使用率也不会跑到100%,一般在90%左右会达到一个上限。
结论和多 pm2 启动的方式
因此可以从测试的结果推断出一个结论:启动多个 pm2 来管理多个项目,基本上没啥必要,并发量还有性能更多的与服务器自身的性能有关。
不过还是分享一下多个 pm2 启动的方式(多 pm2 启动的代码,这个官方文档上有,但是感觉并不太好找):
PM2_HOME='/**/.pm2' pm2 start ecosystem.config.js
就是加了一个 PM2_HOME='/**/.pm2'
前缀,如果是在当前工程启动,且该实例只服务于本工程,那么可以直接写成 PM2_HOME='.pm2'
,这样就会在当前工程目录下生成一个 .pm2 文件夹,并以后都可以使用它。
结语
最后还是没有解决实际问题,虽然说并没有太大影响,也在使用调整页面渲染等方式来改进页面性能,但还是希望有经验的伙伴们可以分享一下经验,或者有想法的也可以讨论交流一下。