linux 查看cpu使用率_Linux篇:(3)CPU之负载实战

有同学反馈上篇文章Linux篇:(2)CPU之负载高怎么办太过理论化,不好理解,这篇文章就对上篇文章提到的知识做一个实战的扩展,通过例子加深理解。总结了一下主要从2个模拟场景进行实战讲解:(1)CPU使用率高引起平均负载高。(2)IO压力引起平均负载高。

在模拟故障场景之前,先来了解一个压力测试工具:stress(提示:生产环境慎用,会影响线上服务)

这个工具有些系统可能没有安装,需要自己下载安装:

centos或者redhat系统安装方式:

yum install stress -y

ubuntu系统安装方式:

apt-get install stress -y

其他系统请自行搜索。

我们先help下stress命令的用法

6e3fede09fb34967b1184947eea88049

希望大家了解一个新命令之前先man一下或者help一下该命令,这是一个特别好的习惯,不要偷懒。

  • 压力测试前的系统指标

在进行压力测试之前我们先看下系统的指标

4effa7c4ffe3451faa17488c2c96ae01

系统top命令图

从图中top命令(top后按大写P建会根据CPU使用率排序)我们可以看到CPU使用率为1-99.0%=1%(99.0%id是idle也就是空闲率的意思),各个进程的CPU使用率分别为0.3%、0.3%、0.3%.....,1分钟、5分钟、15分钟负载分别为0.00、0.01、0.05,可以说是相当的空闲。

另外说明一点这个CPU使用率统计的是占用所有CPU核心数的比例,后面一篇文章会详细的讲解计算方法。比如我的CPU核心数可以使用下面的命令查看(也可以top后按1键查看):

[root@remind-test ~]# grep -i "model name" /proc/cpuinfo | wc -l2

这个说明我开发机的CPU使用率最大可以到200%。

  • 场景:CPU使用率高引起负载高
stress -c 4 -t 300 ## -c参数说明我起了4个stress进程 -t参数说明压测300s的时间

使用stress命令压力测试工具后,我们top下发现CPU空闲率为0,所以使用率为2-0.0%=200%,正好等于4个stress进程的使用率之和。这时观察发现负载一直在升高,已经高于核心数(2个),说明出现了排队的情况。

9897e16d232744fabe99f67b670bc360

这种情况就是CPU和负载都出现了升高,而且出现负载升高的原因是不是CPU出现了压力引起的呢?

上篇文章Linux篇:(2)CPU之负载高怎么办中提到引起负载高的原因也可能是IO出现了瓶颈,那我们看下IO性能,IO的性能怎么看呢,推荐一个查看系统整体IO性能的工具iostat,这次我直接上命令,iostat的其他参数含义可以自行查找,这个命令在后面磁盘篇会详细讲解,这次我们先整体认识下。

5176fa2fcbad4a81b72eaf1bd645423b

-x参数表示展示统计信息,后面的1表示每1s输出一次。这里有一点需要说明,第一次打印的信息(也就是红框内的信息)可以忽略一下,因为它是从系统启动以来的统计信息,而不是现在实时的信息。

这个在iostat命令的描述中有说明:

The first report generated by the iostat command provides statistics concerning the time since the system was booted. ---man iostat

输出的各参数的含义总结如下:

rrqm/s:每秒该设备相关的读取请求有多少被合并,这个是为了提高读效率;

wrqm/s:每秒该设备相关的写请求有多少被合并,这个是为了提高写效率。

rsec/s:每秒读取的扇区数;

wsec/:每秒写入的扇区数。

r/s:该设备每秒读请求数;

w/s:该设备每秒写请求数;

await:每一个IO请求处理的平均时间(ms)。

%util:该设备单位时间内处理IO的平均时间比率。它表示了一个设备的繁忙程度。

从上图可以看出系统整体上没有什么读写(忽略红框内第一次输出),所以我们得出结论这次引起负载升高的原因是CPU使用率占用高引起来的。

现在我们找到了引起CPU升高的进程,但是stress进程在干什么呢?我们还可以再进一步分析,接下来推荐另一个性能分析工具perf。

类似top查看系统实时性能,我们也可以使用perf top观察一个系统的性能。Perf top 用于实时显示当前系统的性能统计信息。该命令主要用来观察整个系统当前的状态,比如可以通过查看该命令的输出来查看当前系统最耗时的内核函数或某个用户进程。加上-p参数,后面跟上进程pid可以展示这个进程的最耗时的线程和函数。那我们就来实验一下,现在我们就选择上图中pid为120934的一个stress进程查看。

perf top -p 120934
27974ec905994101860ab5a58c100c8d

从上图我们可以看到stress进程调用了libc动态库的random函数引起了CPU使用率升高。比如,注意说的是比如,stress是java或者php或者其他类的语言开发的进程,开发人员就要查看自己代码是不是在系统调用的时候使用不合理的地方。

  • 场景:IO压力引起负载高

IO压力测试当然也可以使用stress命令,但是它模拟的是sync命令的执行,sync 命令用来刷新文件系统的缓冲区,执行sync命令实际的作用是把内存中的数据缓冲写入到磁盘中,刚使用的开发机可能内存中没有多少缓存。我试了下效果不是很明显,那么我就使用另一个IO测试工具dd。

dd if=/dev/zero of=test.txt bs=1024K count=2000000

上面命令的意思是往test.txt文件里写数据,每个块大小是1024K也就是1M,共写入2000000个块,也就是1M*2000000=200G数据。而/dev/zero 是一个特殊的文件,当你读它的时候,它会提供无限的空字符。也就是从/dev/zero读取空字符串写入test.txt文件里,总共写入200G。

现在top发现平均负载逐渐从0升高到2+,而CPU使用率占用了47%,并没有占满。

34e8184caf5245b9a62ee44629b18789

我们再观察IO情况,发现%util已经占用了100%,说明IO已经十分繁忙。

2d56928490664f879d6fafcf49287c7f

通过以上可以得出结论:这次平均负载升高主要是IO压力导致的。

本篇文章主要模拟了2个导致CPU评价负载升高的案例,介绍了几个常用工具,剖析定位了引起平均负载升高的原因,也算是对上篇文章的一个补充。如果有任何问题或者错误之处还望留言指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值