有同学反映,之前关于Linux的文章:(2)CPU负载高时怎么办,太理论化,难以理解。 本文将对上一篇提到的知识进行实际拓展,并通过实例加深理解。 主要从两个模拟场景来总结实战讲解:(1)CPU占用率高导致负载高。 (2)IO压力导致负载过高。
在模拟故障场景之前,我们先来了解一下压力测试工具:(提示:生产环境谨慎使用,会影响线上服务)
部分系统可能未安装此工具,需要自行下载安装:
或者系统安装方法:
yum install stress -y
系统安装方法:
apt-get install stress -y
其他系统请自行搜索。
我们先来帮助一下命令的使用。
我希望您在理解新命令之前能够使用或帮助它。 这是一个很好的习惯,不要偷懒。
(0)压测前的系统指标
压测之前我们先看一下系统的指标
从图中的top命令(按top后按top,按CPU占用率排序)我们可以看到CPU占用率为1-99.0%=1%,每个进程的CPU为0.3%、0.3%、0.3%分别。 。 。 、1分钟、5分钟、15分钟分别是0.00、0.01、0.05,可以说是相当闲了。
另外,需要注意的是,CPU使用率是按所有CPU核心占用的比例来计算的。 计算方法将在后面的文章中详细解释。 例如,我的CPU核心数可以使用以下命令查看(也可以在top后按1查看):
# grep -i "model name" /proc/cpuinfo | wc -l
2
这说明我的开发机的CPU使用率最高可达200%。
(1)CPU占用率高导致负载高
stress -c 4 -t 300
-c参数表示我启动了4个进程。 -t参数表示压力测试持续300秒。 下面我们发现top下CPU空闲率为0,使用率为2-0.0%=200%,正好等于4个进程的使用率之和。 。 此时观察到负载一直在增加,高于核心数(2),说明存在排队情况。
在这种情况下,CPU 和负载都增加了。 负载增加是CPU压力造成的吗? 在之前关于Linux的文章:(二)CPU负载高怎么办中,提到了负载高的原因也可能是IO瓶颈,所以我们先看一下IO性能。 如何查看IO性能? 我们建议您查看整个系统。 对于性能工具,这次我就直接运行命令。 其他参数的含义大家可以自行查找。 该命令将在后面的磁盘章节中详细解释。 这次我们先有个整体的了解。
-x参数表示显示统计信息,后面的1表示每1秒输出一次。 这里需要注意的是,第一次打印的信息(即红框中的信息)可以忽略,因为它是系统启动以来的统计信息,而不是现在的实时信息。 命令描述中对此进行了说明:
这是自那时以来的第一次。
rrqm/s:每秒合并多少个与设备相关的读请求。 这是为了提高阅读效率;
wrqm/s:每秒合并多少个与设备相关的写请求。 这是为了提高写作效率。
rsec/s:每秒读取的扇区数;
wsec/:每秒写入的扇区数。
r/s:该设备每秒的读请求数;
w/s:设备每秒的写请求数;
wait:每个IO请求处理的平均时间(ms)。
%util:单位时间内设备处理IO的平均时间比例。 它指示设备的繁忙程度。
从上图中我们可以看到系统中没有任何读写操作(忽略红框内的第一个输出),因此我们断定本次负载增加的原因是CPU使用率过高造成的。
现在我们已经找到了导致CPU上升的进程,但是这个进程在做什么呢? 我们可以进一步分析,推荐另一个性能分析工具perf。
与top查看系统实时性能类似,我们也可以使用perf top来观察系统的性能。 perf top 用于实时显示当前系统的性能统计信息。 该命令主要用于观察整个系统当前的状态。 例如,可以通过查看该命令的输出来查看当前系统中最耗时的内核函数或某个用户进程。 添加-p参数后跟进程pid可以显示该进程最耗时的线程和函数。 那么我们来实验一下。 现在我们将选择一个带有pid的进程来查看。
perf top -p 120934
从上图可以看出,进程调用了libc动态库的函数,导致CPU占用率上升。 例如,在Java或PHP等语言中,开发人员需要检查自己的代码在系统调用中是否被不合理地使用。
(3)IO压力导致负载过高
当然IO压力测试也可以使用命令,只不过它模拟的是sync命令的执行。 同步命令用于刷新文件系统的缓冲区。 执行sync命令的实际作用是将内存中的数据缓冲区写入磁盘。 我尝试了一下,效果不是很明显,所以我使用了另一个IO测试工具dd。
dd if=/dev/zero of=test.txt bs=1024K count=2000000
上述命令的意思是向test.txt文件写入数据。 每个块的大小是1024K,也就是1M。 总共写入了块,即1M*=200G数据。 而 /dev/zero 是一个特殊的文件,当你读取它时,它会提供无限的空字符。 即从/dev/zero读取空字符串写入test.txt文件,总共写入200G。
现在top发现平均负载逐渐从0上升到2+,CPU使用率为47%,还没有满。
然后我们观察IO情况,发现%util已经占用了100%,说明IO已经很忙了。
从上面我们可以得出,这次平均负载的增加主要是IO压力造成的。
好了,今天的主题就讲到这里吧,不管如何,能帮到你我就很开心了,如果您觉得这篇文章写得不错,欢迎点赞和分享给身边的朋友。