性能测试

4.技术-CPU飙高分析和排查(四)-CPU-sys%高定位原因

2018-09-26  本文已影响475人  爱吃糖果

目录

一.原因分析

二.排查

三.常见消耗sys的情况

对于一些sys高的案例,使用前面的方式无法定位,比如oracle引起的sys高。我们没办法去定位源码。可以使用下面的方式来定位。

一.原因分析

一般引起sys高的原因总结如下:

1>.大量的中断

中断分软中断(软中断是一种需要内核为正在运行的进程去做一些事情的请求)和硬中断(外设引起的)

也会伴随着上下文切换。

2>.系统负载高

负载高表示有很多程序等待调度运行(一般是Running状态和Disk Sleep状态的线程太多,进入Disk Sleep状态的线程是不能够被打断的,他们会一直睡眠直到等待的资源被释放时主动去唤醒他们,这些线程在等待什么资源,比如某个信号量,它就会被加入到这个信号量的等待队列里,然后其它的线程释放这个信号量的时候会去检查该信号量的等待队列,然后把队列里线程给唤醒),它会导致上下文切换频繁。

3>.上下文切换过于频繁

说明CPU用于执行进程代码的时间少.sys会上去(因为cpu寄存器和高速缓存中的缓存会随着切换全部失效)

查看进程上下文切换次数的方法:

使用vmstat查看进程切换次数。cs代表切换的数量。

pidstat -w -p 48863 1 10     //根据PID监控上下文切换 (pidstat安装命令yum install sysstat)

平均时间: UID    PID       cswch/s     nvcswch/s   Command

平均时间: 0         48770     2.53          2.78               testp

cswch/s: 每秒任务主动(自愿的)切换上下文的次数,当某一任务处于阻塞等待时,将主动让出自己的CPU资源。

nvcswch/s: 每秒任务被动(不自愿的)切换上下文的次数,CPU分配给某一任务的时间片已经用完,因此将强迫该进程让出CPU的执行权。

二.排查

模拟sys高

2.in:中断次数,中断次数高于正常。

3.查看负载,负载正常

4.查看上下文切换次数,可以看出,明显多出10倍多。确定是系统存在大量的上下文切换。

5.pstack查看线程日志,寻找引起上下文切换的操作。发现有大量的创建线程的操作,通过前面的理论我们知道,创建线程是由用户态->内核态->用户态的切换。基本定位到原因。

三.常见消耗sys的情况

1>.大量并发的 I/O 操作:

一般 I/O 操作不会消耗太多的 CPU ,因为主要的时间消耗会在 I/O 操作的设备上。比如从磁盘读文件时,主要的时间在磁盘内部的操作上,而消耗的 CPU 时间只占 I/O 操作响应时间的一少部分。但在大量的并发的 I/O 时才可能会使得 SYS CPU 有所增加。

2>.多线程抢占系统调度的资源:

对于多个线程抢占某一个系统调用的资源,会导致大量的线程等待->唤醒->抢占,未抢到->等待...。导致不断的切换线程耗费cpu。

个人的微信公众号,感兴趣的扫码关注。

上一篇下一篇

猜你喜欢

热点阅读