perf基本使用功能
perf top
用于實時顯示當(dāng)前系統(tǒng)的性能統(tǒng)計信息。該命令主要用來觀察整個系統(tǒng)當(dāng)前的狀態(tài),比如可以通過查看該命令的輸出來查看當(dāng)前系統(tǒng)最耗時的內(nèi)核函數(shù)或某個用戶進程

再往下看是一個表格式樣的數(shù)據(jù),每一行包含四列,分別是:
第一列 Overhead ,是該符號的性能事件在所有采樣中的比例,用百分比來表示。
第二列 Shared ,是該函數(shù)或指令所在的動態(tài)共享對象(Dynamic Shared Object),如內(nèi)核、進程名、動態(tài)鏈接庫名、內(nèi)核模塊名等。
第三列 Object ,是動態(tài)共享對象的類型。比如 [.] 表示用戶空間的可執(zhí)行程序、或者動態(tài)鏈接庫,而 [k] 則表示內(nèi)核空間。
最后一列 Symbol 是符號名,也就是函數(shù)名。當(dāng)函數(shù)名未知時,用十六進制的地址來表示。
perf stat
通過概括精簡的方式提供被調(diào)試程序運行的整體情況和匯總數(shù)據(jù)

Task-clock-msecs:CPU 利用率,該值高,說明程序的多數(shù)時間花費在 CPU 計算上而非 IO。
Context-switches:進程切換次數(shù),記錄了程序運行過程中發(fā)生了多少次進程切換,頻繁的進程切換是應(yīng)該避免的。
Cache-misses:程序運行過程中總體的 cache 利用情況,如果該值過高,說明程序的 cache 利用不好
CPU-migrations:表示進程 t1 運行過程中發(fā)生了多少次 CPU 遷移,即被調(diào)度器從一個 CPU 轉(zhuǎn)移到另外一個 CPU 上運行。
Cycles:處理器時鐘,一條機器指令可能需要多個 cycles,
Instructions: 機器指令數(shù)目。
IPC:是 Instructions/Cycles 的比值,該值越大越好,說明程序充分利用了處理器的特性。
Cache-references: cache 命中的次數(shù)
Cache-misses: cache 失效的次數(shù)。
注:通過指定 -e 選項,您可以改變 perf stat 的缺省事件
perf probe
perf-porbe 定義新的動態(tài)的tracepoint
大致用法:
perf probe [options] --add='PROBE' [...]
perf probe [options] PROBE
perf probe [options] --del =
perf probe --list
perf porbe --vars
這條命令
1)在不借助debuginfo的前提下,使用符號和寄存器信息定義動態(tài)的tracepoint;
2)借助debuginfo的信息,使用c表達式來動態(tài)地確定出
先看下kprobe是否打開
root@ecs-148531:/home/i# sudo cat /boot/config-$(uname -r) | grep -i kprobe
CONFIG_KPROBES=y
CONFIG_KPROBES_ON_FTRACE=y
CONFIG_HAVE_KPROBES=y
CONFIG_HAVE_KPROBES_ON_FTRACE=y
CONFIG_KPROBE_EVENTS=y
# CONFIG_KPROBE_EVENTS_ON_NOTRACE is not set
CONFIG_BPF_KPROBE_OVERRIDE=y
# CONFIG_KPROBES_SANITY_TEST is not set
# CONFIG_SAMPLE_KPROBES is not set
root@ecs-148531:/home/i#
然后 比如打開kprobe追蹤 tcp_sendmsg
root@ecs-148531:/home/i# sudo perf probe --add tcp_sendmsg -f
Added new event:
?probe:tcp_sendmsg_1 ?(on tcp_sendmsg)
You can now use it in all perf tools, such as:
? ? ? ?perf record -e probe:tcp_sendmsg_1 -aR sleep 1
root@ecs-148531:/home/i#
記錄追蹤的數(shù)據(jù)到perf.data文件
root@ecs-148531:/home/i# perf record -e probe:tcp_sendmsg_1 -aR sleep 1
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.245 MB perf.data (12 samples) ]
root@ecs-148531:/home/i# ls perf.data
perf.data
查看數(shù)據(jù)
root@ecs-148531:/home/i# perf script
? ? ? ? ? ?sshd 273406 [001] 19292974.395979: probe:tcp_sendmsg_1: (ffffffff869ca330)
? ? ? ? ? ?sshd 273406 [001] 19292974.397396: probe:tcp_sendmsg_1: (ffffffff869ca330)
? ? ? ? ? ?sshd 273406 [001] 19292974.397546: probe:tcp_sendmsg_1: (ffffffff869ca330)
? ? ? ? ? ?sshd 273406 [001] 19292974.399462: probe:tcp_sendmsg_1: (ffffffff869ca330)
? ? ? ? ? ?sshd 273406 [001] 19292974.417027: probe:tcp_sendmsg_1: (ffffffff869ca330)
? ? ? ? ? ?sshd 273406 [001] 19292974.417365: probe:tcp_sendmsg_1: (ffffffff869ca330)
? ? ? ? ? ?sshd 273406 [001] 19292974.417518: probe:tcp_sendmsg_1: (ffffffff869ca330)
? ? ? ? ? ?sshd 273406 [001] 19292974.418329: probe:tcp_sendmsg_1: (ffffffff869ca330)
? ? ? ? ? ?sshd 273406 [001] 19292974.418507: probe:tcp_sendmsg_1: (ffffffff869ca330)
? ? ? ? ? ?sshd 273406 [001] 19292974.421884: probe:tcp_sendmsg_1: (ffffffff869ca330)
? ? ? ? ? ?sshd 273406 [001] 19292974.422054: probe:tcp_sendmsg_1: (ffffffff869ca330)
? ? ? ? ? ?sshd 273406 [001] 19292974.476894: probe:tcp_sendmsg_1: (ffffffff869ca330)
再跟蹤一個函數(shù)do_sys_open
i@ecs-148531:~$ sudo perf probe --add do_sys_open -f
Added new event:
?probe:do_sys_open_2 ?(on do_sys_open)
You can now use it in all perf tools, such as:
? ? ? ?perf record -e probe:do_sys_open_2 -aR sleep 1
i@ecs-148531:~$ sudo perf record -e probe:do_sys_open_2 -aR sleep 1
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.240 MB perf.data (24 samples) ]
i@ecs-148531:~$ sudo perf script
? ? ? ? ? ?perf 489024 [001] 19294363.211799: probe:do_sys_open_2: (ffffffff862db420)
? ? ? ? ? sleep 489027 [000] 19294363.212219: probe:do_sys_open_2: (ffffffff862db420)
? ? ? ? ? sleep 489027 [000] 19294363.212233: probe:do_sys_open_2: (ffffffff862db420)
? ? ? ? ? sleep 489027 [000] 19294363.212468: probe:do_sys_open_2: (ffffffff862db420)
? ? ? hostguard 471124 [000] 19294363.446651: probe:do_sys_open_2: (ffffffff862db420)
? ? ? hostguard 471124 [000] 19294363.446742: probe:do_sys_open_2: (ffffffff862db420)
? ? ? hostguard 471124 [000] 19294363.446788: probe:do_sys_open_2: (ffffffff862db420)
? ? ? hostguard 471124 [000] 19294363.446855: probe:do_sys_open_2: (ffffffff862db420)
? ? ? hostguard 471124 [000] 19294363.446919: probe:do_sys_open_2: (ffffffff862db420)
? ? ? hostguard 471124 [000] 19294363.446973: probe:do_sys_open_2: (ffffffff862db420)
? ? ? hostguard 471124 [000] 19294363.447024: probe:do_sys_open_2: (ffffffff862db420)
? ? ? hostguard 471124 [000] 19294363.447075: probe:do_sys_open_2: (ffffffff862db420)
? ? ? hostguard 471124 [000] 19294363.447134: probe:do_sys_open_2: (ffffffff862db420)
? ? ? hostguard 471124 [000] 19294363.447185: probe:do_sys_open_2: (ffffffff862db420)
? ? ? hostguard 471124 [000] 19294363.447237: probe:do_sys_open_2: (ffffffff862db420)
? ? ? hostguard 471124 [000] 19294363.447287: probe:do_sys_open_2: (ffffffff862db420)
? ? ? hostguard 471124 [000] 19294363.447338: probe:do_sys_open_2: (ffffffff862db420)
? ? ? hostguard 471124 [000] 19294363.447388: probe:do_sys_open_2: (ffffffff862db420)
? ? ? hostguard 471124 [000] 19294363.447439: probe:do_sys_open_2: (ffffffff862db420)
? ? ? hostguard 471124 [000] 19294363.447490: probe:do_sys_open_2: (ffffffff862db420)
? ? ? hostguard 471124 [000] 19294363.447541: probe:do_sys_open_2: (ffffffff862db420)
? ? ? hostguard 471124 [000] 19294363.447593: probe:do_sys_open_2: (ffffffff862db420)
? ? ? hostguard 471124 [000] 19294363.447644: probe:do_sys_open_2: (ffffffff862db420)
? ? ? ?ilogtail 1294671 [000] 19294364.153081: probe:do_sys_open_2: (ffffffff862db420)
i@ecs-148531:~$
接下來看下用uprobe來trace userland的函數(shù),比如
#perf probe -x /lib/x86_64-linux-gnu/libc.so.6 malloc
這個trace libc.so這個動態(tài)庫的malloc調(diào)用。我們可以看到,上述命令已經(jīng)生效。
root@ecs-148531:/home/i# cat /sys/kernel/debug/tracing/uprobe_events
p:probe_libc/malloc /usr/lib/x86_64-linux-gnu/libc-2.31.so:0x000000000009d260
開始記錄
root@ecs-148531:/home/i# perf record -e probe_libc:malloc -aR sleep 1
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.264 MB perf.data (237 samples) ]
root@ecs-148531:/home/i#
察看結(jié)果
? #perf script
? ? sleep 495936 [001] 19347149.645089: probe_libc:malloc: (7f86f8af9260)
? ? mosh-server 489795 [001] 19347149.976167: probe_libc:malloc: (7f6cfe66b260)
? ? mosh-server 489795 [001] 19347149.976178: probe_libc:malloc: (7f6cfe66b260)
perf trace
perf trace有類似于strace功能,可以實時監(jiān)控程序的系統(tǒng)調(diào)用:
# perf trace ./a.out
0.032 ( 0.002 ms): a.out/7673 brk( ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?) = 0x1e6b000
0.051 ( 0.005 ms): a.out/7673 access(filename: 0xb7c1cb00, mode: R ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?) = -1 ENOENT No such file or directory
0.063 ( 0.005 ms): a.out/7673 open(filename: 0xb7c1a7b7, flags: CLOEXEC ? ? ? ? ? ? ? ? ? ? ? ? ? ? ) = 3
0.070 ( 0.002 ms): a.out/7673 fstat(fd: 3, statbuf: 0x7ffffb72bc80 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?) = 0
0.073 ( 0.004 ms): a.out/7673 mmap(len: 38436, prot: READ, flags: PRIVATE, fd: 3 ? ? ? ? ? ? ? ? ? ?) = 0x7f18b7e15000
0.079 ( 0.001 ms): a.out/7673 close(fd: 3 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ) = 0
0.087 ( 0.005 ms): a.out/7673 open(filename: 0xb7e21ec0, flags: CLOEXEC ? ? ? ? ? ? ? ? ? ? ? ? ? ? ) = 3
0.093 ( 0.003 ms): a.out/7673 read(fd: 3, buf: 0x7ffffb72be28, count: 832 ? ? ? ? ? ? ? ? ? ? ? ? ? ) = 832
0.099 ( 0.002 ms): a.out/7673 fstat(fd: 3, statbuf: 0x7ffffb72bcc0 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?) = 0
0.102 ( 0.003 ms): a.out/7673 mmap(len: 8192, prot: READ|WRITE, flags: PRIVATE|ANONYMOUS, fd: -1 ? ?) = 0x7f18b7e13000
0.110 ( 0.004 ms): a.out/7673 mmap(len: 2283024, prot: EXEC|READ, flags: PRIVATE|DENYWRITE, fd: 3 ? ) = 0x7f18b79cf000
0.116 ( 0.007 ms): a.out/7673 mprotect(start: 0x7f18b79fc000, len: 2093056 ? ? ? ? ? ? ? ? ? ? ? ? ?) = 0
0.125 ( 0.005 ms): a.out/7673 mmap(addr: 0x7f18b7bfb000, len: 8192, prot: READ|WRITE, flags: PRIVATE|DENYWRITE|FIXED, fd: 3, off: 180224) = 0x7f18b7bfb000
0.142 ( 0.002 ms): a.out/7673 close(fd: 3 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ) = 0
0.153 ( 0.006 ms): a.out/7673 open(filename: 0xb7e134c0, flags: CLOEXEC ? ? ? ? ? ? ? ? ? ? ? ? ? ? ) = 3
0.161 ( 0.003 ms): a.out/7673 read(fd: 3, buf: 0x7ffffb72bdf8, count: 832 ? ? ? ? ? ? ? ? ? ? ? ? ? ) = 832
0.165 ( 0.002 ms): a.out/7673 fstat(fd: 3, statbuf: 0x7ffffb72bc90 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?) = 0
0.169 ( 0.005 ms): a.out/7673 mmap(len: 2216432, prot: EXEC|READ, flags: PRIVATE|DENYWRITE, fd: 3 ? ) = 0x7f18b77b1000
......
鏈接:https://www.dianjilingqu.com/505038.html