Linux下如何定位高CPU/Memory的代碼段

    先前自開發的過程當中解決過一個CPU使用太高的問題,沒有記錄,今天以FreeSWITCH爲例,把解決的過程寫下來,方便之後有相似問題參考解決。函數

    注:由於不是真正解決問題的過程,因此CPU的數據會和真實的有差距。線程

    一、咱們發現正在運行的FreeSWITCH程序佔用的CPU太高,須要肯定哪段代碼引發,首先,找到FS的進程號:進程

          

二、經過top -H -p產看進程中全部線程對應的線程:內存

    

上圖全部的線程CPU是同樣的,由於沒有電話進來,若是有錯誤,會有對應的線程CPU太高。開發

三、經過GBD獲取對應的堆棧,gdb attach 18258,並經過infor threads命令得到全部的線程以下圖:源碼

從上圖中咱們能夠看到gdb裏面對應的thread號碼1-34與系統中線程號18258到18311的對應關係。it

四、假如前面經過top -H -p查看到得CPU使用太高的線程爲:18312,那麼對應的號碼爲:9.咱們能夠經過GDB中的 thread 9切換到線程的堆棧中,並經過 bt 命令產看目前的堆棧信息。具體的以下圖:thread

    

五、經過strace產看程序中,哪些調用佔用的時間最長,並對着堆棧和源碼找出緣由。(注:由於我截圖的FS沒有問題,因此看到的是正常的值)select

      命令以下:strace -c -f -T -p 18258程序

     效果圖以下:

    

由於程序運行是正常的,因此全部的時間都在 select/epoll_wait/read等系統調用上,若是異常的話,會有其餘函數出現。

總結:這個文章講解一個解決CPU太高或者內存太高的一個思路,具體的問題須要具體分析。

相關文章
相關標籤/搜索