systemtap對使用者級和核心級**提供了靜態和動態跟蹤的功能。systemtap採用其他的核心框架做源:靜態探針用tracepoints、動態探針用kprobes、使用者級別的探針用uprobes。這些源也為perf、lttng所用。
由於 systemtap 執行需要核心的除錯資訊支撐,預設發行版的核心在配置時這些除錯開關沒有開啟,所以安裝完systemtap也是無法去探測核心資訊的。
systemtap 工作原理是通過將指令碼語句翻譯成c語句,編譯成核心模組。模組載入之後,將所有探測的事件以鉤子的方式掛到核心上,當任何處理器上的某個事件發生時,相應鉤子上控制代碼就會被執行。最後,當systemtap會話結束之後,鉤子從核心上取下,移除模組。
工作原理如下圖:
安裝分為兩部分:一部分為是systemtap工具本身,另一部分是核心除錯資訊。
在ubuntu中使用apt-get install systemtap命令進行安裝。
因為systemtap需要核心資訊來防止指令,所以需要安裝debug info,先通過命令uname -r檢視核心版本,然後安裝linux-image-[uname –r]-dbgsym。
ubuntu參考:
或者直接執行stap-prep命令來進行安裝。
wget
chmod +x get-dbgsym
sudo ./get-dbgsy
另外,例項指令碼位於:/usr/share/systemtap/tapset中。
編譯完核心後,執行如下命令:
#ln -s /kernel/linux-4.15.15/vmlinux /boot/vmlinux-`uname -r`
#ln -s /lib/modules/`uname -r` /usr/lib/debug/lib/modules/`uname -r`
#cd /usr/lib/debug/lib/modules/`uname -r`
然後執行如下指令碼:
for file in `find -name '*.ko' -print`
dobuildid=`eu-readelf -n $file| grep build.id: | awk ''`
dir=`echo $buildid | cut -c1-2`
fn=`echo $buildid | cut -c3-`
mkdir -p /usr/lib/debug/.build-id/$dir
ln -s $file /usr/lib/debug/.build-id/$dir/$fn
ln -s $file /usr/lib/debug/.build-id/$dir/$.debug
done
探針的定義由句號分隔。示例如下:
begin:程式開始
end:程式開始
syscall.read: 系統呼叫read()的開始
syscall.read.return:系統呼叫read()的結束。
kernel.function(「sys_read」):核心函式sys_read()的開始
kernel.function(「sys_read」).return:核心函式sys_read的結束
socket.send:傳送包
timer.ms(100):每100ms觸發一次探針
timer.profile:按核心時鐘頻率對所有的cpu都觸發的探針,用於取樣/剖析。
process(「a.out」).statement(*@main.c:100): 跟蹤目標程序,可執行檔案a.out,main.c的100行。
一組相關的探針被稱為tapset。
syscall:系統呼叫
ioblock:塊裝置介面和io排程器
scheduler:核心cpu排程器事件
memory:程序和虛擬記憶體使用
scsi:scsi目標事件
networking:網路裝置事件
tcp:tcp協議事件
socket:套接字事件
此外systemtap還提供了許多action和內建變數,例如execname()獲取程序名,pid()獲取當前程序id,print_backtrace()列印核心棧的回溯資訊。
systemtap 在編譯階段會消耗cpu資源。也可以在不同的系統上編譯systemtap程式,然後將快取結果傳輸給目標系統。
執行如下**:
# stap -ve 'probe begin '
建立open.stp**如下:
#!/usr/bin/stap
probe begin
probe syscall.open
probe timer.ms(4000) # after 4 seconds
probe end
使用#stap open.stp 開始執行。
這個指令碼會在系統中呼叫open時候,將呼叫者的執行名字和程序號給列印出來,只要有人呼叫open就會列印,無所遁形。systemtap提供了很多可以被printf函式呼叫的函式,除了execname(),pid()外,還有tid()等等。
常用的有:tid(),uid(),cpu(),gettimeofday_s(),ctime(),pp(),thread_indent(),
因為發行版本本身不包含debuginfo,所以在使用時候難免有些阻礙。
相比oprofile,systemtap適合做跟蹤,而oprofile適合做效能診斷。
官方原始碼:
《systemtap_begginers_guide.pdf》
官方例項:
systemtap概述及例項
systemtap對使用者級和核心級 提供了靜態和動態跟蹤的功能。systemtap採用其他的核心框架做源 靜態探針用tracepoints 動態探針用kprobes 使用者級別的探針用uprobes。這些源也為perf lttng所用。由於 systemtap 執行需要核心的除錯資訊支撐,預設發行...
演算法基礎例項概述及目錄
筆者開設本專題主要為了溫習一些常見演算法,主要受眾是一些考研的學生和工作演算法面試的程式設計師,希望本文章能對你有所幫助!將數字字串轉換成整數 求素數超長正整數加法 多項式相加 拓展字元 簡易計算器 計算e值 生成全排列數 漢諾塔 hanoi tower 遊戲 學生成績排序 從檔案中查詢包含給定字串...
Keepalived 概述及部署
keepalived 軟體起初是專為lvs 負載均衡軟體設計的,用來管理並監控lvs 集群系統中各個服務節點的狀態,後來又加入了可以實現高可用的vrrp 功能。因此,keepalived除了能夠管理lvs軟體外,還可以作為其他服務 例如 nginx haproxy mysql等 的高可用解決方案軟體...