詳解進程棧分析的兩個命令:Pstack和Starce
概述
今天主要分享兩個命令,比較多用來分析進程具體調用,平時排查問題會用到比較多的。
pstack
pstack用來跟蹤進程棧,這個命令在排查進程問題時非常有用,比如我們發現一個服務一直處于work狀態(如假死狀態,好似死循環),使用這個命令就能輕松定位問題所在;可以在一段時間內,多執行幾次pstack,若發現代碼棧總是停在同一個位置,那個位置就需要重點關注,很可能就是出問題的地方;
1、安裝pstack
- yum install *pstack* -y

2、分析mysql進程
- ps -ef|grep mysql

3、將進程的棧跟蹤信息寫入文件pstack.log
- pstack 2313 >> pstack.log
- pstack 2313 >> pstack.log
- pstack 2313 >> pstack.log

4、如下所示,可以看到函數調用關系為:_start->__libc_start_main->connection_event_loop->listen_for_connection_event->poll.

strace
strace常用來跟蹤進程執行時的系統調用和所接收的信號。 在Linux世界,進程不能直接訪問硬件設備,當進程需要訪問硬件設備(比如讀取磁盤文件,接收網絡數據等等)時,必須由用戶態模式切換至內核態模式,通過系統調用訪問硬件設備。strace可以跟蹤到一個進程產生的系統調用,包括參數,返回值,執行消耗的時間。
1、安裝strace
- yum install -y strace

2、strace分析
- strace cat /dev/null

這里每一行都是一條系統調用,等號左邊是系統調用的函數名及其參數,右邊是該調用的返回值。 strace 顯示這些調用的參數并返回符號形式的值。
strace 從內核接收信息,而且不需要以任何特殊的方式來構建內核。
3、跟蹤可執行程序
- strace -f -F -o ~/straceout.txt myserver
-f -F選項告訴strace同時跟蹤fork和vfork出來的進程,-o選項把所有strace輸出寫到~/straceout.txt里 面,myserver是要啟動和調試的程序。
4、跟蹤服務程序
- strace -o output.txt -T -tt -e trace=all -p 2313
跟蹤2313進程的所有系統調用(-e trace=all),并統計系統調用的花費時間,以及開始時間(并以可視化的時分秒格式顯示),最后將記錄結果存在output.txt文件里面。
