CPU高使用率排查

阅读 299 标签:java基础  

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
    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等待比较严重 。

其中需要特别注意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)的次数。

  • 所谓自愿上下文切换,是指进程无法获取所需资源,导致的上下文切换。比如说, I/O、内存等系统资源不足时,就会发生自愿上下文切换 。
  • 非自愿上下文切换,是指进程由于时间片已到等原因,被系统强制调度,进而发生的上下文切换。比如说,大量进程都在争抢 CPU 时,就容易发生非自愿上下文切换 。
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
文章来源:网络 版权归原作者所有,如涉及知识产权问题,请权利人联系我们,我们将立即处理.
标签: java基础
专栏:   Web服务器
文章 获得 个赞 共 个粉丝

推荐阅读 更多精彩内容

  • 学习编程语言,早已不是学一点语法规则那么简单。现在更习惯称作选择 Ecosystem(生态圈),而这其中标准库的作用和分量尤为明显。在Go语言的安装文件里包含了一些可以直接使用的包,即标准库。Go语言
    顾你木偶 顾你木偶 阅读 824 标签: go  
  • 根据 Go 开发团队和基本的算法测试,Go语言与C语言的性能差距大概在 10%~20% 之间。虽然没有官方的性能标准,但是与其它各个语言相比已经拥有非常出色的表现。时下流行的语言大都是运行在虚拟机上,
    顾你木偶 顾你木偶 阅读 748
  • 在早期 CPU 都是以单核的形式顺序执行机器指令。Go语言的祖先C语言正是这种顺序编程语言的代表。顺序编程语言中的顺序是指:所有的指令都是以串行的方式执行,在相同的时刻有且仅有一个 CPU 在顺序执行
    顾你木偶 顾你木偶 阅读 867 标签: go  
  • Go语言也称为 Golang,是由 Google 公司开发的一种静态强类型、编译型、并发型、并具有垃圾回收功能的编程语言。接下来从几个方面来具体介绍一下Go语言的特性。语法简单抛开语法样式不谈,单就类
    顾你木偶 顾你木偶 阅读 931 标签: go  
  • Go语言(或 Golang)起源于 2007 年,并在 2009 年正式对外发布。Go 是非常年轻的一门语言,它的主要目标是“兼具 Python等动态语言的开发速度和 C/C++等编译型语言的性能与安
    顾你木偶 顾你木偶 阅读 988 标签: go  
  • 1.介绍项目:完整的2.zookeeper:zkServer,使用过这在内部删除东西?不明白他想问啥?3.zookeeper的反压:4.DAG:DAGscheduler,taskscheduler,t
    上杉夏香 上杉夏香 阅读 600 标签: 大数据  hadoop  storm  
  • 1.hbase有什么特点,他的优缺点:海量存储,列式存储,高并发,稀疏(列的灵活性,列族中可以指定任意多的列,在列数据为空的情况下,是不会占用存储空间的),高可用(WAL解决高可用,瞬间写入量)2.单
    一生所爱の赫萝 一生所爱の赫萝 阅读 649 标签: 大数据  hadoop  
  • hadoop框架1.hdfs的读写基本不问,但是还是要知道2.mapjoin的原理3.hadoop的shuffle原理也没问,也要知道4.你在工作中的hadoop的小文件处理,结合项目进行说明5.ha
    九公里浅绿 九公里浅绿 阅读 714 标签: 大数据  hadoop  
  • 一面1.hive数据倾斜有哪几种?举例说明2.数据采集方式是什么?3.数仓是如何分层的?4.数据应用层对外使用的话,是通过什么方式去使用的?5.数据应用程序指标的设计过程是怎样的?6.能举例说下进行过
    田井中律 田井中律 阅读 609
  • 1.spark sql和hive sql的区别2.从原始数据层获取数据,数据丢失的情况有没有遇到过?3.kafka消息丢失,如何发现这些问题以及如何处理?4.项目中用到的kafka的topic,以及一
    田井中律 田井中律 阅读 564