一、背景
Linux系統出現性能瓶頸時,往往因個別函數長時間占用CPU造成,解決問題的第一步就是定位到引起問題的函數,perf就是這樣的工具,它是Linux內核源碼提供的工具。
二、核心概念
- 數據采集
perf通過采樣的方式,記錄CPU正在執行的函數名及函數的調用棧,通常采樣頻率是每秒99次,perf的數據采集有額外性能開銷,所以不宜長時間使用。
perf命令說明:
sudo perf record -F 99 -p 13204 -g -- sleep 30
# record 表示記錄cpu的執行數據
# -F:采樣頻率(次/秒)
# -p:進程號
# -g:輸出調用棧數據
# -- sleep:本次采樣總時長(秒)
-
數據處理
perf往往輸出一個龐大的數據,肉眼無法直接分析,需要借助可視化工具FlameGraph將數據轉換位瀏覽器可讀的svg文件再供人眼閱讀。 -
火焰圖
X軸:被采集命中的調用次數,在這個方向上若某個幀越寬,表示被采樣命中的次數越多,其占用cpu的時間也就越長。
Y軸:調用棧,每一幀代表一個函數調用,越上層的越先返回,最頂層的就是正在執行的,只有頂幀才具有分析價值。
注意:
1.用戶可以用鼠標閱讀火焰圖中棧幀的信息,還可以進行一些簡單操作。
2.火焰圖中棧與棧幀的顏色沒有特殊含義。
3.在X軸方向上,函數是按字母順序排列的,而不是時間。
- 若火焰圖中出現平頂的棧,則說明這個棧的頂幀函數比較耗時,它就是性能分析的重點。
- 火焰圖的局限性:
1.調用棧很深時,perf只能返回局部的棧,不能提供完整的調用數據。
2.對於匿名函數,系統會以內存地址給函數命名,存在隨機性,可讀性差,定位困難。
三、案例實踐
- 安裝perf
yum list perf
yum -y install perf.x86_64
- 由於需要到github下載可視化分析工具FlameGraph,所以要先安裝git
yum list git
yum -y install git.x86_64
git clone https://github.com/JaxYoun/FlameGraph.git
mv FlameGraph fg //方便起見,重命名FlameGraph目錄
- 采集、轉換、可視化【root權限】
perf record -F 99 -p 18733 -g -- sleep 30
perf script -i perf.data &> perf.unfold
fg/stackcollapse-perf.pl perf.unfold &> perf.folded
fg/flamegraph.pl perf.folded > perf.svg
- 將perf.svg下載到本地用Chrome瀏覽器打開即可閱讀。