在安裝前,須要知道下本身的系統環境,個人環境以下:html
uname -r 2.6.18-308.el5
Linux 2.6.18-308.el5 #1 SMP Tue Feb 21 20:06:06 EST 2012 x86_64 x86_64 x86_64 GNU/Linux
爲了部署 SystemTap,須要安裝如下兩個 RPM 包:python
以 root 權限,運行如下命令安裝:linux
yum install systemtap systemtap-runtime
注:在使用 SystemTap 前,須要安裝內核信息包,能夠運行如下命令安裝:api
stap-prep
若是安裝失敗,請手動安裝,手動安裝步驟請見手動安裝內核信息包。架構
注:我在個人主機上運行
stap-prep
的報錯信息以下app
[root@test ~]# stap-prep Need to install the following packages: kernel-devel-2.6.18-308.el5.x86_64 kernel-debuginfo-2.6.18-308.el5.x86_64 Traceback (most recent call last): File "/usr/bin/yumdownloader", line 19, in <module> import yum ImportError: No module named yum problem downloading rpm(s) kernel-devel-2.6.18-308.el5.x86_64 kernel-debuginfo-2.6.18-308.el5.x86_64
須要的內核信息包包含你內核中匹配如下字段 -devel, -debuginfo, 和 -debuginfo-common 的包。以下:ide
須要安裝和你內核對應版本的包,運行命令工具
uname -r 2.6.18-308.el5
能夠指定你的內核是 2.6.18-308.el5
,所以你須要的包以下:學習
重要!!!!注意:這三個包必須與你的內核版本匹配,不能你懂的。測試
下載這三個 rpm 包,到 http://rpm.pbone.net 這個網站去下載。或者最簡單的在 google 搜索包名。
下載 kernel-debuginfo-2.6.18-308.el5.x86_64.rpm:
wget ftp://ftp.pbone.net/mirror/ftp.redhat.com/pub/redhat/linux/enterprise/5Client/en/os/x86_64/Debuginfo/kernel-debuginfo-2.6.18-308.el5.x86_64.rpm
下載 kernel-devel-2.6.18-308.el5.x86_64.rpm:
wget ftp://ftp.pbone.net/mirror/ftp.redhat.com/pub/redhat/linux/enterprise/5Client/en/os/x86_64/Debuginfo/kernel-devel-2.6.18-308.el5.x86_64.rpm
下載 kernel-debuginfo-common-2.6.18-308.el5.x86_64.rpm:
wget ftp://ftp.pbone.net/mirror/ftp.redhat.com/pub/redhat/linux/enterprise/5Client/en/os/x86_64/Debuginfo/kernel-debuginfo-common-2.6.18-308.el5.x86_64.rpm
分別安裝這三個包:
rpm -ivh kernel-debuginfo-common-2.6.18-308.el5.x86_64.rpm rpm -ivh kernel-debuginfo-2.6.18-308.el5.x86_64.rpm rmp -ivh kernel-devel-2.6.18-308.el5.x86_64.rpm
爲了測試 stap 是否安裝正確,須要運行如下命令測試:
stap -v -e 'probe vfs.read {printf("read performed\n"); exit()}'
注:上面這條測試語句會失敗,因此更換一個測試文件吧,從 http://blog.yufeng.info/archives/747 拿了一個示例
Linux下誰在切換咱們的進程的 stap 腳本
cswmon.stp
#! /usr/bin/env stap # # global csw_count global idle_count probe scheduler.cpu_off { csw_count[task_prev, task_next]++ idle_count+=idle } function fmt_task(task_prev, task_next) { return sprintf("%s(%d)->%s(%d)", task_execname(task_prev), task_pid(task_prev), task_execname(task_next), task_pid(task_next)) } function print_cswtop () { printf ("%45s %10s\n", "Context switch", "COUNT") foreach ([task_prev, task_next] in csw_count- limit 20) { printf("%45s %10d\n", fmt_task(task_prev, task_next), csw_count[task_prev, task_next]) } printf("%45s %10d\n", "idle", idle_count) delete csw_count delete idle_count } probe timer.s($1) { print_cswtop () printf("--------------------------------------------------------------\n") }
執行腳本:
[root@gd2ywdnscsvm56 ~]# stap test.stp 5 Context switch COUNT swapper(0)->vmtoolsd(2698) 54 vmtoolsd(2698)->swapper(0) 54 stapio(27632)->swapper(0) 25 swapper(0)->python(3799) 25 python(3799)->swapper(0) 25 swapper(0)->stapio(27632) 24 swapper(0)->iscsid(2955) 20 iscsid(2955)->swapper(0) 20 swapper(0)->hald-addon-stor(3551) 20 hald-addon-stor(3551)->swapper(0) 20 swapper(0)->mpt_poll_0(694) 5 mpt_poll_0(694)->swapper(0) 5 swapper(0)->automount(3631) 5 automount(3631)->swapper(0) 5 swapper(0)->vmmemctl(2543) 5 vmmemctl(2543)->swapper(0) 5 swapper(0)->iscsid(2954) 5 iscsid(2954)->swapper(0) 5 swapper(0)->pcscd(3500) 5 pcscd(3500)->swapper(0) 5 idle 194 -------------------------------------------------------------- Context switch COUNT swapper(0)->vmtoolsd(2698) 51 vmtoolsd(2698)->swapper(0) 51 swapper(0)->hald-addon-stor(3551) 30 hald-addon-stor(3551)->swapper(0) 30 swapper(0)->stapio(27632) 25 stapio(27632)->swapper(0) 25 swapper(0)->python(3799) 25 python(3799)->swapper(0) 25 swapper(0)->iscsid(2955) 20 iscsid(2955)->swapper(0) 20 swapper(0)->hald(3527) 6 hald(3527)->swapper(0) 6 swapper(0)->mpt_poll_0(694) 5 mpt_poll_0(694)->swapper(0) 5 swapper(0)->automount(3631) 5 automount(3631)->swapper(0) 5 swapper(0)->vmmemctl(2543) 5 vmmemctl(2543)->swapper(0) 5 swapper(0)->iscsid(2954) 5 iscsid(2954)->swapper(0) 5 idle 198
當運行一個 SystemTap 腳本的時候,SystemTap 會在腳本外構建一個內核模塊,SystemTap 而後把這個內核模塊加載進內核,容許它直接從內核提取指定的數據。
正常狀況下,SystemTap 僅僅會運行在部署了 SystemTap 的系統上。這意味着,若是你想在 10 個系統上運行 SystemTap,你必須把 SystemTap 部署到全部的系統上。有時候,這可能既不可行也不理想。好比,公司政策禁止管理員在指定的機器上安裝 RPM 包來提供編譯和 debug 信息,從而防止 SystemTap 的部署。爲了解決這一問題,SystemTap 容許你使用 Cross-instrumentation。
Cross-instrumentation 是一個從一臺計算機上的 SystemTap 腳本生成 SystemTap 測量模塊並在另外一臺計算機上使用的過程。這個過程提供瞭如下好處:
爲了簡單起見,在這一節中使用如下術語:
爲了配置一個主機系統和一個目標系統,須要完成如下步驟:
uname -r
命令來決定運行在每臺目標系統上的內核完成這些步驟後,你如今能夠在主機系統上構建測量模塊。爲了構建測量模塊,在主機系統上運行如下命令(必定要指定適當的值):
stap -r kernel_version script -m module_name
這裏, kernel_version
涉及到目標內核的版本(在目標系統上經過 uname -r
命令輸出),script
涉及到轉換成測量模塊的腳本,module_name
涉及測量模塊要求的名稱。
注:爲了肯定運行的內核的架構,你可使用如下命令:
uname -m
一旦測量模塊被編譯完成,拷貝它到目標系統,而後用下面的命令加載它:
staprun module_name.ko
例如,爲 2.6.18-92.1.10.el5 (x86_64 架構) 的目標內核從一個名稱爲 simple.stp 的 SystemTap 腳本建立一個測量模塊 simple.ko,使用如下命令:
stap -r 2.6.18-92.1.10.el5 -e 'probe vfs.read {exit()}' -m simple
這將建立一個名爲 simple.ko 的模塊,爲了使用這個測量模塊,拷貝它到目標系統,而後在目標系統運行如下命令:
staprun simple.ko
注:重要!!!! 主機系統必須與目標系統是相同的架構以及相同的 Linux 發行版,爲了使構建的測量模塊能正常工做。
參考資料