文章插图
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进制,使用此命令可以查看到对应线程的线程栈信息,从而根据线程栈对应的代码进行分析 。
【cpu使用率忽高忽低怎么解决 电脑cpu使用率过高的解决办法】 5、如果无法查到有占用特别高的CPU的线程,那么需要进一步的查询,可以使用vmstat 2命令,每隔2秒输出一次信息,输出结果如下:
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- rbswpdfreebuffcachesisobiboincs us sy id wa st 200 14167082108 182420003250472326 28375 13 8200 000 14165842108 1824520000499600 10000 000 14165842108 1824520000519601 10000 000 14165842108 18245200005310100 10000 000 14165842108 1824520000499400 10000 000 14165842108 1824520000469100 10000 100 14165842108 1824520000449001 10000 vmstat命令能够报告有关进程、内存、分页、IO、磁盘和cpu活动等信息,是一个Linux系统问题排查的利器 。以上输出的结果列含义如下:
- r
Running or Runnable,就绪队列的长度,也就是正在运行和等待 CPU 的进程数,当这个值大于CPU核数时 , 证明目前处于等待CPU的进程数较多,CPU已经处理不过来了 。 - b
blocked, 处于不可中断睡眠状态的进程数 。 - swpd
虚拟内存已使用的大小 , 这个值大于0代表已经使用了虚拟内存 。 - free
空闲的物理内存的大小 。 - buff
Linux系统buff的大小 。 - cache
Linux系统cache的大小 。 - si
表示每秒钟从磁盘读入虚拟内存的大小 。 - so
表示每秒虚拟内存写入磁盘的大小 。 - bi
每秒中写入块设备的块数量, Linux版本块的大小一般为1024bytes 。 - bo
每秒钟从块设备读取的块的数量 。 - in
interrupt,每秒中断的次数 。 - cs
context switch,代表每秒钟上下文切换的次数,这是一个特别值得注意的内容,如果cs特别的高,将会耗费大量的CPU性能 。 - us
用户进程执行消耗cpu时间,us的值比较高时 , 说明用户进程消耗的cpu时间多 。 - sy
系统进程消耗cpu时间 , sy的值过高时,说明系统内核消耗的cpu资源多 , 一般sy不宜太高 , 如果太高则我们应该检查具体原因 。 - id
idle,CPU处于空闲的时间占比,包括IO等待时间,id+sy+us=100%. - wa
等待IO时间,wa过高时,说明io等待比较严重。
6、如果cs很大,则需要进一步判断是由于哪个进程引起的大量上下文切换,可以使用pidstat -w 2命令(一般来说还可以使用pidstat -w -u 2输出更多CPU的指标),每两秒中输出一次进程的上下文情况,结果如下,其中cswch/s代表每秒自愿上下文切换(voluntary context switches)的次数,另一个则是 nvcswch,表示每秒非自愿上下文切换(non voluntary context switches)的次数 。
- 所谓自愿上下文切换,是指进程无法获取所需资源,导致的上下文切换 。比如说,I/O、内存等系统资源不足时,就会发生自愿上下文切换。
- 非自愿上下文切换,是指进程由于时间片已到等原因,被系统强制调度,进而发生的上下文切换 。比如说 , 大量进程都在争抢 CPU 时 , 就容易发生非自愿上下文切换。
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:tpskB_read/skB_wrtn/skB_readkB_wrtnsda0.5117.283.0115084226248scd00.000.120.0010280dm-00.4613.552.7711828124179dm-10.010.280.0024600