一,結合linux基本命令和jmap,jstack等工具。
- 根據top命令,發現PID爲28555的Java進程佔用CPU高達200%,出現故障。
- 通過ps aux | grep PID命令,可以進一步確定是哪個進程出現了問題。怎麼定位到具體線程或者代碼呢?
- 顯示當前java進程的線程列表
ps -mp pid -o THREAD,tid,time
從中可以找到了耗時最高的線程28802。
- 其次將需要的線程ID轉換爲16進制格式:
printf "%x\n" tid
- 本地打印線程的堆棧信息*(注意主工程由於{}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