1、首先使用top命令定位到CPU占用高的進程PID
執行top命令,列出所有進程的情況,然后按大寫的'P',按CPU占用大小降序顯示進程信息
2、獲取線程信息,並找到CPU占用高的線程
ps -mq pid -o THREAD,tid,time | sort -rn
3、將需要的線程ID轉換為16進制格式
printf "%x\n" tid
4、使用pstack打印進程堆棧信息
pstack
是一個shell腳本,用於打印正在運行的進程的棧跟蹤信息,它實際上是gstack
的一個鏈接,而gstack本身是基於gdb封裝的shell腳本。此命令可顯示每個進程的棧跟蹤。pstack 命令必須由相應進程的屬主或 root 運行。pstack
是gdb的一部分,如果系統沒有pstack命令,使用yum搜索安裝gdb
即可
這個命令在排查進程問題時非常有用,比如我們發現一個服務一直處於work狀態(如假死狀態,好似死循環),使用這個命令就能輕松定位問題所在;可以在一段時間內,多執行幾次pstack,若發現代碼棧總是停在同一個位置,那個位置就需要重點關注,很可能就是出問題的地方。如:
pstack pid > 1.txt; pstack pid > 2.txt; pstack pid > 3.txt;
可查看1.txt,2.txt和3.txt文件中對應線程ID的堆棧情況,有時pstack並不能一次抓到有用的信息,多執行幾次試試。
注:pstack打印的線程ID為16進制的
5、補充
ps -eLo pid,lwp,pcpu |grep pid
另外也可使用如上簡單的命令定位到哪段程序可能存在性能問題:獲取進程ID,通過pstack命令查看其中各個線程id以及對應的線程現在正在做的事情,分析多組數據就可以定位到哪些線程里有慢操作影響了服務器的性能,從而得到解決方案:
由此可以判斷LWP 30222這個線程產生了性能問題,執行時間長達31.4毫秒,再觀察其堆棧信息,停留在如下幾個語句,只需要簡單排查就可知道問題瓶頸。