服務器CPU莫名其妙升高。。。
通過監控工具查看。CPU達到 733%。。。。
於是,查找眾多資料,發現。
步驟都差不多。。
1、進入容器,查看 進程號
top
結果如下:看到排第一的進程,拿到pid
Tasks: 151 total, 1 running, 150 sleeping, 0 stopped, 0 zombie %Cpu(s): 17.5 us, 1.6 sy, 0.0 ni, 80.2 id, 0.0 wa, 0.0 hi, 0.8 si, 0.0 st KiB Mem : 16265568 total, 182552 free, 12032964 used, 4050052 buff/cache KiB Swap: 0 total, 0 free, 0 used. 3893084 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 25970 root 20 0 8803864 3.1g 13892 S 120.0 19.7 60:57.15 java 15188 root 20 0 4630448 3.1g 9204 S 40.0 19.8 671:05.97 java 1082 root 20 0 1385500 79148 8740 S 6.7 0.5 61:47.84 dockerd 1 root 20 0 43600 3728 2388 S 0.0 0.0 0:03.42 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
2、使用top -H -p 進程號查看異常線程、查看線程
top -H -p 25970
得到如下結果:
top - 13:07:01 up 2 days, 19:38, 6 users, load average: 1.87, 1.67, 1.60 Threads: 252 total, 1 running, 251 sleeping, 0 stopped, 0 zombie %Cpu(s): 18.8 us, 1.3 sy, 0.0 ni, 79.2 id, 0.0 wa, 0.0 hi, 0.7 si, 0.0 st KiB Mem : 16265568 total, 168684 free, 12043804 used, 4053080 buff/cache KiB Swap: 0 total, 0 free, 0 used. 3882576 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 26246 root 20 0 8821340 3.1g 13892 R 99.9 19.7 48:16.31 java 26105 root 20 0 8821340 3.1g 13892 S 0.7 19.7 0:10.20 java 26243 root 20 0 8821340 3.1g 13892 S 0.7 19.7 0:07.85 java 26252 root 20 0 8821340 3.1g 13892 S 0.7 19.7 0:07.80 java
3、使用printf "%x\n" 線程號將異常線程號轉化為16進制
printf "%x\n" 26246
得到如下結果
[root@iZwz97bb75hzl6vsvx8xb9Z ~]# printf "%x\n" 26246 6686
4、使用jstack 進程號|grep 16進制異常線程號 -A90來定位異常代碼的位置(最后的-A90是日志行數,也可以輸出為文本文件或使用其他數字)。可以看到異常代碼的位置。
jstack 25970|grep 6686 -A90
得到如下結果:提示:說明本機查看docker容器的線程失敗。
[root@iZwz97bb75hzl6vsvx8xb9Z ~]# jstack 25970|grep 6686 -A90 25970: Unable to open socket file: target process not responding or HotSpot VM not loaded The -F option can be used when the target process is not responding
總結:不行呀。因為這是docker的容器,在外部無法接入。而在容器內無法處理。因為依賴基礎鏡像的閹割精簡版。
所以修改依賴基礎鏡像為完整版。
#FROM openjdk:8-jre-alpine FROM java:8
.......
而且需要進入到容器內,才可以操作。於是打包,發布,重復以上步驟。。
解決:
docker exec -it my-server bash
重復以上的各步驟
然后。
printf "%x\n" 136 88 jstack 8|grep 88 -A90 >/home/soft/881.log 等待15s jstack 8|grep 88 -A90 >/home/soft/882.log
等待15s
jstack 8|grep 88 -A90 >/home/soft/883.log
將結果導出到宿主機
退出容器,
exit
docker cp my-server:/tmp/soft .
最終通過查看快照881,882,883
查找內容中的 自己的程序代碼,並且在狀態為RUNNABLE中的記錄。最終。找到死循環程序
java.lang.Thread.State: RUNNABLE
修復問題,重新發布,問題解決。