0
点赞
收藏
分享

微信扫一扫

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

闲嫌咸贤 2023-03-19 阅读 71

服务器CPU莫名其妙升高。。。

通过监控工具查看。CPU达到 733%。。。。

docker 运行中的容器CPU 莫名其妙使用率升高过百,解决 :Unable to open socket file:_java

 

于是,查找众多资料,发现。

步骤都差不多。。

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

 

修复问题,重新发布,问题解决。

 

举报

相关推荐

0 条评论