eBPF監控工具bcc系列三自定義工具trace

2021-09-20 12:09:21 字數 2015 閱讀 7089

上篇中是通用的直接可用工具。

trace工具可以指定跟蹤函式並顯示,可控制其輸出格式來顯示函式引數和返回值。

例如跟蹤檔案擁有者的屬性更改,也就是跟蹤三個檔案系統呼叫chown,fchown,lchown。使用如下:

trace.py    'p::sys_chown "file = %s, to_uid = %d, to_gid = %d, from_uid = %d", arg1, arg2, arg3, $uid'    'p::sys_fchown "fd = %d, to_uid = %d, to_gid = %d, from_uid = %d", arg1, arg2, arg3, $uid'    'p::sys_lchown "file = %s, to_uid = %d, to_gid = %d, from_uid = %d", arg1, arg2, arg3, $uid'

例如跟蹤非主動上下文切換。

trace.py -p 1134138 't:sched:sched_switch (args->prev_state == task_state_max || args->prev_state == 0)'

跟蹤系統中所有exec呼叫

# trace 'sys_execve "%s", arg1'

其中sys_execve是核心函式,%s表示列印字串,這個被複製為arg1就是程式的入參。

例如跟蹤系統讀操作read,所讀大小大於20000(這個引數可以通過man read檢視是在第三個位置上),所以跟蹤函式如下:

trace 'sys_read (arg3 > 20000) "read %d bytes", arg3'

還可以跟蹤使用者層函式,例如跟蹤bash上readline指令碼,並輸出返回值,可以如下書寫

trace 'r:bash:readline "%s", retval'

其中r表示retprobe是返回探針。

跟蹤讀寫失敗的命令

trace 'r:c:read ((int)retval < 0) "read failed: %d", retval' 'r:c:write ((int)retval < 0) "write failed: %d", retval' -t

還可以跟蹤核心的tracepoints,例如跟蹤block:block_rq_complete的tracepoint,並列印多少扇區被傳輸。

trace 't:block:block_rq_complete "sectors=%d", args->nr_sector' -t

如果不清楚跟蹤點的資料結構格式,可以使用tplist工具來獲得,例如

tplist -v block:block_rq_complete

得到資料結構後就可以用做引數來獲取nr_sector了。

越來越多高階庫支援探針,就像核心tracepoint一樣可以用來被跟蹤。

例如跟蹤pthread_create函式

trace 'u:pthread:pthread_create "%u", arg3' -t -c

其中%u表示將arg3解析成使用者層符號。同樣,核心的是%k.

現在ruby,node,openjdk都支援。

跟蹤ruby示例:

trace 'u:ruby:method__entry "%s.%s", arg1, arg2' -p $(pidof irb) -t

跟蹤共享庫函式如下:

trace.py 'r:/usr/lib64/libtinfo.so:curses_version "version=%s", retval'

跟蹤open,同時指出其開啟的檔案名字為test.txt

trace 'p:c:open (strcmp("test.txt", arg1)) "opening %s", arg1' -t

trace 'p::sys_nanosleep(struct timespec *ts) "sleep for %lld ns", ts->tv_nsec'

跟蹤指定程序的指定函式,使用-p引數,如下:

trace -p 2740 'do_sys_open "%s", arg2' -t

eBPF監控工具bcc系列五工具funccount

funccount函式可以通過匹配來跟蹤函式,tracepoints 或usdt探針。例如所有以vfs 開頭的核心函式。funccount vfs 這個對於探索核心 很有幫助,可以找出哪個函式在使用那個函式沒在使用。也可以設定間隔,每秒列印一次 funccount i 1 vfs 跟蹤所有tcp函式...

eBPF監控工具bcc系列五工具funccount

funccount函式可以通過匹配來跟蹤函式,tracepoints 或usdt探針。例如所有以vfs 開頭的核心函式。funccount vfs 這個對於探索核心 很有幫助,可以找出哪個函式在使用那個函式沒在使用。也可以設定間隔,每秒列印一次 funccount i 1 vfs 跟蹤所有tcp函式...

eBPF監控工具bcc系列二效能問題定位

這裡將問題診斷分為兩個階段,第一階段是定性分析,第二階段是是用bcc進行定量分析。在使用bcc工具前,先要進行基本的系統效能判斷,如下十個步驟,可以 到 分鐘之內觀測完畢。相關指令碼可以參考 l uptime l dmesg tail l vmstat 1 l mpstat p all 1 l pi...