perf的全稱是Performance Event,在2.6.31版本後的Linux核心中均有整合,是Linux自帶的強力效能分析工具,使用現代處理器中的特殊硬體PMU(Performance Monitor Unit,效能監視單元)和核心效能計數器統計效能資料。
perf的工作方式是對執行中的程序按一定頻率進行中斷取樣,獲取當前執行的函數名及呼叫棧。如果大部分的取樣點都落在同一個函數上,則表明該函數執行的時間較長或該函數被頻繁呼叫,可能存在效能問題。
1、終端輸入perf,根據提示進行安裝
2、輸入perf得到 usage: perf [–version] [–help] [OPTIONS] COMMAND [ARGS]…
表示安裝成功
安裝完成後,開始正式使用perf工具。
1、使用perf需要首先對目標程序進行取樣:
$ sudo perf record -F 1000 -p pidof fisco-bcos
-g – sleep 60
在上述命令中, 我們使用perf record指定記錄效能的統計資料;使用-F指定取樣的頻率為1000Hz,即一秒鐘取樣1000次;使用-p指定要取樣的程序ID(既fisco-bcos的程序ID),我們可以直接通過pidof命令得到;使用-g表示記錄呼叫棧資訊;使用sleep指定取樣持續時間為60秒。
可能出現的錯誤:Workload failed: No such file or directory
解決方法:
在終端輸入ps檢視當前程序的快照狀態
重新數入命令列,將pidof fisco-bcos
改為需要取樣的程序ID
sudo perf record -F 10000 -p 4569 -g – sleep 60
輸出為:
待取樣完成後,perf會將採集到的效能資料寫入當前目錄下的perf.data檔案中。
Ps:我在取樣前建立了perf資料夾,在裡面執行了採集命令,所以我的採集資料會在perf資料夾下。
2、在取樣資料的資料夾下執行$ perf report -n
上述命令會讀取perf.data並統計每個呼叫棧的百分比,且按照從高到低的順序排列,如下圖所示:
可能出現的問題:
failed to open perf.data: Permission denied
解決方法:
sudo perf report -n
以上資訊已足夠豐富,但可讀性仍然不太友好。儘管範例中perf的用法較為簡單,但實際上perf能做的遠不止於此。配合其他工具,perf取樣出的資料能夠以更加直觀清晰的方式展現在我們面前,這便是我們接下來要介紹的效能分析神器——火焰圖。
火焰圖,即Flame Graph,藉由系統效能大牛 Brendan Gregg提出的動態追蹤技術而發揚光大,主要用於將效能分析工具生成的資料進行視覺化處理,方便開發人員一眼就能定位到效能問題所在。火焰圖的使用較為簡單,我們僅需將一系列工具從github上下載下來,置於本地任一目錄即可:
wget https://github.com/brendangregg/FlameGraph/archive/master.zip
unzip master.zip
當我們發現FISCO BCOS效能較低時,直覺上會想弄清楚到底是哪一部分的程式碼拖慢了整體速度,CPU是我們的首要考察物件。
首先使用perf對FISCO BCOS程序進行效能取樣:(上面已經講述過)
1.cd FlameGraph-master/
2.sudo perf record -F 10000 -p 4569 -g – sleep 60
執行完畢生成perf.data檔案
sudo perf script > cpu.unfold
會生成cpu.unfold檔案
中間有報錯,不知道什麼原因,我暫時忽略了。
Failed to open /home/hehongyu/fisco/nodes/127.0.0.1/fisco-bcos, continuing without symbols
生成了取樣資料檔案後,接下來呼叫火焰圖工具生成火焰圖:
sudo ./stackcollapse-perf.pl cpu.unfold > cpu.folded
生成 cpu.folded檔案
sudo ./flamegraph.pl cpu.folded > cpu.svg
縱軸表示呼叫棧。每一層都是一個函數,也是其上一層的父函數,最頂部就是取樣時正在執行的函數,呼叫棧越深,火焰就越高。
橫軸表示抽樣數。注意,並不是表示執行時間。若一個函數的寬度越寬,則表示它被抽到的次數越多,所有呼叫棧會在彙總後,按字母序列排列在橫軸上。
火焰圖使用了SVG格式,可互動性大大提高。在瀏覽器中開啟時,火焰的每一層都會標註函數名,當滑鼠懸浮其上,會顯示完整的函數名、被抽樣次數和佔總抽樣字數的百分比,如上圖。