JVM占用CPU使用过高问题排查

背景

近期grafana告警测试服务器CPU使用过高,需要排查是什么原因导致并处理。


告警信息

排查

使用TOP命令发现PID为98178的进程CPU占用达到397.5。

top

单独查看98178进程的使用情况

top -p 98178


各参数及意义如下:
top - 10:17:20 up 202 days, 12:39, 1 user, load average: 14.19, 14.33, 14.28

任务队列信息 含义
10:17:20 当前时间
202 days 系统运行时间
12:39 用户在线时间
1 users 在线用户数
load average: 14.19, 14.33, 14.28 系统负载,即任务队列的平均长度。1分钟前、5分钟前、15分钟前平均负

Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie

进程信息 含义
Tasks: 1 total 进程总数
0 running 正在运行的进程数
1 sleeping 睡眠的进程数
0 stopped 停止的进程数
0 zombie 僵尸进程数

Cpu(s): 99.8%us, 0.2%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st

cpu信息 含义
99.8% us 用户空间占用CPU百分比
0.2% sy 内核空间占用CPU百分比
0.0% ni 用户进程空间内改变过优先级的进程占用CPU百分比
0.0% id 空闲CPU百分比
0.0% wa 等待输入输出的CPU时间百分比
0.0% hi 硬件中断
0.0% si 软件中断
0.0%st 实时

Mem: 16300292k total, 9979564k used, 6320728k free, 4288k buffers
Swap: 8175612k total, 541836k used, 7633776k free, 82108k cached

物理内存信息 含义
Mem: 16300292k total 物理内存总量
9979564k used 使用的物理内存总量
6320728k free 空闲内存总量
4288k buffers 用作内核缓存的内存量
交换区信息 含义
Swap: 8175612k total 交换区总量
541836k used 使用的交换区总量
7633776k free 空闲交换区总量
82108k cached 缓冲的交换区总量

查看线程情况,发现多个cpu高耗线程,并且cpu消耗接近,推断是一段问题代码被多次调用的结果。

top -p 98178 -H

查看最上面一个线程的TID,并转换成16进制

printf "%x \n" 212019

根据得到的16进制TID,通过jstack查找该线程后十行来定位问题代码。发现指向一个运行中(RUNNABLE)的线程,在代码ArchiveApi.java:519行。

jstack 98178 | grep -A10 33c33

解决

找到查出来的代码,发现是一段文件写入的代码有个while(true)循环,推测是一直无法满足read==-1导致的CPU使用过高。



修改代码并进行测试:

修改代码
运行代码几次后查看cpu使用率

CPU使用率2.3%,测试成功。

你可能感兴趣的:(JVM占用CPU使用过高问题排查)