systemtap和火焰圖學習筆記
一、Systemtap介紹及安裝
SystemTap 是對 Linux 核心監控和跟蹤的工具,詳細的介紹及說明見官網。
官網:SystemTap
1.1 環境檢測
安裝前我們需要檢測一下作業系統版本,命令如下:
# uname -r
3.10.0-327.el7.x86_64
# cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
我這裡使用的CentOS 7.2,下面的介紹的安裝方法也是在CentOS 上的方法。
1.2 安裝SystemTap
安裝部署SystemTap需要以下兩個包:
systemtap
systemtap-runtime
在root許可權下,使用yum安裝,命令如下:
yum install systemtap systemtap-runtime
在使用SystemTap前,需要安裝核心資訊包,一般情況下,執行如下命令安裝:
stap-prep
執行命令後往往會失敗,安裝不成功,安裝失敗後可以手動安裝核心資訊包。
我的伺服器報的錯誤如下:
No package kernel-debuginfo-3.10.0-514.el7.x86_64 available.
Error: Nothing to do
Loaded plugins: fastestmirror, langpacks
enabling epel-debuginfo
Loading mirror speeds from cached hostfile
Could not find debuginfo for main pkg: kernel-3.10.0-514.el7.x86_64
No debuginfo packages available to install
package kernel-debuginfo-3.10.0-514.el7.x86_64 is not installed
problem installing rpm(s) kernel-debuginfo-3.10.0-514.el7.x86_64
Error: Nothing to do
Loaded plugins: fastestmirror, langpacks
enabling epel-debuginfo
Loading mirror speeds from cached hostfile
Could not find debuginfo for main pkg: kernel-3.10.0-514.el7.x86_64
No debuginfo packages available to install
package kernel-debuginfo-3.10.0-514.el7.x86_64 is not installed
problem installing rpm(s) kernel-debuginfo-3.10.0-514.el7.x86_64
1.3 手動安裝核心資訊包
需要的安裝包如下:
kernel-debuginfo
kernel-debuginfo-common
kernel-devel
需要安裝與你核心版本一致的安裝包,執行命令檢視版本:
# uname -r
3.10.0-327.el7.x86_64
可以指定你的核心是 3.10.0-327.el7.x86_64,因此你需要的包如下:
kernel-debuginfo-3.10.0-514.el7.x86_64.rpm
kernel-debuginfo-common-x86_64-3.10.0-514.el7.x86_64.rpm
kernel-devel-3.10.0-514.el7.x86_64.rpm
重要!!!!注意:這三個包必須與你的核心版本匹配,否則會安裝不成功。
下載這三個 rpm 包,到 http://rpm.pbone.net 這個網站去下載。或者最簡單的在 google 搜尋包名。
分別安裝這三個包:
rpm -ivh kernel-debuginfo-common-x86_64-3.10.0-514.el7.x86_64.rpm
rpm -ivh kernel-debuginfo-3.10.0-514.el7.x86_64.rpm
rmp -ivh kernel-devel-3.10.0-514.el7.x86_64.rpm
也可以嘗試使用yum安裝,這裡就不再贅述。
1.4 測試
測試一下是否安裝部署成功,如何測試呢?執行如下命令:
stap -v -e 'probe vfs.read {printf("read performed\n"); exit()}’
部署失敗提示如下:
# stap -v -e 'probe vfs.read {printf("read performed\n"); exit()}'
Pass 1: parsed user script and 119 library scripts using 220240virt/33264res/3272shr/30276data kb, in 320usr/20sys/717real ms.
semantic error: while resolving probe point: identifier 'kernel' at /usr/share/systemtap/tapset/linux/vfs.stp:882:18
source: probe vfs.read = kernel.function("vfs_read")
^
semantic error: missing x86_64 kernel/module debuginfo [man warning::debuginfo] under '/lib/modules/3.10.0-514.el7.x86_64/build'
semantic error: while resolving probe point: identifier 'vfs' at <input>:1:7
source: probe vfs.read {printf("read performed\n"); exit()}
^
semantic error: no match
Pass 2: analyzed script: 0 probes, 0 functions, 0 embeds, 0 globals using 234228virt/47084res/5204shr/42164data kb, in 110usr/190sys/899real ms.
Missing separate debuginfos, use: debuginfo-install kernel-3.10.0-514.el7.x86_64
Pass 2: analysis failed. [man error::pass2]
部署成功提示如下:
# stap -v -e 'probe vfs.read {printf("read performed\n"); exit()}'
Pass 1: parsed user script and 119 library scripts using 220244virt/33264res/3272shr/30280data kb, in 360usr/30sys/530real ms.
Pass 2: analyzed script: 1 probe, 1 function, 4 embeds, 0 globals using 351120virt/165268res/4472shr/161156data kb, in 1700usr/440sys/3951real ms.
Pass 3: translated to C into "/tmp/stapeOM1BT/stap_bbe80ab58c56cba7fc7b6efecaadacb6_1647_src.c" using 351120virt/165564res/4768shr/161156data kb, in 10usr/50sys/63real ms.
Pass 4: compiled C into "stap_bbe80ab58c56cba7fc7b6efecaadacb6_1647.ko" in 1880usr/490sys/4598real ms.
Pass 5: starting run.
read performed
Pass 5: run completed in 10usr/40sys/406real ms.
二、火焰圖介紹及安裝
2.1 介紹
火焰圖(Flame Graph)是由 `Linux` 效能優化大師 `Brendan Gregg` 發明的。它是定位疑難雜症的神器,比如 `CPU` 佔用高、記憶體洩漏等問題。
縱向表示呼叫棧的深度,橫向表示消耗的時間。因為呼叫棧在橫向會按照字母排序,並且同樣的呼叫棧會做合併,所以,一個格子的寬度越大越說明其可能是瓶頸。
綜上所述,主要就是看那些比較寬大的火苗,特別留意那些類似平頂山的火苗。
火焰圖例子:
2.2 安裝
火焰圖的安裝比較簡單,只需要把指令碼從github上down下來即可,命令如下:
2.3 生成火焰圖
生成火焰圖一般需要以下幾個步驟:
1)、抓取和捕獲堆疊資訊:使用 perf/systemtap/dtrace 等工具抓取程式的執行堆疊資訊。
2)、摺疊堆疊:使用FlameGraph 中的 stackcollapse 程式 把抓取的資訊進行分析組合;trace 工具抓取的系統和程式執行每一時刻的堆疊資訊, 需要對他們進行分析組合, 將重複的堆疊累計在一起, 從而體現出負載和關鍵路徑
3)、生成火焰圖:使用FlameGraph中的flamegraph.pl 分析 stackcollapse 輸出的堆疊資訊生成火焰圖
stackcollapse分很多工具,用來分析不同trace工具抓取的核心資訊,比如stackcollapse-stap.pl 是用來分析 SystemTap捕獲的資訊。
三、使用
以具體的例子來說明SystemTap和FlameGraph 是如何使用的。
3.1 sample_bt_vfs 工具
這個工具是openresty的作者春哥寫的,這個工具是在虛擬檔案系統(VFS)之上取樣使用者空間呼叫棧,以便渲染出檔案 I/O 火焰圖,這個火焰圖可以準確的反映出在任意正在執行的使用者程式中,檔案 I/O 資料量或者檔案 I/O 延遲在不同的使用者空間程式碼路徑的分佈。
工具使用詳細介紹: sample_bt_vfs
工具包下載地址:openresty-systemtap-toolkit
工具放在openresty-systemtap-toolkit目錄下
以檢視nginx為例:
1)、使用SystemTap進行核心資料採集:
執行:
$ ./sample-bt-vfs -p 12345 -t 3 > a_vfs.log
WARNING: Tracing 20636 (/opt/nginx/sbin/nginx)...
WARNING: Time's up. Quitting now...(it may take a while)
WARNING: Number of errors: 0, skipped probes: 2
引數:
-p: 代表程式的PID
-t:代表要採集資料的時間
a_vfs.log: 是採集資料要儲存的檔名子。
2)、分析組合採集的資料
執行:
$ ./FlameGraph/stackcollapse-stap.pl a_vfs.log > a_vfs.cbt
3)、生成火焰圖
執行:
$ ./FlameGraph/flamegraph.pl ./a_vfs.cbt > a_vfs.svg
a_vfs.svg就是生成的火焰圖,使用瀏覽器開啟,找到寬平的項,就是比較耗時的。
3.2 sample-bt 工具
這個指令碼可以對你指定的 任意 使用者程式進行呼叫棧的取樣。呼叫棧可以是使用者空間,可以是核心空間,或者是兩者兼得。 它的輸出是彙總後的呼叫棧(按照總數)。
工具詳細介紹:sample-bt
例如:
./openresty-systemtap-toolkit/sample-bt-vfs -p 41046 -t 50 -ku > 17_on_cpu.log
引數:
-p:代表程式ID
-t:代表取樣時間 單位是秒
-u 採集使用者空間呼叫棧資訊
-k 採集核心空間呼叫棧資訊
剩下的火焰圖的生成方式同3.1。
參考的文獻:
相關文章
- 深度學習框架火焰圖pprof和CUDA Nsys配置指南深度學習框架
- 弦圖 學習筆記筆記
- AD學習筆記----原理圖設計筆記
- Python學習筆記 - 下載圖片Python筆記
- Git和Maven的學習筆記GitMaven筆記
- 註解和反射學習筆記反射筆記
- Node學習筆記 Mongodb 和 Mongoose筆記MongoDB
- numpy的學習筆記\pandas學習筆記筆記
- Linux程式效能分析和火焰圖Linux
- 圖論進階學習筆記(四)(2024.10.4)圖論筆記
- [學習筆記] 樹上差分 - 圖論筆記圖論
- CAD學習筆記基礎課【圖層】筆記
- HexMap學習筆記(五)——更大的地圖筆記地圖
- 圖形學學習筆記二:觀測變換筆記
- 閔可夫斯基和 學習筆記筆記
- 學習筆記筆記
- seaborn學習筆記(四):箱型圖、小提琴圖筆記
- Flutter學習筆記(10)--容器元件、圖片元件Flutter筆記元件
- Django學習筆記《二》圖書管理系統Django筆記
- iOS學習筆記20 地圖(二)MapKit框架iOS筆記地圖APK框架
- Golang火焰圖Golang
- Chrome 火焰圖Chrome
- 【學習筆記】數學筆記
- 機器學習學習筆記機器學習筆記
- 《JAVA學習指南》學習筆記Java筆記
- GObject學習筆記(一)類和例項GoObject筆記
- JavaScript學習筆記(一) promise和async/waitJavaScript筆記PromiseAI
- 高維字首和/SOS DP 學習筆記筆記
- Spring MVC學習筆記和SSH的整合SpringMVC筆記
- Pytest學習筆記2-setup和teardown筆記
- 22張精煉圖筆記,深度學習專項學習必備筆記深度學習
- this和super的區別和應用 學習筆記筆記
- 學習筆記-粉筆980筆記
- fastadmin學習筆記AST筆記
- JAVA學習筆記Java筆記
- FFT學習筆記FFT筆記
- HTML學習筆記HTML筆記
- wireshark學習筆記筆記