perf性能分析工具
一、介紹
perf用法perf Examples
程序示例
火焰圖Linux C/C++性能優(yōu)化分析工具Perf使用教程-嗶哩嗶哩
perf是一個(gè)性能分析工具。可以知道哪些函數(shù)調(diào)用次數(shù)多導(dǎo)致性能消耗大。
二、安裝
2.1 安裝
perf工具跟內(nèi)核版本強(qiáng)相關(guān),需要安裝linux-tools-common。安裝步驟:
apt-get update
apt-get install linux-tools-common
apt-get install linux-tools-generic linux-cloud-tools-generic
2.2 運(yùn)行可執(zhí)行文件
可以直接使用安裝的路徑運(yùn)行
# /usr/lib/linux-tools/5.15.0-152-generic/perf --version
perf version 5.15.185
也可以設(shè)置軟鏈接。不同內(nèi)核版本目錄5.15.0-152-generic會(huì)有所區(qū)別。
ln -s /usr/lib/linux-tools/5.15.0-152-generic/perf /usr/bin/perf
注:如果/usr/bin/下本來(lái)就有perf文件則會(huì)報(bào)錯(cuò),說(shuō)明已經(jīng)安裝過。
// 報(bào)錯(cuò)提示
# perf --version
WARNING: perf not found for kernel 5.15.0-60
You may need to install the following packages for this specific kernel:
linux-tools-5.15.0-60-generic
linux-cloud-tools-5.15.0-60-generic
You may also want to install one of the following packages to keep up to date:
linux-tools-generic
linux-cloud-tools-generic
三、使用方法
初學(xué)時(shí)可以找個(gè)簡(jiǎn)單的程序理解perf的用法。我用附錄中的演示程序?yàn)槔v解perf的使用方法。
3.1 查詢需要監(jiān)控的進(jìn)程ID
perf是監(jiān)控進(jìn)程號(hào)的,所以先用ps命令查詢得到進(jìn)程ID。
# ps -ef | grep process_print
root 14712 7403 99 14:54 ? 01:52:17 ./process_print
3.2 perf監(jiān)控進(jìn)程
perf record -p 14712 -g
收集一段時(shí)間可以Ctrl+C退出監(jiān)控。
3.3 perf生成報(bào)告
perf report -g
# ls
perf.data
3.3.1 將perf數(shù)據(jù)生成生成文本
方法2:轉(zhuǎn)成文本可以直接看函數(shù)的占比。
// 生成perf數(shù)據(jù)txt
perf report -i perf.data > perf.txt
# ls
perf.data perf.txt
3.3.2 將perf數(shù)據(jù)生成生成火焰圖
- 火焰圖環(huán)境安裝
生成火焰圖只需要一些腳本將數(shù)據(jù)繪圖。這些腳本下載
git clone https://github.com/brendangregg/FlameGraph.git
# ls
FlameGraph perf.data
- 將perf數(shù)據(jù)繪制成火焰圖
perf script -i perf.data > perf.unfold
FlameGraph/stackcollapse-perf.pl perf.unfold > perf.folded
FlameGraph/flamegraph.pl perf.folded > perf.svg
# ls
FlameGraph perf.data perf.folded perf.svg perf.unfold
四、分析數(shù)據(jù)
最終我們得到perf的火焰圖后我們可以對(duì)數(shù)據(jù)進(jìn)行分析。火焰圖中函數(shù)寬度就是耗時(shí),高度表示調(diào)用層級(jí)越多。
perf.svg

perf原理
https://developer.aliyun.com/article/65255
【Linux Perf 底層數(shù)據(jù)收集機(jī)制概述(碼題詩(shī)科技)-嗶哩嗶哩】
perf工具指定跟蹤的進(jìn)程,看系統(tǒng)調(diào)用次數(shù)。
附錄
1 演示程序
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
void func1( void )
{
printf("process (PID:%d) printing...\n", getpid());
return;
}
int main() {
pid_t pid = fork();
if (pid < 0) {
perror("fork failed");
return 1;
} else {
while(1) {
func1();
sleep(2);
}
}
return 0;
}
編譯
gcc process_print.c -o process_print
./process_print
2 perf.txt數(shù)據(jù)
# To display the perf.data header info, please use --header/--header-only options.
#
#
# Total Lost Samples: 0
#
# Samples: 2 of event 'cpu-clock:pppH'
# Event count (approx.): 500000
#
# Children Self Command Shared Object Symbol
# ........ ........ ............. ................. ..................................
#
100.00% 100.00% process_print [kernel.kallsyms] [k] syscall_enter_from_user_mode
|
|--50.00%--0x7fe87c38bd90
| main
| __getpid
| entry_SYSCALL_64_after_hwframe
| do_syscall_64
| syscall_enter_from_user_mode
|
--50.00%--0x3339313a44495028
write
entry_SYSCALL_64_after_hwframe
do_syscall_64
syscall_enter_from_user_mode
100.00% 0.00% process_print [kernel.kallsyms] [k] entry_SYSCALL_64_after_hwframe
|
---entry_SYSCALL_64_after_hwframe
do_syscall_64
syscall_enter_from_user_mode
100.00% 0.00% process_print [kernel.kallsyms] [k] do_syscall_64
|
---do_syscall_64
syscall_enter_from_user_mode
50.00% 0.00% process_print libc.so.6 [.] 0x00007fe87c38bd90
|
---0x7fe87c38bd90
main
__getpid
entry_SYSCALL_64_after_hwframe
do_syscall_64
syscall_enter_from_user_mode
50.00% 0.00% process_print process_print [.] main
|
---main
__getpid
entry_SYSCALL_64_after_hwframe
do_syscall_64
syscall_enter_from_user_mode
50.00% 0.00% process_print [unknown] [k] 0x3339313a44495028
|
---0x3339313a44495028
write
entry_SYSCALL_64_after_hwframe
do_syscall_64
syscall_enter_from_user_mode
50.00% 0.00% process_print libc.so.6 [.] __getpid
|
---__getpid
entry_SYSCALL_64_after_hwframe
do_syscall_64
syscall_enter_from_user_mode
50.00% 0.00% process_print libc.so.6 [.] write
|
---write
entry_SYSCALL_64_after_hwframe
do_syscall_64
syscall_enter_from_user_mode
#
# (Cannot load tips.txt file, please install perf!)
#

浙公網(wǎng)安備 33010602011771號(hào)