Linux性能优化系列第1篇,今天小编就来聊一聊关于cpu使用率高怎么解决?接下来我们就一起去研究一下吧!

cpu使用率高怎么解决(CPU使用率高怎么办)

cpu使用率高怎么解决

Linux性能优化系列

第1篇

Java程序在实际生产过程中经常遇到所在服务器CPU使用率高的问题,那么应该如何排查问题的原因呢,本文大概描述一下排查方法,作为一个排查手册。

1、使用top命令,在大写打开的情况下按P键或者在大写没有打开的情况下按 shift P键,会按照CPU使用率的高低进行排序,查找使用率最高的进程获取进程pid。

2、使用命令top -H -p pid,此处pid就是上一步获取的进程pid,通过此命令可以查看实际占用CPU最高的的线程的id,此处即为tid

3、使用命令printf "%x\n" tid,将线程tid转换为16进制

4、使用命令jstack pid |grep tid -A 50,此处tid为上一步转换后的16进制,使用此命令可以查看到对应线程的线程栈信息,从而根据线程栈对应的代码进行分析。

5、如果无法查到有占用特别高的CPU的线程,那么需要进一步的查询,可以使用vmstat 2命令,每隔2秒输出一次信息,输出结果如下:

procs -----------memory---------- ---swap-- -----IO---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 2 0 0 1416708 2108 182420 0 0 3250 472 326 2837 5 13 82 0 0 0 0 0 1416584 2108 182452 0 0 0 0 49 96 0 0 100 0 0 0 0 0 1416584 2108 182452 0 0 0 0 51 96 0 1 100 0 0 0 0 0 1416584 2108 182452 0 0 0 0 53 101 0 0 100 0 0 0 0 0 1416584 2108 182452 0 0 0 0 49 94 0 0 100 0 0 0 0 0 1416584 2108 182452 0 0 0 0 46 91 0 0 100 0 0 1 0 0 1416584 2108 182452 0 0 0 0 44 90 0 1 100 0 0

vmstat命令能够报告有关进程、内存、分页、IO、磁盘和cpu活动等信息,是一个Linux系统问题排查的利器。以上输出的结果列含义如下:

其中需要特别注意r,in,cs,us,sy,id,wa这几个指标,如果发现cs的值比较大,证明系统发生了大量的上下文切换,此时sy的值一般也会比较大,系统实际用户进程消耗的CPU时间比较少,CPU使用率高是因为大量CPU时间消耗在了系统内核态。

6、如果cs很大,则需要进一步判断是由于哪个进程引起的大量上下文切换,可以使用pidstat -w 2命令(一般来说还可以使用pidstat -w -u 2输出更多CPU的指标),每两秒中输出一次进程的上下文情况,结果如下,其中cswch/s代表每秒自愿上下文切换(voluntary context switches)的次数, 另一个则是 nvcswch ,表示每秒非自愿上下文切换(non voluntary context switches)的次数。

10:40:21 PM UID PID cswch/s nvcswch/s Command 10:40:23 PM 0 3 0.50 0.00 ksoftirqd/0 10:40:23 PM 0 9 2.01 0.00 rcu_sched 10:40:23 PM 0 314 1.01 0.00 kworker/u256:2 10:40:23 PM 0 428 20.10 0.00 xfsaild/dm-0 10:40:23 PM 0 429 0.50 0.00 kworker/0:1H 10:40:23 PM 0 1467 0.50 0.00 sshd 10:40:23 PM 0 1599 3.02 0.00 kworker/0:2 10:40:23 PM 0 1600 0.50 0.00 kworker/0:3 10:40:23 PM 0 1601 0.50 0.50 pidstat

以上只能看到进程的上下文切换,如果想看到线程的上下文切换,则可以使用pidstat -wt 2,输出详细的线程切换的数据,通过这种方法可以查看到线程切换频繁的线程id,然后通过将id转换为16进制,跟踪堆栈信息就可以找到对应的代码了。

7、如果发现in的值很大,则证明系统中断占比很高,系统中断运行在内核态,想要查看中断的情况,可以通过查看/proc/interrupts,使用命令watch -d cat /proc/interrupts,可以查看到 RES : Rescheduling interrupts(重调度中断)的变化, 这个中断类型表示,唤醒空闲状态的 CPU 来调度新的任务运行。如果这个值变化很大,代表大量的中断是因为唤醒CPU执行新的调度任务,那么这实际上也是因为存在过多的需要进行调度的任务,也可能是因为大量的线程上下文切换。

8、如果发现vmstat的输出结果wa比较大,可以进一步使用pidstat -w -d 2来输出IO的相关统计信息,-d表述输出IO信息,还可以使用iostat,例如iostat -d -k 2,-d表示显示磁盘使用状态,-k表示KB为单位,2表示每隔2秒输出一次,通过这些信息,可以协助判断IO的瓶颈。

Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn sda 0.51 17.28 3.01 150842 26248 scd0 0.00 0.12 0.00 1028 0 dm-0 0.46 13.55 2.77 118281 24179 dm-1 0.01 0.28 0.00 2460 0

微信公众号中文同名:饭团技术,欢迎关注交流。

,