预先安装stress和sysstat,如apt install stress sysstat
strees是linux压力测试工具,用来模拟负载升高
sysstat是linux性能工具,用来监控和分析系统的性能,主要用到的两个命令
测试前的平均负载情况
root@ubuntu:/home/jyxmust# uptime
23:13:37 up 2:09, 1 user, load average: 0.31, 0.54, 0.76
模拟cpu使用率100%的场景
root@ubuntu:/home/jyxmust# stress --cpu 1 --timeout 600
stress: info: [9479] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd
第二个终端查看平均负债变化,一分钟的平均负载慢慢增加到1.23
uptime
mpstat -P ALL 5
CPU的使用率为100%,但iowait只有0,说明了平均负载升高是由于CPU使用率为100%,到底是哪个进程导致的呢
pidstat -u 5 1
stress -i 1 --timeout 600
watch -d uptime
mpstat -P ALL 5 1
pidstat -u 5 1
可以看出这次由于iowait的升高
还有stress进程导致的
当系统中运行进程超过cpu运行能力,就会出现等待cpu的进程
stress -c 8 --timeout 600
pidstat -u 5 1
8个stress进程在争夺2个cpu,每个进程等待cpu的时间(也就是%wait列)高达88.45%,这些超过cpu计算能力的进程,最终导致cpu过载
1、平均负载有可能是cpu密集型进程导致的
2、平均负载高并不一定代表cpu使用率高,还有可能是IO更繁忙了
3、当出现负载高的情况时,你可以使用mpstat、pidstat等工具,辅助分析负载的来源
sysbench是多线程的基准测试工具,来模拟系统多线程调度切换
预先安装sysbench和sysstat包,如 apt install sysbench sysstat
先使用vmstat查看空闲系统的上下文切换次数:
vmstat 1 1
r :正在运行和等待cpu的进程数
b:处于不可中断睡眠的进程数
上下文切换次数cs是481,中断次数in是147,r和b都是0,因为没有运行其他任务,这就是空闲系统的上下文切换次数
在第一个终端运行sysbench,模拟系统多线程调度的瓶颈:
sysbench --threads=10 --max-time=300 threads run
cs列的上下文切换次数上升到144万,r列的就绪队列的长度达到8,远远超过了系统cpu的个数2,所以肯定有大量的cpu竞争
us和sy列,这两列的cpu使用率加起来上升到了100%,说明cpu主要被内核占用了
结合这几个指标,可以得出系统的就绪队列多长,也就是正在运行和等待cpu的进程数过多,导致了大量的上下文切换,而上下文切换又导致了系统的cpu的占用率升高
那么到底是什么进程导致的问题
pidstat -w -u 1
cpu使用率升高是sysbench导致的,但上下文切换是来着其他进程。
pidstat -wt 1
-wt 表示输出线程的上下文切换指标
sysbench进程的上下文切换次数看起来并不多,但它的子线程的上下文切换次数很多,所以罪魁祸首还是sysbench线程。
除了上下文切换次数、还有中断次数也急速变多了,中断只发生内核态,pidstat只是进程性能分析工具,我们可以从/proc/interrupts文件读取,/proc是Linux的一个虚拟文件系统,用于内核空间与用户空间之间的通信,/proc/interrupts提供了只读的中断使用信息
watch -d cat /proc/interrupts
通过sysbench案例来对上下文切换问题进行分析,碰到上下文切换次数过多的问题,可以借助vmstat、pidstat和/proc/interrupts等工具,来辅助排查性能问题的根源