您好,登錄后才能下訂單哦!
Linux系統中如何進行systemtap和火焰圖分析及安裝,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
安裝前我們需要檢測一下操作系統版本,命令如下:
# uname -r
3.10.0-327.el7.x86_64
# cat /etc/
-releaseLinux release 7.2.1511 (Core)
我這里使用的CentOS 7.2,下面的介紹的安裝方法也是在CentOS 上的方法。
安裝部署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
需要的安裝包如下:
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 包,到
這個網站去下載。或者最簡單的在 搜索包名。分別安裝這三個包:
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安裝,這里就不再贅述。
測試一下是否安裝部署成功,如何測試呢?運行如下命令:
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: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.
官網:
火焰圖(Flame Graph)是由 Linux 性能優化大師 Brendan Gregg 發明的。它是定位疑難雜癥的神器,比如 CPU 占用高、內存泄漏等問題。
縱向表示調用棧的深度,橫向表示消耗的時間。因為調用棧在橫向會按照字母排序,并且同樣的調用棧會做合并,所以,一個格子的寬度越大越說明其可能是瓶頸。
綜上所述,主要就是看那些比較寬大的火苗,特別留意那些類似平頂山的火苗。
火焰圖例子:
火焰圖的安裝比較簡單,只需要把腳本從github上down下來即可,命令如下:
git clone https://github.com/brendangregg/FlameGraph
生成火焰圖一般需要以下幾個步驟:
1)、抓取和捕獲堆棧信息:使用 perf/systemtap/dtrace 等工具抓取程序的運行堆棧信息。
2)、折疊堆棧:使用FlameGraph 中的 stackcollapse 程序 把抓取的信息進行分析組合;trace 工具抓取的系統和程序運行每一時刻的堆棧信息, 需要對他們進行分析組合, 將重復的堆棧累計在一起, 從而體現出負載和關鍵路徑
3)、生成火焰圖:使用FlameGraph中的flamegraph.pl 分析 stackcollapse 輸出的堆棧信息生成火焰圖
stackcollapse分很多工具,用來分析不同trace工具抓取的內核信息,比如stackcollapse-stap.pl 是用來分析 SystemTap捕獲的信息。
以具體的例子來說明SystemTap和FlameGraph 是如何使用的。
這個工具是openresty的作者春哥寫的,這個工具是在虛擬文件系統(VFS)之上采樣用戶空間調用棧,以便渲染出文件 I/O 火焰圖,這個火焰圖可以準確的反映出在任意正在運行的用戶進程中,文件 I/O 數據量或者文件 I/O 延遲在不同的用戶空間代碼路徑的分布。
工具使用詳細介紹:
工具包下載地址:
方法:git clone https://github.com/openresty/openresty-systemtap-toolkit.git
工具放在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
這里有一個 “文件 I/O 火焰圖” 的例子:
a_vfs.svg就是生成的火焰圖,使用瀏覽器打開,找到寬平的項,就是比較耗時的。
這個腳本可以對你指定的 任意 用戶進程進行調用棧的采樣。調用棧可以是用戶空間,可以是內核空間,或者是兩者兼得。 它的輸出是匯總后的調用棧(按照總數)。
工具詳細介紹:
例如:
./openresty-systemtap-toolkit/sample-bt-vfs -p 41046 -t 50 -ku > 17_on_cpu.log
參數:
-p:代表進程ID
-t:代表采樣時間 單位是秒
-u 采集用戶空間調用棧信息
-k 采集內核空間調用棧信息
Linux是一種免費使用和自由傳播的類UNIX操作系統,是一個基于POSIX的多用戶、多任務、支持多線程和多CPU的操作系統,使用Linux能運行主要的Unix工具軟件、應用程序和網絡協議。
看完上述內容,你們掌握Linux系統中如何進行systemtap和火焰圖分析及安裝的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。