背景
近期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%,测试成功。
网友评论