一、重要概念
- 平均负载:单位时间内,系统中处于可运行状态和不可中断状态的平均进程数。
- 可运行状态的进程:正在使用cpu或者正在等待cpu的进程,即ps aux命令下STAT处于R状态的进程
- 不可中断状态的进程:处于内核态关键流程中的进程,且不可被打断,如等待硬件设备IO响应,ps命令D状态的进程
二、相关命令
- 查看cpu核数:
lscpu
、grep 'model name' /proc/cpuinfo | wc -l
- 显示平均负载:
uptime
、top
,显示的顺序是最近1分钟、5分钟、15分钟,从此可以看出平均负载的趋势 watch -d uptime
:-d
会高亮显示变化的区域strees
: 压测命令,--cpu
cpu压测选项,-i
io压测选项,-c
进程数压测选项,--timeout
执行时间,使用方法如下:
stress --cpu 1 --timeout 600 #cpu密集型
stress -i 1 --timeout 600 #io密集型
stress -c 8 --timeout 600 #大量进程
stress-ng
升级版的stress
,使用方法如下:
stress-ng -i 1 --hdd 1 --timeout 600 #io密集型(针对新机器无法使用stress提升iowait的情况)
mpstat
: 多核cpu性能分析工具,-P
ALL监视所有cpupidstat
: 进程性能分析工具,-u
显示cpu利用率
三、平均负载与cpu使用率的区别
- CPU使用率:单位时间内cpu繁忙情况的统计
情况1:CPU密集型进程,CPU使用率和平均负载基本一致
情况2:IO密集型进程,平均负载升高,CPU使用率不一定升高
情况3:大量等待CPU的进程调度,平均负载升高,CPU使用率也升高
四、案例
工具:stress
、sysstat
,yum或apt即可安装(版本存在差异)
CPU密集型进程案例:
- 运行压测工具
stress --cpu 1 --timeout 600
- 检查cpu状态
mpstat -P ALL 5
-P ALL
表示监控所有CPU
5
表示每5
秒刷新一次数据,观察是否有某个cpu的%usr会很高,但iowait很低
- 追踪具体进程
pidstat -u 5 1
每5秒输出一组数据,观察哪个进程%cpu很高,但是%wait很低,极有可能就是这个进程导致cpu飚高
IO密集型进程案例
- 使用压测工具
stress -i 1 --timeout 600
- 检查cpu状态
mpstat -P ALL 5
观察是否有某个cpu的%iowait很高,同时%usr也较高
- 追踪具体进程
pidstat -u 5 1
观察哪个进程%wait较高,同时%CPU也较高
大量进程案例:
- 使用压测工具
stress -c 8 --timeout 600
- 追踪具体进程
pidstat -u 5 1
观察那些%wait较高的进程是否有很多
五、总结
- 平均负载高有可能是 CPU 密集型进程导致的;
- 平均负载高并不一定代表 CPU 使用率高,还有可能是 I/O 更繁忙了;
- 当发现负载高的时候,你可以使用 mpstat、pidstat 等工具,辅助分析负载的来源
- 理想状态:每个cpu上都有一个活跃进程,即平均负载数等于cpu数
- 过载经验值:平均负载高于cpu数量70%的时候
- 低版本pidstat不显示%wait例,需要源码安装