进程cpu过高问题排查

一,结合linux基本命令和jmap,jstack等工具。 

  1. 根据top命令,发现PID为28555的Java进程占用CPU高达200%,出现故障。

 

  1. 通过ps aux | grep PID命令,可以进一步确定是哪个进程出现了问题。怎么定位到具体线程或者代码呢? 
  2. 显示当前java进程的线程列表

ps -mp pid -o THREAD,tid,time

从中可以找到了耗时最高的线程28802。 

  1. 其次将需要的线程ID转换为16进制格式:

printf "%x\n" tid

 

  1. 本地打印线程的堆栈信息*(注意主工程由于{}JVM Xms{}设置非常大,不可线上运行时执行!*

jstack pid |grep tid -A 30

这样,对应异常找到出现问题的代码。 

 

二,linux常用确认服务状态命令。

统计tcp连接状态: netstat -n | awk '/^tcp/ {++S[$NF]} END{for(a in S) print a, S[a]}'

统计用户进程当前操作句柄数:lsof -n|awk '{print $2}|'|sort|uniq -c |sort -nr|more

统计用户进程内部执行的线程数:ps -eLf|grep java|wc --l

查看运行时进程参数设置:cat /proc/pid/limits,cpuset及coredump_filter

查看当前某端口连接数:netstat -nat|grep -i  "80" |wc -l 

对连接的IP按连接数量进行排序:netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n (运维操作已放弃netstat,改为ss命令入侵更轻量)

Tcpdump访嗅访问数据包最高请求:tcpdump -i eth0 -tnn dst port 80 -c 1000

猜你喜欢

转载自sharp-fcc.iteye.com/blog/1783063