在工作当中,肯定会遇到由代码所导致的高CPU耗用以及内存溢出的情况。这种情况发生时,我们怎么去找出原因并解决。
一般解决方法是通过top命令找出消耗资源高的线程id,利用strace命令查看该线程所有系统调用
1. 通过top命令找到可疑进程PID
op - 01:25:27 up 106 days, 10:41, 3 users, load average: 6.65, 4.58, 4.45
Tasks: 448 total, 1 running, 447 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.7%us, 0.4%sy, 0.0%ni, 98.6%id, 0.0%wa, 0.0%hi, 0.2%si, 0.0%st
Mem: 32862888k total, 32513500k used, 349388k free, 253228k buffers
Swap: 4095992k total, 0k used, 4095992k free, 19249260k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
24138 apache 20 0 1273m 384m 3668 S 103.319.01232:39 java
32383 mysql 20 0 21.0g 6.6g 4752 S 10.6 21.1 75:50.50 mysqld
10453 zabbix 20 0 230m 21m 19m S 2.0 0.1 8:47.81 zabbix_server
10455 zabbix 20 0 230m 21m 19m S 2.0 0.1 8:47.02 zabbix_server
10474 zabbix 20 0 135m 17m 15m S 1.7 0.1 5:41.90 zabbix_server
10457 zabbix 20 0 230m 21m 19m S 1.3 0.1 8:49.65 zabbix_server
10456 zabbix 20 0 230m 21m 19m S 0.7 0.1 8:53.36 zabbix_server
10460 zabbix 20 0 135m 2024 1028 S 0.3 0.0 0:11.94 zabbix_server
从上面命令中可以看出java进程CPU利用率一直保持100%,稳居不下,找到PID 24138
2. 找出消耗资源最高的线程
top -H -p 24138 可以不用第一步,直接执行命令 top -H ,就可以查看到消耗资源最高的线程
3. 查看这个线程所有系统调用
strace -p 24167
通过这3步基本可以找出什么原因导致java进程占用那么高CPU资源。