如何使用strace+pstack利器剖析器效能

來源:互聯網
上載者:User

引言

有時我們需要對程式進行最佳化、減少程式回應時間。除了一段段地對代碼進行時間複雜度分析,我們還有更便捷的方法嗎?

若能直接找到影響程式已耗用時間的函數調用,再有針對地對相關函數進行程式碼分析和最佳化,那相比漫無目的地看代碼,效率就高多了。

將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 grep0 S root 16739 22642 0 76 0 - 634 1024 14:26 pts/2 00:00:00 ./server# strace -o server.strace -Ttt -p 16739Process 16739 attached - interrupt to quit

 

稍等一段時間之後,我們將strace停掉, server.strace檔案中有以下輸出:

14:46:39.741366 select(8, [3 4], NULL, NULL, {1, 0}) = 1 (in [4], left {0, 1648}) <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, {SIG_DFL, [], 0}, 8) = 0 <0.000048>14:46:40.740715 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 <0.000046>14:46:40.740853 nanosleep({1, 0}, {1, 0}) = 0 <1.000276>14:46:41.741284 sendto(4, "hello\0", 6, 0, NULL, 0) = 6 <0.000111>

可以看到server接收資料之後(對應recvfrom調用),經過1s左右時間將訊息發出(對應sendto調用),從回應時間看,與抓包的結果吻合。又可以看出nanosleep系統調用耗費了1s時間。

因而可以斷定響應延時由nanosleep對應的函數調用造成。

那具體是哪一個函數調用呢?在strace輸出結果中並不能找到答案,因其輸出顯示都是系統調用,要顯示程式中函數調用棧資訊,就輪到pstack上場了。

 

pstack查看函數堆棧
pstack是一個指令碼工具,其核心實現就是使用了gdb以及thread apply all bt命令,下面我們使用pstack查看server進程函數堆棧:

# sh pstack.sh 16739#0 0x00002ba1f8152650 in __nanosleep_nocancel () from /lib64/libc.so.6#1 0x00002ba1f8152489 in sleep () from /lib64/libc.so.6#2 0x00000000004007bb in ha_ha ()#3 0x0000000000400a53 in main ()

從以上資訊可以看出,函數調用關係為:main->ha_ha->sleep,因而我們可以找到ha_ha函數進行分析和最佳化修改。

小結
本文通過一個server/client程式案例,說明了使用strace和pstack分析響應延時的方法。

由最初server端響應慢現象,到使用strace跟蹤出具體耗時的系統調用,再到使用pstack查到程式中具體的耗時函數,一步步找到了影響程式已耗用時間的程式碼。

更多地瞭解底層,從作業系統層面著手,更有助於程式效能分析與最佳化。

 

本文中使用的server/client程式和pstack指令碼可從這裡下載。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.