docker 運行中的容器CPU 莫名其妙使用率升高過百,解決 :Unable to open socket file:


服務器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

 

修復問題,重新發布,問題解決。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM