转载自华为服务支持的Linux性能下降
性能指标:
CPU占用率:top,mpstat,sar -w, vmstat
IO性能:throughput, iops, iostat -x,
CPU和内存资源占用高,句柄、文件数、Inode节点、异常进程等。
故障现象
OS的CPU性能,内存性能或者IO性能明显下降。
问题可能影响
用户的业务处理能力下降,无法满足正常业务需求。
可能原因
系统平均负载过高。
CPU使用率过高。
CPU上下文切换过于频繁。
CPU缓存命中率较低。
内存不足导致内存换出换入交换分区频繁。
硬盘利用率已经饱和,IO存在瓶颈。
解决措施
1. 对于任何的性能问题,首要是需要看OS的日志,比如/var/log/messages里面是否有error,fail,warn等信息。查找可能会引发性能问题的错误。千万不要漏掉这一步。
2. 使用uptime查看系统平均负载,从这个命令的load average可以知道系统最近 1 分钟、5 分钟、15 分钟的系统平均负载。
![](https://img.haomeiwen.com/i7749898/26f50abf0c28cb76.png)
系统平均负载指的是处于可运行或不可中断状态的平均进程数,理想状态下,每个逻辑CPU运行一个进程,因此例如当前系统的逻辑CPU数量是64,理想状态load average也应该是64,上图的load average是100,则表示有进程在等待执行。
![](https://img.haomeiwen.com/i7749898/5f8693207080532b.png)
3. 由于系统平均负载反映的是处于R状态和D状态的进程数,因此不代表CPU的使用率就是高,这两者没有必然的联系。对于计算密集型任务较多的场景来说,系统平均负载的升高意味着CPU使用率上升,但是对于IO密集型任务较多的场景来说,系统平均负载升高时CPU利用率通常都不高,因为有很多进程都处于D状态。因此:
3.1) 如果系统平均负载率很高同时CPU的使用率也很高,则需要考虑的是系统可能遇到了CPU瓶颈,需要去定位CPU方面的原因。
3.2) 如果系统平均负载率很高,但是CPU的使用率不高,则需要考虑的是系统可能遇到了IO瓶颈,需要去定位IO方面的原因;
4. 对于系统平均负载很高同时CPU使用率也高的场景,我们需要去定位CPU方面的原因。
4.1) 首先使用下面的命令查看每一秒的CPU的核心的变化信息:
# mpstat -P ALL 1
![](https://img.haomeiwen.com/i7749898/a4dab0fe266822e2.png)
由以上输出可以得出结论,当前系统负载升高,并且其中 1 个核在执行用户态任务,占了49号CPU的100%的时间,此时大多数属于业务工作。所以此时需要查哪个进程导致49号CPU 跑满。
4.2) 使用pidstat命令去查看进程占用的CPU情况:
# pidstat -u 1
![](https://img.haomeiwen.com/i7749898/d46d6c9d2a5474b5.png)
由以上输出我们可以看到stress进程占用了很高的CPU。
5) 对于系统平均负载很高但是CPU使用率不高的场景,我们需要去定位IO方面的原因。
5.1) 首先使用下面的命令查看每一秒的CPU的核心的变化信息:
# mpstat -P ALL 1
![](https://img.haomeiwen.com/i7749898/95a2e6be2044bef7.png)
可以看到iowait占用比较高
5.2) 使用sar -d -p 1查看哪个块设备的使用率比较高。
![](https://img.haomeiwen.com/i7749898/34e09ef67237c227.png)
通过上图可以看到,sda盘的%util占用率较高,基本到了100%,而且await的值也达到了76.28,说明sda设备已经饱和,如果await值较高,则可能是磁盘设备存在问题。
5.3) 使用pidstat -d 1命令查看具体是哪个进程导致IO升高的:
![](https://img.haomeiwen.com/i7749898/dde37c26f711a191.png)
通过上图可以看出stress-ng-hdd进程是导致IO升高的元凶。
6. 对于由于CPU上下文切换频繁导致系统平均负载升高的,可以按照下面的方法去排查:
一般每次上下文切换都需要几十纳秒到数微秒的 CPU 时间,如果切换较多还是很容易导致 CPU 时间的浪费在寄存器、内核栈以及虚拟内存等资源的保存和恢复上,这里同样会导致系统平均负载升高。
6.1) 通过下面的命令查看系统上下文切换:
# vmstat 1
![](https://img.haomeiwen.com/i7749898/11a1fd9afbfc27de.png)
通过上图我们可以看到,cs和in剧增,同时us+sy的CPU占用超过了90%,r就绪队列的长度达到了16个左右,而当前的CPU个数是4,因此可以判断当前存在CPU队列已经很长,从而导致进程上下文切换较为频繁。
使用pidstat查看具体的进程上下文切换信息,以判断是哪个。
# pidstat -u 1 -w -t
![](https://img.haomeiwen.com/i7749898/8a387953d759f3cf.png)
![](https://img.haomeiwen.com/i7749898/d470ed2f571a8b2e.png)
从上图可以看出,大量的sysbench线程存在频繁的上下文切换。并且nvcswch/s的值比cswch/s的值大的多,说明大部分sysbench进程都在被强制调度,也就是在争抢CPU资源,说明CPU成为了性能瓶颈。
7. 对于内存不足引起的OS性能下降的问题,我们可以通过下面的方法去排查:
7.1) 首先查看dmesg日志,查看是否有Out of memory打印,如果有,说明有程序在申请内存时失败,内存不足,这种情况有可能由两种原因引起。一是物理内存不足,二是内存碎片化严重,导致后面的程序申请大片连续内存时无法分配成功。
7.2) 通过sar -r 1命令去查看当前的内存的使用率,主要看%memused,如果使用率超过了90%,说明物理内存已经不足。
7.3) 通过sar -W 1命令查看交换分区的活动,如果pswpin/s和pswpout/s的值比较高,说明物理内存已经不足,正常这个值是0。
7.4) 通过vmstat -a命令中的swpd查看交换分区使用的大小,以此进一步判断物理内存是否已经不足。
7.5) 通过pidstat -r 1命令查看%MEM域,查看哪些进程占用的内存过多。
网友评论