问题描述
玩家反馈卡顿,运维查看进程占用发现程序CPU占用飙高,100%
解决步骤
第一步:top指令查看系统中各个进程CPU占用情况
[root@slave1 ~]# top
top - 01:06:38 up 99 days, 22:15, 2 users, load average: 2.17, 1.16, 0.61
Tasks: 300 total, 1 running, 299 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.6 us, 0.5 sy, 0.0 ni, 98.8 id, 0.1 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 32778440 total, 3785504 free, 4891728 used, 24101208 buff/cache
KiB Swap: 5242876 total, 5140732 free, 102144 used. 27369340 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
17619 root 20 0 11.7g 1.0g 18412 S 13.0 3.1 3:29.45 java
30563 root 20 0 123076 2764 1496 S 1.3 0.0 17:37.94 htop
950 root 20 0 340792 4960 3736 S 0.3 0.0 126:18.20 vmtoolsd
7023 root 20 0 0 0 0 S 0.3 0.0 0:00.19 kworker/5:2
23454 polkitd 20 0 3135868 1.0g 12292 S 0.3 3.2 991:46.29 mysqld
1 root 20 0 193852 6512 4224 S 0.0 0.0 1:06.11 systemd
第二步:找到占用CPU高的进程号,这里以17619为例。使用top -Hp [pid]查看对应进程中是哪些线程占用比例过高
[root@slave1 ~]# top -Hp 17619
top - 01:08:40 up 99 days, 22:17, 2 users, load average: 0.42, 0.82, 0.55
Threads: 153 total, 0 running, 153 sleeping, 0 stopped, 0 zombie
%Cpu(s): 1.6 us, 1.2 sy, 0.0 ni, 97.2 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 32778440 total, 3766400 free, 4910108 used, 24101932 buff/cache
KiB Swap: 5242876 total, 5140732 free, 102144 used. 27350964 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
19156 root 20 0 11.8g 1.0g 18428 S 6.2 3.2 0:00.19 场景定时事
19186 root 20 0 11.8g 1.0g 18428 S 6.2 3.2 0:00.44 场景公共驱
19198 root 20 0 11.8g 1.0g 18428 S 6.2 3.2 0:00.44 场景公共驱
19210 root 20 0 11.8g 1.0g 18428 S 6.2 3.2 0:00.43 场景公共驱
17619 root 20 0 11.8g 1.0g 18428 S 0.0 3.2 0:00.00 java
17625 root 20 0 11.8g 1.0g 18428 S 0.0 3.2 0:15.55 java
17626 root 20 0 11.8g 1.0g 18428 S 0.0 3.2 0:02.86 java
17627 root 20 0 11.8g 1.0g 18428 S 0.0 3.2 0:02.87 java
第三步:找到占用过高的线程以后,需要将对应的线程号,转换为十六进制数
[root@slave1 ~]# printf “%x\n” 19156
“4ad4n”
第四步:jstack登场
jstack 17619 | grep 0x4ad4n -A100
因为此处我这里的线程查询的时候没有占用资源,所以不显示!有问题的线程这里肯定会指出对应的问题代码,是哪个方法一直在占用的!
可能出现的问题
1、指令输入错误
Error attaching to core file: cannot open binary file
sun.jvm.hotspot.debugger.DebuggerException: cannot open binary file
at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal.attach0(Native Method)
at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal.attach(LinuxDebuggerLocal.java:286)
at sun.jvm.hotspot.HotSpotAgent.attachDebugger(HotSpotAgent.java:673)
at sun.jvm.hotspot.HotSpotAgent.setupDebuggerLinux(HotSpotAgent.java:611)
at sun.jvm.hotspot.HotSpotAgent.setupDebugger(HotSpotAgent.java:337)
at sun.jvm.hotspot.HotSpotAgent.go(HotSpotAgent.java:304)
at sun.jvm.hotspot.HotSpotAgent.attach(HotSpotAgent.java:156)
at sun.jvm.hotspot.tools.Tool.start(Tool.java:191)
at sun.jvm.hotspot.tools.Tool.execute(Tool.java:118)
at sun.jvm.hotspot.tools.JStack.main(JStack.java:92)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.tools.jstack.JStack.runJStackTool(JStack.java:140)
at sun.tools.jstack.JStack.main(JStack.java:106)
碰见这样的问题,肯定是输入的指令有问题了,一定要检查自己的指令输入!
2、系统参数设置问题
[root@slave1 ~]# sysctl -n kernel.yama.ptrace_scope
1
其中1表示未打开,0表示打开,我们需要将其设置为0
[root@slave1 ~]# sysctl -w kernel.yama.ptrace_scope=0
kernel.yama.ptrace_scope = 0
总结
遇到问题不要慌,chatGPT都出来了!哈哈