日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

Linux 自檢和 SystemTap

系統(tǒng) 2199 0

2009 年 12 月 03 日

現(xiàn)代的操作系統(tǒng)內(nèi)核提供 自檢 功能,即動態(tài)地檢查內(nèi)核以理解其行為的能力。這些行為可以反映內(nèi)核問題和性能瓶頸。擁有這些信息時(shí)候,您就可以調(diào)優(yōu)或修改內(nèi)核以避免出現(xiàn)故障。本文探索一 個(gè)名為 SystemTap 的開放源碼基礎(chǔ)設(shè)施,它為 Linux? 內(nèi)核提供這種動態(tài)的自檢。

?

SystemTap 是監(jiān)控和跟蹤運(yùn)行中的 Linux 內(nèi)核的操作的動態(tài)方法。這句話的關(guān)鍵詞是 動態(tài) ,因?yàn)?SystemTap 沒有使用工具構(gòu)建一個(gè)特殊的內(nèi)核,而是允許您在運(yùn)行時(shí)動態(tài)地安裝該工具。它通過一個(gè)名為 Kprobes 的應(yīng)用編程接口(API)來實(shí)現(xiàn)該目的,本文將探索這個(gè) API。我們首先了解以前的一些內(nèi)核跟蹤方法,然后在深入探討 SystemTap 的架構(gòu)及其使用。

內(nèi)核跟蹤

SystemTap 與一種名為 DTrace 的老技術(shù)相似,該技術(shù)源于 Sun Solaris 操作系統(tǒng)。在 DTrace 中,開發(fā)人員可以用 D 編程語言( C 語言的子集,但修改為支持跟蹤行為)編寫腳本。DTrace 腳本包含許多探針和相關(guān)聯(lián)的操作,這些操作在探針 “觸發(fā)” 時(shí)發(fā)生。例如,探針可以表示簡單的系統(tǒng)調(diào)用,也可以表示更加復(fù)雜的交互,比如執(zhí)行特定的代碼行。清單 1 顯示了 DTrace 腳本的一個(gè)簡單例子,它計(jì)算每個(gè)進(jìn)程發(fā)出的系統(tǒng)調(diào)用的數(shù)量(注意,使用字典將計(jì)數(shù)和進(jìn)程關(guān)聯(lián)起來)。該腳本的格式包含探針(在發(fā)出系統(tǒng)調(diào)用時(shí)觸發(fā))和操作 (對應(yīng)的操作腳本)。


清單 1. 計(jì)算每個(gè)進(jìn)程的系統(tǒng)調(diào)用的簡單 DTrace 腳本

            				
syscall:::entry 
{ 

  @num[pid,execname] = count(); 

}

          

?

DTrace 是 Solaris 最引人注目的部分,所以在其他操作系統(tǒng)中開發(fā)它并不奇怪。DTrace 是在 Common Development and Distribution License (CDDL) 之下發(fā)行的,并且被移植到 FreeBSD 操作系統(tǒng)中。

另一個(gè)非常有用的內(nèi)核跟蹤工具是 ProbeVue ,它是 IBM 為 IBM? AIX? 操作系統(tǒng) 6.1 開發(fā)的。您可以使用 ProbeVue 探查系統(tǒng)的行為和性能,以及提供特定進(jìn)程的詳細(xì)信息。這個(gè)工具使用一個(gè)標(biāo)準(zhǔn)的內(nèi)核以動態(tài)的方式進(jìn)行跟蹤。清單 2 顯示了 ProbeVue 腳本的一個(gè)例子,它指出發(fā)出 sync 系統(tǒng)調(diào)用的特定進(jìn)程。


清單 2. 指出哪個(gè)進(jìn)程調(diào)用 sync 的簡單 ProbeVue 腳本

            				
@@syscall:*:sync:entry
{
  printf( "sync() syscall invoked by process ID %d\n", __pid );
  exit();
}

          

?

考慮到 DTrace 和 ProbeVue 在各自的操作系統(tǒng)中的巨大作用,為 Linux 操作系統(tǒng)策劃一個(gè)實(shí)現(xiàn)該功能的開源項(xiàng)目是勢不可擋的。SystemTap 從 2005 年開始開發(fā),它提供與 DTrace 和 ProbeVue 類似的功能。許多社區(qū)還進(jìn)一步完善了它,包括 Red Hat、Intel、Hitachi 和 IBM 等。

這些解決方案在功能上都是類似的,在觸發(fā)探針時(shí)使用探針和相關(guān)聯(lián)的操作腳本。現(xiàn)在,我們看一下 SystemTap 的安裝,然后探索它的架構(gòu)和使用。

?




回頁首

?

安裝 SystemTap

您可能僅需一個(gè) SystemTap 安裝就可以支持 SystemTap,具體情況取決于您的分發(fā)版和內(nèi)核。對于其他情況,需要使用一個(gè)調(diào)試內(nèi)核映像。這個(gè)小節(jié)介紹在 Ubuntu version 8.10 (Intrepid Ibex) 上安裝 SystemTap 的步驟,但這并不是一個(gè)具有代表性的 SystemTap 安裝。在 參 考資料 部分中,您可以找到在其他分發(fā)版和版本上安裝 SystemTap 的更多信息。

對大部分用戶而言,安裝 SystemTap 都非常簡單。對于 Ubuntu,使用 apt-get

            $ 
            
              sudo apt-get install systemtap
            
          

?

在安裝完成之后,您可以測試內(nèi)核看它是否支持 SystemTap。為此,使用以下簡單的命令行腳本:

            $ 
            
              sudo stap -ve 'probe begin { log("hello world") exit() }'
            
          

?

如果該腳本能夠正常運(yùn)行,您將在標(biāo)準(zhǔn)輸出 [stdout] 中看到 “hello world”。如果沒有看到這兩個(gè)單詞,則還需要其他工作。對于 Ubuntu 8.10,需要使用一個(gè)調(diào)試內(nèi)核映像。應(yīng)該使用 apt-get 獲取包 linux-image-debug-generic 就可以獲得它的。但這里不能直接使用 apt-get , 因此您可以下載該包并使用 dpkg 安裝它。您可以下載通用的調(diào)用映像包并按照以下的方式安裝它:

            $ 
            
              wget http://ddebs.ubuntu.com/pool/main/l/linux/
          linux-image-debug-2.6.27-14-generic_2.6.27-14.39_i386.ddeb
            
            


$ 
            
              sudo dpkg -i linux-image-debug-2.6.27-14-generic_2.6.27-14.39_i386.ddeb
            
          

?

現(xiàn)在,已經(jīng)安裝了通用的調(diào)試映像。對于 Ubuntu 8.10,還需要一個(gè)步驟:SystemTap 分發(fā)版有一個(gè)問題,但可以通過修改 SystemTap 源代碼輕松解決。查看 參 考資料 獲得如何更新運(yùn)行時(shí) time.c 文件的信息。

如果您使用定制的內(nèi)核,則需要確保啟用內(nèi)核選項(xiàng) CONFIG_RELAY CONFIG_DEBUG_FS CONFIG_DEBUG_INFO CONFIG_KPROBES

?




回頁首

?

SystemTap 的架構(gòu)

讓我們深入探索 SystemTap 的某些細(xì)節(jié),理解它如何在運(yùn)行的內(nèi)核中提供動態(tài)探針。您還將看到 SystemTap 是如何工作的,從構(gòu)建進(jìn)程腳本到在運(yùn)行的內(nèi)核中激活腳本。

動態(tài)地檢查內(nèi)核

SystemTap 用于檢查運(yùn)行的內(nèi)核的兩種方法是 Kprobes 返回探針 。但是理解任何內(nèi)核的最關(guān) 鍵要素是內(nèi)核的映射,它提供符號信息(比如函數(shù)、變量以及它們的地址)。有了內(nèi)核映射之后,就可以解決任何符號的地址,以及更改探針的行為。

Kprobes 從 2.6.9 版本開始就添加到主流的 Linux 內(nèi)核中,并且為探測內(nèi)核提供一般性服務(wù)。它提供一些不同的服務(wù),但最重要的兩種服務(wù)是 Kprobe 和 Kretprobe。Kprobe 特定于架構(gòu),它在需要檢查的指令的第一個(gè)字節(jié)中插入一個(gè)斷點(diǎn)指令。當(dāng)調(diào)用該指令時(shí),將執(zhí)行針對探針的特定處理函數(shù)。執(zhí)行完成之后,接著執(zhí)行原始的指令(從 斷點(diǎn)開始)。

Kretprobes 有所不同,它操作調(diào)用函數(shù)的返回結(jié)果。注意,因?yàn)橐粋€(gè)函數(shù)可能有多個(gè)返回點(diǎn),所以聽起來事情有些復(fù)雜。不過,它實(shí)際使用一種稱為 trampoline 的簡單技術(shù)。您將向函數(shù)條目添加一小段代碼,而不是檢查函數(shù)中的每個(gè)返回點(diǎn)。這段代碼使用 trampoline 地址替換堆棧上的返回地址 —— Kretprobe 地址。當(dāng)該函數(shù)存在時(shí),它沒有返回到調(diào)用方,而是調(diào)用 Kretprobe(執(zhí)行它的功能),然后從 Kretprobe 返回到實(shí)際的調(diào)用方。

SystemTap 的流程

圖 1 展示了 SystemTap 的基本流程,涉及到 3 個(gè)交互實(shí)用程序和 5 個(gè)階段。該流程首先從 SystemTap 腳本開始。您使用 stap 實(shí)用程序?qū)?stap 腳本轉(zhuǎn)換成提供探針行為的內(nèi)核模塊。stap 流程從將腳本轉(zhuǎn)換成解析樹開始 (pass 1)。然后使用細(xì)化(elaboration)步驟 (pass 2) 中關(guān)于當(dāng)前運(yùn)行的內(nèi)核的符號信息解析符號。接下來,轉(zhuǎn)換流程將解析樹轉(zhuǎn)換成 C 源代碼 (pass 3) 并使用解析后的信息和 tapset 腳本 (SystemTap 定義的庫,包含有用的功能)。stap 的最后步驟是構(gòu)造使用本地內(nèi)核模塊構(gòu)建進(jìn)程的內(nèi)核模塊 (pass 4)。


圖 1. SystemTap 流程
SystemTap 流程

有了可用的內(nèi)核模塊之后, stap 完成了自己的任務(wù),并將控制權(quán)交給其他兩個(gè)實(shí)用程序 SystemTap: staprun stapio 。這兩個(gè)實(shí)用程序協(xié)調(diào)工作,負(fù)責(zé)將模塊安裝到內(nèi)核中并將輸出發(fā)送到 stdout (pass 5)。如果在 shell 中按組合鍵 Ctrl-C 或腳本退出,將執(zhí)行清除進(jìn)程,這將導(dǎo)致卸載模塊并退出所有相關(guān)的實(shí)用程序。

SystemTap 的一個(gè)有趣特性是緩存腳本轉(zhuǎn)換的能力。如果安裝后的腳本沒有更改,您可以使用現(xiàn)有的模塊,而不是重新構(gòu)建模塊。圖 2 顯示了 user-space 和 kernel-space 元素以及基于 stap 的轉(zhuǎn)換流程。


圖 2. 從 kernel/user-space 角度了解 SystemTap 流程
從 kernel/user-space 角度了解 SystemTap 流程




回頁首

?

SystemTap 腳本編寫

在 SystemTap 中編寫腳本非常簡單,但也很靈活,有許多您需要使用的選項(xiàng)。 參 考資料 提供一個(gè)詳述語言和可行性的手冊的鏈接,但這個(gè)小節(jié)僅討論一些例子,讓您初步了解 SystemTap 腳本。

探針

SystemTap 腳本由探針和在觸發(fā)探針時(shí)需要執(zhí)行的代碼塊組成。探針有許多預(yù)定義模式,表 1 列出了其中的一部分。這個(gè)表列舉了幾種探針類型,包括調(diào)用內(nèi)核函數(shù)和從內(nèi)核函數(shù)返回。


表 1. 探針模式例子

探針類型 說明
begin 在腳本開始時(shí)觸發(fā)
end 在腳本結(jié)束時(shí)觸發(fā)
kernel.function("sys_sync") 調(diào)用 sys_sync 時(shí)觸發(fā)
kernel.function("sys_sync").call 同上
kernel.function("sys_sync").return 返回 sys_sync 時(shí)觸發(fā)
kernel.syscall.* 進(jìn)行任何系統(tǒng)調(diào)用時(shí)觸發(fā)
kernel.function("*@kernel/fork.c:934") 到達(dá) fork.c 的第 934 行時(shí)觸發(fā)
module("ext3").function("ext3_file_write") 調(diào)用 ext3 write 函數(shù)時(shí)觸發(fā)
timer.jiffies(1000) 每隔 1000 個(gè)內(nèi)核 jiffy 觸發(fā)一次
timer.ms(200).randomize(50) 每隔 200 毫秒觸發(fā)一次,帶有線性分布的隨機(jī)附加時(shí)間(-50 到 +50)

我們通過一個(gè)簡單的例子來理解如何構(gòu)造探針,并將代碼與該探針相關(guān)聯(lián)。清單 3 顯示了一個(gè)樣例探針,它在調(diào)用內(nèi)核系統(tǒng)調(diào)用 sys_sync 時(shí)觸發(fā)。當(dāng)該探針觸發(fā)時(shí),您希望計(jì)算調(diào)用的次數(shù),并發(fā)送這個(gè)計(jì)數(shù)以及表示調(diào)用進(jìn)程 ID(PID)的信息。首先,聲明一個(gè)任何探針都可以使用的全局值(全局名稱空間對所有探針都是通用的),然后將它初始化為 0。其次,定義您的探針,它是一個(gè)探測內(nèi)核函數(shù) sys_sync 的條目。與探針相關(guān)聯(lián)的腳本將遞增 count 變量,然后發(fā)出一條消息,該消息定義調(diào)用的次數(shù)和當(dāng)前調(diào)用的 PID。注意,這個(gè)例子與 C 語言中的探針非常相似(探針定義語法除外),如果具有 C 語言背景將非常有幫助。


清單 3. 一個(gè)簡單的探針和腳本

            				
global count=0

probe kernel.function("sys_sync") {
  count++
  printf( "sys_sync called %d times, currently by pid %d\n", count, pid );
}

          

?

您還可以聲明探針可以調(diào)用的函數(shù),尤其是希望供多個(gè)探針調(diào)用的通用函數(shù)。這個(gè)工具還支持遞歸到給定深度。

變量和類型

SystemTap 允許定義多種類型的變量,但類型是從上下文推斷得出的,因此不需要使用類型聲明。在 SystemTap 中,您可以找到數(shù)字(64 位簽名的整數(shù))、整數(shù)(64 位)、字符串和字面量(字符串或整數(shù))。您還可以使用關(guān)聯(lián)數(shù)組和統(tǒng)計(jì)數(shù)據(jù)(我們稍后討論)。

表達(dá)式

SystemTap 提供 C 語言中常用的所有必要操作符,并且用法也是一樣的。您還可以找到算術(shù)操作符、二進(jìn)制操作符、賦值操作符和指針廢棄。您還看到從 C 語言帶來的簡化,其中包括字符串連接、關(guān)聯(lián)數(shù)組元素和合并操作符。

語言元素

在探針內(nèi)部,SystemTap 提供一組類似于 C 一樣易于使用的語句。注意,盡管該語言允許您開發(fā)復(fù)雜的腳本,但每個(gè)探針只能執(zhí)行 1000 條語句(這個(gè)數(shù)量是可配置的)。表 2 列出了一小部分語句作為例子。注意,在這里的許多元素和 C 中的一樣,盡管有一些附加的東西是特定于 SystemTap 的。


表 2. SystemTap 的語言元素

語 句 說明
if (exp) {} else {} 標(biāo)準(zhǔn)的 if-then-else 語句
for (exp1 ; exp2 ; exp3 ) {} 一個(gè) for 循環(huán)
while (exp) {} 標(biāo)準(zhǔn)的 while 循環(huán)
do {} while (exp) 一個(gè) do-while 循環(huán)
break 退出迭代
continue 繼續(xù)迭代
next 從探針返回
return 從函數(shù)返回一個(gè)表達(dá)式
foreach (VAR in ARRAY) {} 迭代一個(gè)數(shù)組,將當(dāng)前的鍵分配給 VAR

本文在樣例腳本中探索了統(tǒng)計(jì)數(shù)據(jù)和聚合功能,因?yàn)檫@是 C 語言中不存在的。

最后,SystemTap 提供許多內(nèi)部函數(shù),這些函數(shù)提供關(guān)于當(dāng)前上下文的額外信息。例如,您可以使用 caller() 識別當(dāng)前的調(diào)用函數(shù),使用 cpu() 識別當(dāng)前的處理器號碼,以及使用 pid() 返回 PID。SystemTap 還提供許多其他函數(shù),提供對調(diào)用堆棧和當(dāng)前注冊表的訪問。

?




回頁首

?

SystemTap 例子

在簡單介紹了 SystemTap 的要點(diǎn)之后,我們接下來通過一些簡單的例子來了解 SystemTap 的工作原理。本文還展示了該腳本語言的一些有趣方面,比如聚合。

系統(tǒng)調(diào)用監(jiān)控

前一個(gè)小節(jié)探索了一個(gè)監(jiān)控 sync 系統(tǒng)調(diào)用的簡單腳本。現(xiàn)在,我們查看一個(gè)更加具有代表性的腳本,它可以監(jiān)控所有系統(tǒng)調(diào)用并收集與它們相關(guān)的額外信息。

清單 4 顯示的簡單腳本包含一個(gè)全局變量定義和 3 個(gè)獨(dú)立的探針。在首次加載腳本時(shí)調(diào)用第一個(gè)探針( begin 探針)。在這個(gè)探針中,您可以發(fā)出一條表示腳本在內(nèi)核中運(yùn)行的文本消息。接下來是一個(gè) syscall 探針。注意這里使用的通配符 ( * ),它告訴 SystemTap 監(jiān)控所有匹配的系統(tǒng)調(diào)用。當(dāng)該探針觸發(fā)時(shí),將為特定的 PID 和進(jìn)程名增加一個(gè)關(guān)聯(lián)數(shù)組元素。最后一個(gè)探針是 timer 探針。這個(gè)探針在 10,000 毫秒(10 秒)之后觸發(fā)。與這個(gè)探針相關(guān)聯(lián)的腳本將發(fā)送收集到的數(shù)據(jù)(遍歷每個(gè)關(guān)聯(lián)數(shù)組成員)。當(dāng)遍歷了所有成員之后,將調(diào)用 exit 調(diào)用,這導(dǎo)致卸載模塊和退出所有相關(guān)的 SystemTap 進(jìn)程。


清單 4. 監(jiān)控所有系統(tǒng)調(diào)用 (profile.stp)

            				
global syscalllist

probe begin {
  printf("System Call Monitoring Started (10 seconds)...\n")
}

probe syscall.*
{
  syscalllist[pid(), execname()]++
}

probe timer.ms(10000) {
  foreach ( [pid, procname] in syscalllist ) {
    printf("%s[%d] = %d\n", procname, pid, syscalllist[pid, procname] )
  }
  exit()
}

          

?

清單 4 中的腳本的輸出如清單 5 所示。從這個(gè)腳本中您可以看到運(yùn)行在用戶空間中的每個(gè)進(jìn)程,以及在 10 秒鐘內(nèi)發(fā)出的系統(tǒng)調(diào)用的數(shù)量。


清單 5. profile.stp 腳本的輸出

            				
$ 
            
              sudo stap profile.stp
            
            


System Call Monitoring Started (10 seconds)...
stapio[16208] = 104
gnome-terminal[6416] = 196
Xorg[5525] = 90
vmware-guestd[5307] = 764
hald-addon-stor[4969] = 30
hald-addon-stor[4988] = 15
update-notifier[6204] = 10
munin-node[5925] = 5
gnome-panel[6190] = 33
ntpd[5830] = 20
pulseaudio[6152] = 25
miniserv.pl[5859] = 10
syslogd[4513] = 5
gnome-power-man[6215] = 4
gconfd-2[6157] = 5
hald[4877] = 3
$ 

          

?

特定的進(jìn)程的系統(tǒng)調(diào)用監(jiān)控

在這個(gè)例子中,您稍微修改了上一個(gè)腳本,讓它收集一個(gè)進(jìn)程的系統(tǒng)調(diào)用數(shù)據(jù)。此外,除了僅捕捉計(jì)數(shù)之外,還捕捉針對目標(biāo)進(jìn)程的特定系統(tǒng)調(diào)用。清 單 6 顯示了該腳本。

這個(gè)例子根據(jù)特定的進(jìn)程進(jìn)行了測試(在本例中為 syslog 守護(hù)進(jìn)程),然后更改關(guān)聯(lián)數(shù)組以將系統(tǒng)調(diào)用名映射到計(jì)數(shù)數(shù)據(jù)。


清單 6. 新系統(tǒng)調(diào)用監(jiān)控腳本 (syslog_profile.stp)

            				
global syscalllist

probe begin {
  printf("Syslog Monitoring Started (10 seconds)...\n")
}

probe syscall.*
{
  if (execname() == "syslogd") {
    syscalllist[name]++
  }
}

probe timer.ms(10000) {
  foreach ( name in syscalllist ) {
    printf("%s = %d\n", name, syscalllist[name] )
  }
  exit()
}

          

?

清單 7 提供了該腳本的輸出。


清單 7. 新腳本的 SystemTap 輸出 (syslog_profile.stp)

            				
$ 
            
              sudo stap syslog_profile.stp
            
            


Syslog Monitoring Started (10 seconds)...
writev = 3
rt_sigprocmask = 1
select = 1
$ 

          

?

使用聚合步驟數(shù)字?jǐn)?shù)據(jù)

聚合實(shí)例時(shí)捕捉數(shù)字值的統(tǒng)計(jì)數(shù)據(jù)的出色方法。當(dāng)您捕捉大量數(shù)據(jù)時(shí),這個(gè)方法非常高效有用。在這個(gè)例子中,您收集關(guān)于網(wǎng)絡(luò)包接收和發(fā)送的數(shù)據(jù)。 清單 8 定義兩個(gè)新的探針來捕捉網(wǎng)絡(luò) I/O。每個(gè)探針捕捉特定網(wǎng)絡(luò)設(shè)備名、PID 和進(jìn)程名的包長度。在用戶按 Ctrl-C 調(diào)用的 end 探針提供發(fā)送捕獲的數(shù)據(jù)的方式。在本例中,您將遍歷 recv 聚合的內(nèi)容、為每個(gè)元組(設(shè)備名、PID 和進(jìn)程名)相加包的長度,然后發(fā)出該數(shù)據(jù)。注意,這里使用提取器來相加元組: @count 提取器獲取捕獲到的長度(包計(jì)數(shù))。您還可以使用 @sum 提取器來執(zhí)行相加操作,分別使用 @min @max 來收集最短或最長的程度,以及使用 @avg 來計(jì)算平均值。


清單 8. 收集網(wǎng)絡(luò)包長度數(shù)據(jù) (net.stp)

            				
global recv, xmit

probe begin {
  printf("Starting network capture (Ctl-C to end)\n")
}

probe netdev.receive {
  recv[dev_name, pid(), execname()] <<< length
}

probe netdev.transmit {
  xmit[dev_name, pid(), execname()] <<< length
}

probe end {
  printf("\nEnd Capture\n\n")

  printf("Iface Process........ PID.. RcvPktCnt XmtPktCnt\n")

  foreach ([dev, pid, name] in recv) {
    recvcount = @count(recv[dev, pid, name])
    xmitcount = @count(xmit[dev, pid, name])
    printf( "%5s %-15s %-5d %9d %9d\n", dev, name, pid, recvcount, xmitcount )
  }

  delete recv
  delete xmit
}

          

?

清單 9 提供了清單 8 中的腳本的輸出。注意,當(dāng)用戶按 Ctrl-C 時(shí)退出腳本,然后發(fā)送捕獲的數(shù)據(jù)。


清單 9. net.stp 的輸出

            				
$ 
            
              sudo stap net.stp
            
            


Starting network capture (Ctl-C to end)
^C
End Capture

Iface Process........ PID.. RcvPktCnt XmtPktCnt
 eth0 swapper         0           122        85
 eth0 metacity        6171          4         2
 eth0 gconfd-2        6157          5         1
 eth0 firefox         21424        48        98
 eth0 Xorg            5525         36        21
 eth0 bash            22860         1         0
 eth0 vmware-guestd   5307          1         1
 eth0 gnome-screensav 6244          6         3
Pass 5: run completed in 0usr/50sys/37694real ms.
$ 

          

?

捕獲柱狀圖數(shù)據(jù)

最后一個(gè)例子展示 SystemTap 用其他形式呈現(xiàn)數(shù)據(jù)有多么簡單 —— 在本例中以柱狀圖的形式顯示數(shù)據(jù)。返回到是一個(gè)例子中,將數(shù)據(jù)捕獲到一個(gè)名為 histogram 的聚合中(見清單 10)。然后,使用 netdev 接收和發(fā)送探針以捕捉包長度數(shù)據(jù)。當(dāng)探針結(jié)束時(shí),您將使用 @hist_log 提取器以柱狀圖的形式呈現(xiàn)數(shù)據(jù)。


清單 10. 步驟和呈現(xiàn)柱狀圖數(shù)據(jù) (nethist.stp)

            				
global histogram

probe begin {
  printf("Capturing...\n")
}

probe netdev.receive {
  histogram <<< length
}

probe netdev.transmit {
  histogram <<< length
}

probe end {
  printf( "\n" )
  print( @hist_log(histogram) )
}

          

?

清單 11 顯示了清單 10 的腳本的輸出。在這個(gè)例子中,使用了一個(gè)瀏覽器會話、一個(gè) FTP 會話和 ping 來生成網(wǎng)絡(luò)流量。 @hist_log 提取器是一個(gè)以 2 為底數(shù)的對數(shù)柱狀圖(如下所示)。還可以步驟其他柱狀圖,從而使您能夠定義 bucket 的大小。


清單 11. nethist.stp 的柱狀圖輸出

            				
$ sudo stap nethist.stp 
Capturing...
^C
value |-------------------------------------------------- count
    8 |                                                      0
   16 |                                                      0
   32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@            1601
   64 |@                                                    52
  128 |@                                                    46
  256 |@@@@                                                164
  512 |@@@                                                 140
 1024 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@  2033
 2048 |                                                      0
 4096 |                                                      0

$ 

          

?




回頁首

?

結(jié)束語

本文僅探索了 SystemTap 的最簡單的功能。在 參 考資料 部分中,您可以找到許多教程、例子和語言參考的鏈接,這些資源提供了解 SystemTap 所需的所有詳細(xì)信息。SystemTap 使用幾個(gè)現(xiàn)有的方法并借鑒了以前的內(nèi)核跟蹤實(shí)現(xiàn)。盡管該工具還在緊張開發(fā)當(dāng)中,但它現(xiàn)在已經(jīng)可以使用。請期待未來出現(xiàn)的新特性。

?

參考資料

學(xué) 習(xí)

Linux 自檢和 SystemTap


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 金坛市| 和平县| 郴州市| 察隅县| 兴化市| 大埔县| 玛纳斯县| 平乐县| 兖州市| 湄潭县| 县级市| 大冶市| 平泉县| 格尔木市| 华宁县| 临安市| 铜川市| 定远县| 天水市| 广河县| 青田县| 隆子县| 台安县| 隆回县| 和田县| 嘉定区| 将乐县| 黄冈市| 廉江市| 长宁县| 越西县| 措美县| 岑巩县| 金沙县| 高唐县| 英山县| 平遥县| 和政县| 宁国市| 南安市| 乌兰县|