在安裝前,需要知道下自己的系統環境,我的環境如下:
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 包:
- systemtap
- systemtap-runtime
以 root 權限,運作以下指令安裝:
yum install systemtap systemtap-runtime
注:在使用 SystemTap 前,需要安裝核心資訊包,可以運作以下指令安裝:
stap-prep
如果安裝失敗,請手動安裝,手動安裝步驟請見手動安裝核心資訊包。
注:我在我的主機上運作 stap-prep
的報錯資訊如下
[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 的包。如下:
- kernel-debuginfo
- kernel-debuginfo-common
- kernel-devel
需要安裝和你核心對應版本的包,運作指令
uname -r
2.6.18-308.el5
可以指定你的核心是
2.6.18-308.el5
,是以你需要的包如下:
- kernel-debuginfo-2.6.18-308.el5.x86_64.rpm
- kernel-devel-2.6.18-308.el5.x86_64.rpm
- kernel-debuginfo-common-2.6.18-308.el5.x86_64.rpm
重要!!!!注意:這三個包必須與你的核心版本比對,不能你懂的。
下載下傳這三個 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 測量子產品并在另一台計算機上使用的過程。這個過程提供了以下好處:
- 各種主機的核心資訊包可以被安裝在單台主機上
- 每台目标機器僅僅需要被安裝一個 RPM 包,為了使用生成的 SystemTap 測量子產品:systemtap-runtime 包
為了簡單起見,在這一節中使用以下術語:
- 測量子產品 - 從 SystemTap 腳本建構的核心子產品。SystemTap 子產品在主機系統上被建構,将在目标系統的核心上被加載。
- 主機系統 - SystemTap 腳本編譯測量子產品的系統,為了在目标系統上加載它們。
- 目标系統 - SystemTap 腳本建構測量子產品系統
- 目标核心 - 目标系統的核心,這個核心用于你加載或運作測量子產品
為了配置一個主機系統和一個目标系統,需要完成以下步驟:
- 在每台目标系統安裝 systemtap-runtime 包
- 通過在每台主機上運作
指令來決定運作在每台目标系統上的核心uname -r
- 在主機系統上安裝 SystemTap。在主機系統上,你将可以為目标系統建構測量指令。關于怎樣安裝 SystemTap 的指令,可以參考“SystemTap 學習筆記 - 安裝篇”。
- 前期确定目标系統的核心版本,安裝目标核心和在主機系統上的相關的 RPM 包,如 “SystemTap 學習筆記 - 安裝篇” 中的 “手動安裝必需的核心資訊包” 所述。如果多個目标系統使用不同的目标核心,為在目标系統上使用的每個不同的核心重複這一步驟。
完成這些步驟後,你現在可以在主機系統上建構測量子產品。為了建構測量子產品,在主機系統上運作以下指令(一定要指定适當的值):
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 發行版,為了使建構的測量子產品能正常工作。