1、perf 簡介
?Perf 是內(nèi)置于 Linux 內(nèi)核源碼樹中的性能剖析(profiling)工具。它基于事件采樣的原理,以性能事件為基礎(chǔ),支持針對處理器相關(guān)性能指標(biāo)與操作系統(tǒng)相關(guān)性能指標(biāo)的性能剖析。
1.1、perf 框架
主要有兩部分組成
Perf Tools:用戶態(tài)的 Perf Tools 為用戶提供了一系列豐富的工具集用于收集、分析性能數(shù)據(jù)。
Perf Event Subsystem:Perf Event 子系統(tǒng)是內(nèi)核眾多子系統(tǒng)中的一員,其主要功能是和 Perf Tool 共同完成數(shù)據(jù)采集的工作。另外,Linux Hard Lockup Detector 也是通過 Perf Event 子系統(tǒng)來實(shí)現(xiàn)的。
?本文將重點(diǎn)圍繞 Perf Event 子系統(tǒng)展開介紹Coolbpf 在perf 事件中的增強(qiáng)。
1.2、perf 事件分類
perf的事件包括:
硬件事件:branch-instrctions / branch-miss / bus-cycles / cache-miss / cache-reference / cycles / instructions
硬件cache事件:d1-cached-miss
軟件事件:cpu-clocks / tasks-clock ....
tracepoint事件:sched_stat_runtime / syscalls...
probe事件:可用戶定義
1.3、當(dāng)前perf 工具集中的不足
?當(dāng)前perf工具以命令行為主,缺乏完善的第三方應(yīng)用開發(fā)sdk,導(dǎo)致perf功能雖然強(qiáng)大,但是功能相對比較封閉,無法適應(yīng)特定場景的問題。比如說常見的CPU system 占用率高的問題,我們通常使用perf record 來記錄系統(tǒng)熱點(diǎn),再通過 FlameGraph 工具轉(zhuǎn)換成火焰圖進(jìn)行分析。該方法存在以下不足:
sys占用率高很有可能只是偶發(fā)性問題,通過監(jiān)控發(fā)現(xiàn)了以后再來執(zhí)行命令,現(xiàn)象很有可能已經(jīng)消失,持續(xù)性追蹤會導(dǎo)致樣本數(shù)太大,無法凸顯出熱點(diǎn)函數(shù);
sys占用率高只是部分cpu現(xiàn)象,具體cpu編號并不確定,導(dǎo)致定向抓取事件操作步驟會變得非常繁瑣;
perf 命令只能輸出中間文件,要生成常用的火焰圖數(shù)據(jù)還需要手工轉(zhuǎn)換;
2、Coolbpf 針對perf 增強(qiáng)
Coolbpf 是一個(gè)便捷高效的一站式eBPF開發(fā)編譯平臺,當(dāng)perf遇見Coolbpf后,會碰撞出什么樣的火花呢?Coolbpf 為perf提供了應(yīng)用開發(fā)的SDK,讓開發(fā)者可以借助eBPF快速開發(fā) perf 應(yīng)用。
2.1、Coolbpf perf 組織架構(gòu)
?大致流程和常規(guī)的Coolbpf 應(yīng)用開發(fā)過程基本一致。主要分為
libbpf 應(yīng)用、
perf 事件處理、
用戶態(tài)處理、 ?接下來我們以 testPerf.py為例,講解perf 典型應(yīng)用開發(fā)。
(文件:https://gitee.com/anolis/coolbpf/blob/master/lcc/pylcc/guide/testPerf.py)
2.2、bpf 應(yīng)用部分
? bpf 應(yīng)用和其它的kprobe/tp代碼實(shí)現(xiàn)并無明顯差別:
#include "lbc.h" SEC("perf_event") int bpf_prog(struct bpf_perf_event_data *ctx) { bpf_printk("hello perf "); return 0; } char _license[] SEC("license") = "GPL";
2.3、perf event
?Coolbpf 對perf_attr 做了python 化處理,故使用在配置 perf attr的時(shí)候,只需要參考 perf 官方文檔中關(guān)于attr 配置說明進(jìn)行配置即可。下面的例子是追蹤 perf PAGE_FAULTS事件的方法。
pfConfig = { "sample_freq": 50, "freq": 1, "type": PerfType.SOFTWARE, "config": PerfSwIds.PAGE_FAULTS, } self.attachPerfEvent("bpf_prog", pfConfig)
?此時(shí)系統(tǒng)中的 perf PAGE_FAULTS 事件就可以跟2.2 節(jié)的libbpf 代碼關(guān)聯(lián)起來。
2.4、用戶態(tài)處理
?本示例是將捕捉到的事件輸出到 /sys/kernel/debug/tracing/trace_pipe。用戶可以根據(jù)自己的情況去執(zhí)行event 回調(diào)或者分析maps 信息。
3、實(shí)戰(zhàn)應(yīng)用
?根據(jù)1.3 節(jié)的應(yīng)用場景,需要追蹤一個(gè)偶發(fā)性sys 沖高問題。在常規(guī)perf 使用存在困難的情況下,可以基于Coolbpf快速開發(fā)一個(gè)追蹤sys高問題的應(yīng)用程序,代碼總共不超過180行,具體實(shí)現(xiàn)可以參考:perfSys.py(https://gitee.com/anolis/surftrace/blob/master/tools/pylcc/pytool/perfSys.py)
?應(yīng)用實(shí)現(xiàn)流程圖如下:
?可以直接追蹤到對應(yīng)的sys高調(diào)用棧
通過上述方法,可以將原本需要花費(fèi)多日守候才有可能捕捉到現(xiàn)場的疑難問題,縮短到完全無人值守,問題復(fù)現(xiàn)瞬間即可鎖定目標(biāo)的小case。
4、總結(jié)
?Coolbpf 融合了libbpf靈活、高效、安全的優(yōu)勢,結(jié)合perf強(qiáng)大的數(shù)據(jù)收集能力,并自身擁有快速部署、資源高效利用、結(jié)果直觀可視化輸出能力。如今兩兩聯(lián)合,應(yīng)用前景非常廣泛,如性能剖析、應(yīng)用觀測、系統(tǒng)調(diào)優(yōu)等。
-
處理器
+關(guān)注
關(guān)注
68文章
19178瀏覽量
229201 -
Linux
+關(guān)注
關(guān)注
87文章
11232瀏覽量
208960 -
操作系統(tǒng)
+關(guān)注
關(guān)注
37文章
6747瀏覽量
123204
原文標(biāo)題:4、總結(jié)
文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論