引言
有時我們需要對程式進行優化、減少程式響應時間。除了一段段地對**進行時間複雜度分析,我們還有更便捷的方法嗎?
若能直接找到影響程式執行時間的函式呼叫,再有針對地對相關函式進行**分析和優化,那相比漫無目的地看**,效率就高多了。
將strace和pstack工具結合起來使用,就可以達到以上目的。strace跟蹤程式使用的底層系統呼叫,可輸出系統呼叫被執行的時間點以及各個呼叫耗時;pstack工具對指定pid的程序輸出函式呼叫棧。
下面我們通過乙個簡單的訊息收發程式,說明使用strace、pstack進行程式分析的具體方法。
程式說明
該程式是乙個簡單的socket程式,由server/client組成。server端監聽某埠,等待client的連線,client連線server後定時向server傳送訊息,server每接收一條訊息後向client傳送響應訊息。程式server與client互動如下圖示:
在程式執行起來之後,發現server接收到client的submit訊息之後,需要較長時間才發出resp響應。通過tcpdump抓包發現,time2與time1的時間間隔在1s左右:
由上初步分析可知,訊息響應慢是server端程式問題。下面我們來看如何使用strace和pstack分析server端程式響應慢的原因。
strace檢視系統呼叫
首先我們拉起server/client程式,並使用strace對server程序進行跟蹤:
# ps -elf | grep server | grep -v grep稍等一段時間之後,我們將strace停掉, server.strace檔案中有以下輸出:0 s root 16739
22642076
0 - 634
1024
14:26 pts/2
00:00:00 ./server
# strace
-o server.strace -ttt -p 16739
process
16739 attached - interrupt to quit
14:46:39.741366可以看到server接收資料之後(對應recvfrom呼叫),經過1s左右時間將訊息發出(對應sendto呼叫),從響應時間看,與抓包的結果吻合。又可以看出nanosleep系統呼叫耗費了1s時間。select(8, [3
4], null, null, ) = 1 (in [4], left ) <0.998415>
14:46:40.739965 recvfrom(4, "
hello
", 6, 0, null, null) = 5
<0.000068>
14:46:40.740241 write(1, "
hello\n
", 6) = 6
<0.000066>
14:46:40.740414 rt_sigprocmask(sig_block, [chld], , 8) = 0
<0.000046>
14:46:40.740565 rt_sigaction(sigchld, null, , 8) = 0
<0.000048>
14:46:40.740715 rt_sigprocmask(sig_setmask, , null, 8) = 0
<0.000046>
14:46:40.740853
nanosleep(, ) = 0
<1.000276>
14:46:41.741284 sendto(4, "
hello\0
", 6, 0, null, 0) = 6
<0.000111>
因而可以斷定響應延時由nanosleep對應的函式呼叫造成。
那具體是哪乙個函式呼叫呢?在strace輸出結果中並不能找到答案,因其輸出顯示都是系統呼叫,要顯示程式中函式呼叫棧資訊,就輪到pstack上場了。
pstack檢視函式堆疊
# sh pstack.sh 16739#0從以上資訊可以看出,函式呼叫關係為:main->ha_ha->sleep,因而我們可以找到ha_ha函式進行分析和優化修改。0x00002ba1f8152650
in __nanosleep_nocancel () from /lib64/libc.so.6#1
0x00002ba1f8152489
in sleep () from /lib64/libc.so.6#2
0x00000000004007bb
inha_ha ()#3
0x0000000000400a53
in main ()
小結
本文通過乙個server/client程式事例,說明了使用strace和pstack分析響應延時的方法。
由最初server端響應慢現象,到使用strace跟蹤出具體耗時的系統呼叫,再到使用pstack查到程式中具體的耗時函式,一步步找到了影響程式執行時間的程式**。
更多地了解底層,從作業系統層面著手,更有助於程式效能分析與優化。
如何使用strace pstack利器分析程式效能
引言 有時我們需要對程式進行優化 減少程式響應時間。除了一段段地對 進行時間複雜度分析,我們還有更便捷的方法嗎?若能直接找到影響程式執行時間的函式呼叫,再有針對地對相關函式進行 分析和優化,那相比漫無目的地看 效率就高多了。將strace和pstack工具結合起來使用,就可以達到以上目的。strac...
使用strace pstack利器分析程式效能
引言 有時我們需要對程式進行優化 減少程式響應時間。除了一段段地對 進行時間複雜度分析,我們還有更便捷的方法嗎?若能直接找到影響程式執行時間的函式呼叫,再有針對地對相關函式進行 分析和優化,那相比漫無目的地看 效率就高多了。將strace和pstack工具結合起來使用,就可以達到以上目的。strac...
如何使用strace pstack利器分析程式效能
引言 有時我們需要對程式進行優化 減少程式響應時間。除了一段段地對 進行時間複雜度分析,我們還有更便捷的方法嗎?若能直接找到影響程式執行時間的函式呼叫,再有針對地對相關函式進行 分析和優化,那相比漫無目的地看 效率就高多了。將strace和pstack工具結合起來使用,就可以達到以上目的。strac...