性能分析之CPU分析-從CPU調用高到具體代碼行(C/C++)


今天在培訓的過程中,也提到了分析要具體到代碼的事情,如果思路方向是正確的,對java應用和C/C++應用來說,也是幾個命令就可以跳到代碼行了。前提是要能看得懂堆棧信息。所以一直以來我在講課的過程中都有畫過這樣的一個分析思路的圖。

 

在性能分析中,如果是C/C++的應用的話,也同樣是有些工具可以做得到的。

今天我們來看一個簡單的C代碼示例,看下如何做到這幾步。我在網上看到有一段示例代碼,也省得自己寫了。就直接拿來編譯用了。下面來看一下操作。

[root@7dgroup Sample6]# gcc -o test6 -g test6.c

編譯的時候記得加-g的參數,可以生成調試信息。

[root@7dgroup Sample6]# ./test6

運行起來:

[root@7dgroup Sample6]# ./test6

返回值 :3

返回值 5

返回值 :5

返回值 7

返回值 :7

返回值 9

執行過程會產生這樣的數據。同時查看top。

看到31356這個進程已經消耗了CPU。因為這個進程非常的簡單,所以這里我就不再細化到線程級了。直接打堆棧看了。

(如果是復雜的應用的話,在這一步,還要再細化一步的就是打印線程級的狀態。方法有多種,可以用top -H,也可以pidstat,也可以用調試工具attach上去再查threaddump。總之選擇自己喜歡的方式就好。)

直接gstack打印堆棧。

[root@7dgroup ~]# gstack 31356

#0  0x00000000004005ed in function2 (input=963) at test6.c:4

#1  0x000000000040065b in function1 (a=9, b=10) at test6.c:21

#2  0x00000000004006e8 in main () at test6.c:39

當然你也可以pstack打印堆棧(因為我重新運行了一次,所以PID變了)。

[root@7dgroup ~]# pstack 31438

#0  0x0000000000400620 in function3 (input=3524) at test6.c:14

#1  0x000000000040067e in function1 (a=5, b=6) at test6.c:25

#2  0x00000000004006e8 in main () at test6.c:39

 

通過堆棧信息就可以看出來,這里面只有一個線程,並且調用關系是:

第一次打印的堆棧是:39行 -> 21行 -> 4行

第二次打印的堆棧是:39行 -> 25行 -> 14行

(因為是同一個文件,所以我只寫行號了)。

 

這樣就可以在C/C++的應用中從CPU分析到具體的代碼行了。

 

    再重復強調,分析思路的完整性非常重要。要先知道想看什么數據,才能知道用什么工具去做。會工具沒什么了不起,但是把原理搞清楚又能融會貫通才是真的厲害。

    可能有人會說,我連工具都不知道怎么用,怎么知道看什么數據呢。看似悖論的一個問題,實際上就是經驗不足,需要多學習基礎的知識。

    比如說,了解了linux上運行java語言的分析過程,那其他的分析過程也是類似的,只是工具不同。並不是說只會分析linux上運行java,換成HPunix+C/C++就沒有思路了。

 

    就像小學做的數學題一樣:一行有四棵樹,總共四行,共有幾棵樹?16棵!        但是把樹換成電線桿就有人不會算了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM