程序代碼調優工具perf學習記錄

perf工具學習記錄

簡介

一、6.31及後續版本的Linux內核自帶工具php

二、Perf適用於什麼場景html

算法優化(空間複雜度、時間複雜度)、代碼優化(提到執行速度、減小內存佔用) 評估程序對硬件資源的使用狀況,例如各級cache的訪問次數,各級cache的丟失次數、流水線停頓週期、前端總線訪問次數等。 評估程序對操做系統資源的使用狀況,系統調用次數、上下文切換次數、任務遷移次數。 三、perf工具的基本原理前端

a、基於內核,內核版本在 2.6.31以後的均可以進入源碼 linux/tool/perf編譯安裝linux

b、功能:git

perf須要root才能執行,由於他工做在內核級別;
在系統級別對硬件性能數據進行採樣,監控CPU/內存等各類性能指標;
特色:無損代碼;系統級別;須要硬件和系統支持(cpu指令集等)

c、工做原理:github

perf工具是根據事件來進行採樣。(事件:程序內部的中斷等事件)算法

具體支持的事件能夠用以下命令查看:perf listdocker

主要有三種事件:負載均衡

1) Hardware Event 是由 PMU 硬件產生的事件,好比 cache 命中,當須要瞭解程序對硬件特性的使用狀況時,便須要對這些事件進行採樣;frontend

2)Software Event 是內核軟件產生的事件,好比進程切換,tick 數等 ;

3)Tracepoint event 是內核中的靜態 tracepoint 所觸發的事件,這些 tracepoint 用來判斷程序運行期間內核的行爲細節,好比 slab 分配器的分配次數等。

監控原理:

perf 會經過系統調用sysperfevent_open在內核中註冊一個監測「cycles」事件的性能計數器。內核根據perf 提供的信息在PMU 上初始化一個硬件性能計數器(PMC: Performance Monitoring Counter)。PMC隨着CPU 週期的增長而自動累加。在PMC 溢出時,PMU 觸發一個PMI(Performance Monitoring Interrupt)中斷。內核在PMI 中斷的處理函數中保存PMC 的計數值,觸發中斷時的指令地址(Register IP:Instruction Pointer),當前時間戳以及當前進程的PID,TID,comm 等信息。咱們把這些信息統稱爲一個採樣(sample)。內核會將收集到的sample 放入用於跟用戶空間通訊的Ring Buffer。用戶空間裏的perf 分析程序採用mmap 機制從ring buffer 中讀入採樣,並對其解析。perf 根據pid,comm 等信息能夠找到對應的進程。根據IP 與ELF 文件中的符號表能夠查到觸發PMI 中斷的指令所在的函數。爲了可以使perf 讀到函數名,咱們的目標程序必須具有符號表。若是讀者在perf 的分析結果中只看到一串地

址,而沒有對應的函數名時,一般是因爲在編譯時利用strip 刪除了ELF 文件中的符號表。

符號表: readelf –s xxx 能夠查看

文件中的"符號表"(symbol table)中所包含的信息用於定位和重定位程序中的符號定義和符號引用;目標文件中的其它部分經過一個符號在這個表中的索引值來使用該符號;索引值從0開始計數,但值爲0的索引表項(即第一項)並無實際的意義,它表示未定義的符號;用常量STN_UNDEF來表示未定義的符號;

一般來說,字符串、常量變量、函數名等的索引值;在編譯時若是用strip則會刪除符號表;

typedefstruct {

Elf32_Word st_name;

Elf32_Addr st_value;

Elf32_Word st_size;

unsigned char st_info;

unsigned char st_other;

Elf32_Half st_shndx;

}Elf32_Sym;
示例

基本用法

五、常規用法介紹

a) perf list:列出全部事件類型

b) perf top:相似top的全局監控工具

c) perf stat:對某個程序或者特定進程進行監控

d) perf record & perf report:先記錄再經過詳細報告的形式打印事件信息

e) Perf timechart:將統計的數據直接顯示爲矢量圖;直觀且詳細

f) perf diff Read two perf.data files and display the differential profile

六、 PMU/PMI/PMC:

a) PMU:Performance Monitor Unit,性能監視單元,其實CPU提供的一個單元,屬於硬件的範疇。經過訪問相關的寄存器能讀取到CPU的一些性能數據,目前大部分CPU都會提供相應的PMU

b) PMI: Performance Monitoring Interrupt

c) PMC: Performance Monitoring Counter硬件性能計數器

簡單實踐

七、簡單實操:

例子: 10.187.6.97 dwlogudpd2 進程id:480,通常在性能測試用例執行時同步採樣;

a、宏觀觀察,根據pid查看進程宏觀表現

task-clock : cpu利用率,在採樣時間內,所佔用的cpu用於計算,而不是用來作其餘事(I/O)的時間的,單位是毫秒;上圖爲 8785.89974778ms;,倒數第二列爲在整個採樣時間佔得百分比(8785.974778 / 125.592276887*1000),越高越好;

------------ 在採樣週期中,pid佔用cpu的時間的0.07%爲計算時間,其餘爲cpu等待/切換等耗時;

context-switches:記錄進程上下文切換的次數,越少越好;上圖,平均值 0.153*106/秒

cpu-migrations:發生了多少次cpu切換,從一個內核切換到另外一個內核;

page-faults: 缺頁異常

------------ linux內存管理爲分頁機制, 當應用程序請求的頁面還沒有創建、請求的頁面不在內存中、或者請求的頁面雖然在內存中,但還沒有創建物理地址與虛擬地址的映射關係時,都會觸發一次缺頁異常(page‐fault)。內核在捕獲缺頁異常時,根據異常種類進行相應的處理。

cycles:執行了多少個處理器時鐘週期,一個cpu指令可能㤇多個時鐘週期(能夠從intel/AMD所支持的cpu指令集中查看)

------------ 時鐘週期

stalled-cycles-frontend : 咱們機器硬件不支持,暫未研究

stalled-cycles-backend :咱們機器硬件不支持,暫未研究

instructions :執行了多少個cpu指令

branches:程序在執行期間遇到的分支指令數;

------------- 分支指令:

branch-misses:預測錯誤的分支指令數;上圖 0.49%的分之預測失誤率;分之預測失效率越高表明有問題;

-------------- PS:處理器的分支預測機制與OOO機制(Out‐of‐Order):

上面這張圖能夠看到進程佔用的cpu時間大部分並未用來計算,而是用來作其餘事情;

b、使用top指定pid進一步查看這個進程都在幹什麼

上面這張圖是一張試試採集數據的累積統計顯示圖;

------------- 右面第一列爲符號名,也就是函數名。
左面第一列爲該符號引起的性能事件在整個監測域中佔的比例,爲該符號的熱度。
監測域是指perf 監控的全部符號。默認狀況下包括系統中全部進程、內核以及內核模塊的函數。
左面第二列爲該符號所在的DSO。DSO 即動態共享對象(Dynamic Shared Object)的縮寫。
第3 列爲DSO 的類型。
perf 中DSO 共有5種類型,分別是:ELF 可執行文件,動態連接庫,內核,內核模塊,VDSO 等。
當第3列爲[.]時表示此符號屬於用戶態的ELF 文件(包括可執行文件與動態連接庫)。
爲[k]表示此符號屬於內核或內核模。

c、進入對應的函數,看看函數裏面在機器底層都在幹神馬; 下面是選擇上圖3個進程,前2個爲耗時前2名,第三個是dwlogudpd2進程自己函數佔用最高的第一名

18.60% [kernel] [k] findbusiestgroup :

Kernel : 說明是系統函數;

findbusiestgroup是linux系統用來內核用來作內核間的負載均衡的其中一個函數,用來找出最忙的內核;位置在:

kernel/sched.c --> loadbalancenewidle()

0.67% dwlogudpd2 [.] boss::EpollReactor::DoWaitForEvents(unsigned int, std::list<int, std::allocator >&)

d、在上圖中,選中對應函數,回車進入,選擇annotate便可看到下圖 以默認性能事件cycles(CPU 週期數)進行的性能剖析,即一個cpu週期中所執行的彙編指令或其餘函數統計;

上圖能夠看到在boss::EpollReactor::DoWaitForEvents函數調用了哪些其餘的函數,執行了哪些彙編指令;

------------- 內核函數沒法查看其內部彙編指令耗時,只有用戶進程才能夠看獲得

callq表示其中調用了其餘函數;左邊第一列爲百分比;第二列爲彙編指令或調用其餘函數 ,第三列爲彙編指令值或函數名;

----------- 從上圖能夠直觀看到對應的熱點函數;結合代碼即便可進行定位;

perf timechart --- 生成矢量圖,可是貌似docker收集不到數據,查資料聽說是與glibc庫有關。。待實體機進行嘗試;

------------- 生成的圖片相似下面這種,ps,docker生成不了,只是從網上的其它高手的示例圖

參考文章

https://perf.wiki.kernel.org/index.php/Main_Page

http://linuxwiki.github.io/PerformanceTools/perf.html

http://www.voidcn.com/blog/mtofum/article/p-1399067.html

http://zhengheng.me/2015/11/12/perf-stat/

http://blog.csdn.net/gengshenghong/article/details/7383438

http://www.ibm.com/developerworks/cn/linux/l-cn-perf1/

http://www.ibm.com/developerworks/cn/linux/l-cn-perf2/

http://wenku.baidu.com/link?url=qc8zgDZnqIHNtHPJSPNWpbwgMpeYro4JYbWxR7pzqxwIMLOqNH7QMWSYvtb7xV2RM-4KLd7e0rZ9Ton1NhLZoYmIuNC4iIrJ2LKYejW

http://www.2cto.com/os/201507/418578.html

http://www.cnblogs.com/vinozly/p/5589032.html

http://blog.csdn.net/21aspnet/article/details/1534304

相關文章
相關標籤/搜索