文章目录
目录
使用 top + jstack,CPU过高问题定位
1. Top
1.1 进入容器
docker ps
docker exec -it java bash
1.2 查看进程号
root@g_v_test_001:/# top
Tasks: 9 total, 1 running, 8 sleeping, 0 stopped, 0 zombie
%Cpu(s): 2.2 us, 0.6 sy, 0.0 ni, 97.1 id, 0.1 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem: 32780164 total, 31065672 used, 1714492 free, 516172 buffers
KiB Swap: 0 total, 0 used, 0 free. 10262824 cached Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 20108 1644 1312 S 0.0 0.0 0:00.01 script.sh
18 root 20 0 6757672 1.926g 15972 S 0.0 6.2 4:38.88 java
19 root 20 0 4256 352 272 S 0.0 0.0 0:00.00 tail
124 root 20 0 20244 2004 1512 S 0.0 0.0 0:00.00 bash
163 root 20 0 20240 1932 1456 S 0.0 0.0 0:00.00 bash
170 root 20 0 20240 1932 1456 S 0.0 0.0 0:00.00 bash
177 root 20 0 20240 1928 1456 S 0.0 0.0 0:00.00 bash
185 root 20 0 20244 1996 1504 S 0.0 0.0 0:00.00 bash
193 root 20 0 21948 1400 988 R 0.0 0.0 0:00.00 top
1.3 使用top -Hp 进程号查看异常线程、查看线程
root@g_v_test_001:/# top -H -p 18
Threads: 70 total, 0 running, 70 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.8 us, 0.8 sy, 0.0 ni, 98.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem: 32780164 total, 31070272 used, 1709892 free, 516188 buffers
KiB Swap: 0 total, 0 used, 0 free. 10262880 cached Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
86 root 20 0 6758700 1.926g 15980 S 0.3 6.2 0:00.08 java
18 root 20 0 6758700 1.926g 15980 S 0.0 6.2 0:00.00 java
20 root 20 0 6758700 1.926g 15980 S 0.0 6.2 0:55.56 java
21 root 20 0 6758700 1.926g 15980 S 0.0 6.2 0:02.59 java
22 root 20 0 6758700 1.926g 15980 S 0.0 6.2 0:02.39 java
1.4 使用printf “%x\n” 线程号将异常线程号转化为16进制
root@g_v_test_001:/# printf "%x\n" 86
56
2. jstack
root@g_v_test_001:/# jstack 18 | grep 56 -A20 > test.log
root@g_v_test_001:/# cat -n test.log
使用jstack 进程号|grep 56进制异常线程号 -A20来定位异常代码的位置(最后的-A20是日志行数,也可以输出为文本文件或使用其他数字)。可以看到异常代码的位置。
2.1 jstack 错误记录
root@g_v_test_001:/# jstack 18 | grep 56 -A20 > test.log
18: 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
这个错误可能是因为镜像使用了openjdk而不是原生java镜像,大多镜像都是经过优化,节省空间。所以没有很多功能。