现象:

pm2占用CPU达到100%,但是pm2管理的进程占用的CPU在50%-60%,从而导致pm2分发成为性能瓶颈;

因为nodejs测试代码结构很简单,处理请求的速度过快,从而导致当pm2管理的子进程达到CPU使用率50%-60%的时候,PM2占用的CPU就达到100%了,发送的请求pm2进程就转发不过来了。

服务器说明:

CPU:32核

内存:64G

pm2集群启动实例配置:

[root@elk-sdzx express_example]# cat /opt/shell/process.json

{

apps : [{

name : "express_example",

cwd : "/www/express_example",

script : "./bin/www",

instances : 32,

exec_mode : "cluster",

log_type : "json",

error_file : "/www/pm2_run/log/express_example-err.log",

out_file : "/www/pm2_run/log/express_example-out.log",

combine_logs: true,

max_memory_restart : "512M",

pid_file : "/www/pm2_run/pid/express_example.pid",

env : {

"NODE_ENV": "production",

"PORT": 8080

},

watch : false

}]

}

压测命令:

ab -c 30 -n 500000 http://127.0.0.1:8080/

ab -c 36 -n 500000 http://127.0.0.1:8080/

ab -c 40 -n 500000 http://127.0.0.1:8080/

并发为40的时候pm2的CPU就100%了。

解决办法:

降低单个nodejs进程的请求处理速度,把原来循环100次改成了1000次。

理解分析总结:

其实pm2进程和它管理的业务进程性能是相对的,这里的nodejs代码只是为了测试nodejs性能而写的,没有调用任何其他http接口或者第三方接口及中间件,导致单个nodejs进程处理请求的速度很快,从而容易造成pm2进程变成性能瓶颈。而相反的,如果降低了nodejs进程的请求处理速度,那么相对的,pm2转发请求的速度就会造成nodejs进程跑满CPU,而即使所有的nodejs进程都跑满了CPU,但pm2进程依然没有跑满CPU。

以下为计算示例:

示例1:

假设pm2进程每秒转发10W个请求是上限,这个时候其CPU使用率会达到100%;

每个nodejs进程每秒处理10000个请求是上限,这个时候其CPU使用率达到100%;

场景:

启动32个nodejs进程,也就是说每秒最多处理320000个请求可以把机器的32颗CPU都跑到100%;但是,在这种情况下,pm2会率先占满CPU称为性能瓶颈,从而导致nodejs进程始终跑不满CPU。

计算如下:

当pm2跑满CPU时,转发请求的速度为100000/s;

基于轮询负载均衡算法,算出:每个nodejs进程由pm2分配请求的速度为3125/s。所以每个nodejs占用的CPU为3125/10000=31.25%左右。从而无论怎么增加压测并发和请求数,nodejs的CPU也是压不上去的。

示例2:

假设pm2进程每秒转发10W个请求是上限,这个时候其CPU使用率会达到100%;

每个nodejs进程每秒处理1000个请求是上限,这个时候其CPU使用率达到100%;

场景:

启动32个nodejs进程,也就是说每秒最多处理32000个请求可以把机器的32颗CPU都跑到100%;但是,在这种情况下,nodejs进程所占用的CPU会率先成为性能瓶颈。

计算如下:

当32的nodejs进程都跑满CPU时,处理请求的速度为32000/s;

此时,pm2进程占用的CPU使用率为32000/100000=32%左右,也就是说这个时候nodejs代码成了性能瓶颈。pm2的CPU使用率最大也就32%左右;

pm2自身成为性能瓶颈相关推荐

  1. nodejs pm2使用

    pm2特点 1.简单方便,部署快. 2.解决nodejs单线程缺点 3.完善的日志 pm2安装及使用 1.安装 npm install -g pm2 2.启动 查看版本 pm2 start app.j ...

  2. 动态执行流程分析和性能瓶颈分析的利器——gperftools的Cpu Profiler

    在<动态执行流程分析和性能瓶颈分析的利器--valgrind的callgrind>中,我们领略了valgrind对流程和性能瓶颈分析的强大能力.本文将介绍拥有相似能力的gperftools ...

  3. 动态执行流程分析和性能瓶颈分析的利器——valgrind的callgrind

    在<内存.性能问题分析的利器--valgrind>一文中我们简单介绍了下valgrind工具集,本文将使用callgrind工具进行动态执行流程分析和性能瓶颈分析.(转载请指明出于brea ...

  4. 线性回归预测PM2.5值

    文章目录 一.问题描述 二.设计简要描述 三.程序清单 四.结果分析 五.调试报告 六.实验总结 一.问题描述 希望用线性回归解决问题: 给定某个地区连续9小时包括PM2.5在内的18项污染物每小时的 ...

  5. 系统、应用监控的缜密思路,性能瓶颈的克星

    欢迎关注方志朋的博客,回复"666"获面试宝典 在实际的性能分析中,一个很常见的现象是,明明发生了性能瓶颈,但当你登录到服务器中想要排查的时候,却发现瓶颈已经消失了.或者说,性能问 ...

  6. 标量子查询产生的SQL性能瓶颈,该怎么合理优化?

    来自:DBAplus社群 作者介绍 郝昊喆,新炬网络数据库专家.擅长数据库方面的开发.整体架构及复杂SQL的调优,参与了多个行业核心系统的优化工作,目前专注于对开源技术.自动化运维和性能调优技术的研究 ...

  7. 深度学习时间序列预测:卷积神经网络(CNN)算法构建单变量时间序列预测模型预测空气质量(PM2.5)+代码实战

    深度学习时间序列预测:卷积神经网络(CNN)算法构建单变量时间序列预测模型预测空气质量(PM2.5)+代码实战 神经网络(neual networks)是人工智能研究领域的一部分,当前最流行的神经网络 ...

  8. 深度学习时间序列预测:LSTM算法构建时间序列单变量模型预测空气质量(PM2.5)+代码实战

    深度学习时间序列预测:LSTM算法构建时间序列单变量模型预测空气质量(PM2.5)+代码实战 # 导入需要的包和函数: from __future__ import print_function im ...

  9. Nodejs教程30(完结):PM2入门

    系列文章请访问我的GitHub博客,示例代码请访问这里. PM2简介 PM2是常用的node进程管理工具,它可以提供node.js应用管理,如自动重载.性能监控.负载均衡等.同类工具有Supervis ...

最新文章

  1. iOS APP提交上架最新流程
  2. 看不见的攻击面:查看 SQLite 数据库就中招?
  3. Oracle 11g新特性之--虚拟列(Virtual Column)
  4. Java反射是什么?看这篇绝对会了!
  5. 【css】怎么让Chrome支持小于12px 的文字
  6. 如何系统学习机器学习?
  7. linux 性能监视命令
  8. 超详细!一文告诉你 SparkStreaming 如何整合 Kafka !附代码可实践
  9. Centos7.2 域名解析 /etc/resolv.conf 被覆盖
  10. UVAPOJ离散概率与数学期望入门练习[4]
  11. Java语言中几个常用的包
  12. 计算机专业为什么要学线性代数,为什么要学线性代数
  13. 周志华《机器学习》习题3.4——用UCI数据集比较10折交叉验证法和留一法
  14. 高中计算机会考教案,高中信息技术会考模拟试题讲课教案.pdf
  15. 原生js 实现小人吃豆豆小游戏
  16. 初探Linux--鸟哥私房菜读书笔记
  17. 《苏菲的世界》读书笔记之一:自然派哲学家
  18. TB6612FNG与直流电机控制教程
  19. Android网络编程基础(第一弹)
  20. htmla标签下划线去除_html超链接的下划线怎么去掉?a标签去下划线的方法都在这里...

热门文章

  1. 投影仪的裸眼3D效果
  2. Android内存泄漏分析及检测工具LeakCanary简介,androidui库
  3. 数据库的唯一标示符(ID)的选择
  4. 微信小程序团队开发项目环境准备以及版本管理工具的基本使用
  5. Intel Parallel Studio XE Cluster Edition 2020 Linux
  6. MOS管发热原因-总结有4大关键技术原因解析
  7. speedoffice如何设置首字下沉效果
  8. 休闲食品市场哪些品类值得投资?详细分析
  9. java求pi_java计算PI后面的100位小数点
  10. 画册设计应该注意哪些点