背景
近期grafana告警測試服務(wù)器CPU使用過高艾疟,需要排查是什么原因?qū)е虏⑻幚怼?/p>
排查
使用TOP命令發(fā)現(xiàn)PID為98178的進(jìn)程CPU占用達(dá)到397.5来吩。
top
單獨(dú)查看98178進(jìn)程的使用情況
top -p 98178
各參數(shù)及意義如下:
top - 10:17:20 up 202 days, 12:39, 1 user, load average: 14.19, 14.33, 14.28
任務(wù)隊(duì)列信息 | 含義 |
---|---|
10:17:20 | 當(dāng)前時(shí)間 |
202 days | 系統(tǒng)運(yùn)行時(shí)間 |
12:39 | 用戶在線時(shí)間 |
1 users | 在線用戶數(shù) |
load average: 14.19, 14.33, 14.28 | 系統(tǒng)負(fù)載,即任務(wù)隊(duì)列的平均長度蔽莱。1分鐘前弟疆、5分鐘前、15分鐘前平均負(fù) |
Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie
進(jìn)程信息 | 含義 |
---|---|
Tasks: 1 total | 進(jìn)程總數(shù) |
0 running | 正在運(yùn)行的進(jìn)程數(shù) |
1 sleeping | 睡眠的進(jìn)程數(shù) |
0 stopped | 停止的進(jìn)程數(shù) |
0 zombie | 僵尸進(jìn)程數(shù) |
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 | 內(nèi)核空間占用CPU百分比 |
0.0% ni | 用戶進(jìn)程空間內(nèi)改變過優(yōu)先級的進(jìn)程占用CPU百分比 |
0.0% id | 空閑CPU百分比 |
0.0% wa | 等待輸入輸出的CPU時(shí)間百分比 |
0.0% hi | 硬件中斷 |
0.0% si | 軟件中斷 |
0.0%st | 實(shí)時(shí) |
Mem: 16300292k total, 9979564k used, 6320728k free, 4288k buffers
Swap: 8175612k total, 541836k used, 7633776k free, 82108k cached
物理內(nèi)存信息 | 含義 |
---|---|
Mem: 16300292k total | 物理內(nèi)存總量 |
9979564k used | 使用的物理內(nèi)存總量 |
6320728k free | 空閑內(nèi)存總量 |
4288k buffers | 用作內(nèi)核緩存的內(nèi)存量 |
交換區(qū)信息 | 含義 |
Swap: 8175612k total | 交換區(qū)總量 |
541836k used | 使用的交換區(qū)總量 |
7633776k free | 空閑交換區(qū)總量 |
82108k cached | 緩沖的交換區(qū)總量 |
查看線程情況,發(fā)現(xiàn)多個(gè)cpu高耗線程盗冷,并且cpu消耗接近,推斷是一段問題代碼被多次調(diào)用的結(jié)果怠苔。
top -p 98178 -H
查看最上面一個(gè)線程的TID,并轉(zhuǎn)換成16進(jìn)制
printf "%x \n" 212019
根據(jù)得到的16進(jìn)制TID仪糖,通過jstack查找該線程后十行來定位問題代碼柑司。發(fā)現(xiàn)指向一個(gè)運(yùn)行中(RUNNABLE)的線程,在代碼ArchiveApi.java:519行锅劝。
jstack 98178 | grep -A10 33c33
解決
找到查出來的代碼攒驰,發(fā)現(xiàn)是一段文件寫入的代碼有個(gè)while(true)循環(huán),推測是一直無法滿足read==-1導(dǎo)致的CPU使用過高故爵。
修改代碼并進(jìn)行測試:
CPU使用率2.3%玻粪,測試成功。