1 內(nèi)核調(diào)試以及工具總結(jié)
內(nèi)核總是那么捉摸不透, 內(nèi)核也會(huì)犯錯(cuò), 但是調(diào)試卻不能像用戶空間程序那樣, 為此內(nèi)核開發(fā)者為我們提供了一系列的工具和系統(tǒng)來支持內(nèi)核的調(diào)試.
內(nèi)核的調(diào)試, 其本質(zhì)是內(nèi)核空間與用戶空間的數(shù)據(jù)交換, 內(nèi)核開發(fā)者們提供了多樣的形式來完成這一功能.
2 用戶空間與內(nèi)核空間數(shù)據(jù)交換的文件系統(tǒng)
內(nèi)核中有三個(gè)常用的偽文件系統(tǒng): procfs, debugfs和sysfs.
它們都用于Linux內(nèi)核和用戶空間的數(shù)據(jù)交換, 但是適用的場景有所差異:
procfs歷史最早, 最初就是用來跟內(nèi)核交互的唯一方式, 用來獲取處理器、內(nèi)存、設(shè)備驅(qū)動(dòng)、進(jìn)程等各種信息.
sysfs跟kobject框架緊密聯(lián)系, 而kobject是為設(shè)備驅(qū)動(dòng)模型而存在的, 所以sysfs是為設(shè)備驅(qū)動(dòng)服務(wù)的.
debugfs從名字來看就是為debug而生, 所以更加靈活.
relayfs是一個(gè)快速的轉(zhuǎn)發(fā)(relay)數(shù)據(jù)的文件系統(tǒng), 它以其功能而得名. 它為那些需要從內(nèi)核空間轉(zhuǎn)發(fā)大量數(shù)據(jù)到用戶空間的工具和應(yīng)用提供了快速有效的轉(zhuǎn)發(fā)機(jī)制.
2.1 procfs文件系統(tǒng)
ProcFs介紹
procfs是比較老的一種用戶態(tài)與內(nèi)核態(tài)的數(shù)據(jù)交換方式, 內(nèi)核的很多數(shù)據(jù)都是通過這種方式出口給用戶的, 內(nèi)核的很多參數(shù)也是通過這種方式來讓用戶方便設(shè)置的. 除了sysctl出口到/proc下的參數(shù),procfs提供的大部分內(nèi)核參數(shù)是只讀的. 實(shí)際上, 很多應(yīng)用嚴(yán)重地依賴于procfs, 因此它幾乎是必不可少的組件. 前面部分的幾個(gè)例子實(shí)際上已經(jīng)使用它來出口內(nèi)核數(shù)據(jù), 但是并沒有講解如何使用, 本節(jié)將講解如何使用procfs.
2.2 sysfs文件系統(tǒng)
內(nèi)核子系統(tǒng)或設(shè)備驅(qū)動(dòng)可以直接編譯到內(nèi)核, 也可以編譯成模塊, 編譯到內(nèi)核, 使用前一節(jié)介紹的方法通過內(nèi)核啟動(dòng)參數(shù)來向它們傳遞參數(shù), 如果編譯成模塊, 則可以通過命令行在插入模塊時(shí)傳遞參數(shù), 或者在運(yùn)行時(shí), 通過sysfs來設(shè)置或讀取模塊數(shù)據(jù).
Sysfs是一個(gè)基于內(nèi)存的文件系統(tǒng), 實(shí)際上它基于ramfs,sysfs提供了一種把內(nèi)核數(shù)據(jù)結(jié)構(gòu), 它們的屬性以及屬性與數(shù)據(jù)結(jié)構(gòu)的聯(lián)系開放給用戶態(tài)的方式, 它與kobject子系統(tǒng)緊密地結(jié)合在一起, 因此內(nèi)核開發(fā)者不需要直接使用它, 而是內(nèi)核的各個(gè)子系統(tǒng)使用它. 用戶要想使用sysfs讀取和設(shè)置內(nèi)核參數(shù), 僅需裝載sysfs就可以通過文件操作應(yīng)用來讀取和設(shè)置內(nèi)核通過sysfs開放給用戶的各個(gè)參數(shù):
mkdir -p /sysfs mount -t sysfs sysfs /sysfs
注意, 不要把sysfs和sysctl混淆,sysctl是內(nèi)核的一些控制參數(shù), 其目的是方便用戶對(duì)內(nèi)核的行為進(jìn)行控制, 而sysfs僅僅是把內(nèi)核的kobject對(duì)象的層次關(guān)系與屬性開放給用戶查看, 因此sysfs的絕大部分是只讀的, 模塊作為一個(gè)kobject也被出口到sysfs, 模塊參數(shù)則是作為模塊屬性出口的, 內(nèi)核實(shí)現(xiàn)者為模塊的使用提供了更靈活的方式, 允許用戶設(shè)置模塊參數(shù)在sysfs的可見性并允許用戶在編寫模塊時(shí)設(shè)置這些參數(shù)在sysfs下的訪問權(quán)限, 然后用戶就可以通過sysfs來查看和設(shè)置模塊參數(shù), 從而使得用戶能在模塊運(yùn)行時(shí)控制模塊行為.
2.3 debugfs文件系統(tǒng)
內(nèi)核開發(fā)者經(jīng)常需要向用戶空間應(yīng)用輸出一些調(diào)試信息, 在穩(wěn)定的系統(tǒng)中可能根本不需要這些調(diào)試信息, 但是在開發(fā)過程中, 為了搞清楚內(nèi)核的行為, 調(diào)試信息非常必要, printk可能是用的最多的, 但它并不是最好的, 調(diào)試信息只是在開發(fā)中用于調(diào)試, 而printk將一直輸出, 因此開發(fā)完畢后需要清除不必要的printk語句, 另外如果開發(fā)者希望用戶空間應(yīng)用能夠改變內(nèi)核行為時(shí),printk就無法實(shí)現(xiàn).
因此, 需要一種新的機(jī)制, 那只有在需要的時(shí)候使用, 它在需要時(shí)通過在一個(gè)虛擬文件系統(tǒng)中創(chuàng)建一個(gè)或多個(gè)文件來向用戶空間應(yīng)用提供調(diào)試信息.
有幾種方式可以實(shí)現(xiàn)上述要求:
使用procfs, 在/proc創(chuàng)建文件輸出調(diào)試信息, 但是procfs對(duì)于大于一個(gè)內(nèi)存頁(對(duì)于x86是4K)的輸出比較麻煩, 而且速度慢, 有時(shí)回出現(xiàn)一些意想不到的問題.
使用sysfs(2.6內(nèi)核引入的新的虛擬文件系統(tǒng)), 在很多情況下, 調(diào)試信息可以存放在那里, 但是sysfs主要用于系統(tǒng)管理,它希望每一個(gè)文件對(duì)應(yīng)內(nèi)核的一個(gè)變量,如果使用它輸出復(fù)雜的數(shù)據(jù)結(jié)構(gòu)或調(diào)試信息是非常困難的.
使用libfs創(chuàng)建一個(gè)新的文件系統(tǒng), 該方法極其靈活, 開發(fā)者可以為新文件系統(tǒng)設(shè)置一些規(guī)則, 使用libfs使得創(chuàng)建新文件系統(tǒng)更加簡單, 但是仍然超出了一個(gè)開發(fā)者的想象.
為了使得開發(fā)者更加容易使用這樣的機(jī)制,Greg Kroah-Hartman開發(fā)了debugfs(在2.6.11中第一次引入), 它是一個(gè)虛擬文件系統(tǒng), 專門用于輸出調(diào)試信息, 該文件系統(tǒng)非常小, 很容易使用, 可以在配置內(nèi)核時(shí)選擇是否構(gòu)件到內(nèi)核中, 在不選擇它的情況下, 使用它提供的API的內(nèi)核部分不需要做任何改動(dòng).
2.4 relayfs文件系統(tǒng)
relayfs是一個(gè)快速的轉(zhuǎn)發(fā)(relay)數(shù)據(jù)的文件系統(tǒng), 它以其功能而得名. 它為那些需要從內(nèi)核空間轉(zhuǎn)發(fā)大量數(shù)據(jù)到用戶空間的工具和應(yīng)用提供了快速有效的轉(zhuǎn)發(fā)機(jī)制.
Channel是relayfs文件系統(tǒng)定義的一個(gè)主要概念, 每一個(gè)channel由一組內(nèi)核緩存組成, 每一個(gè)CPU有一個(gè)對(duì)應(yīng)于該channel的內(nèi)核緩存, 每一個(gè)內(nèi)核緩存用一個(gè)在relayfs文件系統(tǒng)中的文件文件表示, 內(nèi)核使用relayfs提供的寫函數(shù)把需要轉(zhuǎn)發(fā)給用戶空間的數(shù)據(jù)快速地寫入當(dāng)前CPU上的channel內(nèi)核緩存, 用戶空間應(yīng)用通過標(biāo)準(zhǔn)的文件I/O函數(shù)在對(duì)應(yīng)的channel文件中可以快速地取得這些被轉(zhuǎn)發(fā)出的數(shù)據(jù)mmap來. 寫入到channel中的數(shù)據(jù)的格式完全取決于內(nèi)核中創(chuàng)建channel的模塊或子系統(tǒng).
relayfs的用戶空間API:
relayfs實(shí)現(xiàn)了四個(gè)標(biāo)準(zhǔn)的文件I/O函數(shù),open、mmap、poll和close
注意 : 用戶態(tài)應(yīng)用在使用上述 API 時(shí)必須保證已經(jīng)掛載了 relayfs 文件系統(tǒng), 但內(nèi)核在創(chuàng)建和使用 channel時(shí)不需要relayfs 已經(jīng)掛載. 下面命令將把 relayfs 文件系統(tǒng)掛載到 /mnt/relay.
2.5 seq_file
一般地, 內(nèi)核通過在procfs文件系統(tǒng)下建立文件來向用戶空間提供輸出信息, 用戶空間可以通過任何文本閱讀應(yīng)用查看該文件信息, 但是procfs有一個(gè)缺陷, 如果輸出內(nèi)容大于1個(gè)內(nèi)存頁, 需要多次讀,因此處理起來很難, 另外, 如果輸出太大, 速度比較慢, 有時(shí)會(huì)出現(xiàn)一些意想不到的情況,Alexander Viro實(shí)現(xiàn)了一套新的功能, 使得內(nèi)核輸出大文件信息更容易, 該功能出現(xiàn)在2.4.15(包括2.4.15)以后的所有2.4內(nèi)核以及2.6內(nèi)核中, 尤其是在2.6內(nèi)核中,已經(jīng)大量地使用了該功能
3 printk
在內(nèi)核調(diào)試技術(shù)之中, 最簡單的就是printk的使用了, 它的用法和C語言應(yīng)用程序中的printf使用類似, 在應(yīng)用程序中依靠的是stdio.h中的庫, 而在linux內(nèi)核中沒有這個(gè)庫, 所以在linux內(nèi)核中,實(shí)現(xiàn)了自己的一套庫函數(shù),printk就是標(biāo)準(zhǔn)的輸出函數(shù)
4 ftrace && trace-cmd
4.1 trace && ftrace
Linux當(dāng)前版本中, 功能最強(qiáng)大的調(diào)試、跟蹤手段. 其最基本的功能是提供了動(dòng)態(tài)和靜態(tài)探測點(diǎn), 用于探測內(nèi)核中指定位置上的相關(guān)信息.
靜態(tài)探測點(diǎn), 是在內(nèi)核代碼中調(diào)用ftrace提供的相應(yīng)接口實(shí)現(xiàn), 稱之為靜態(tài)是因?yàn)? 是在內(nèi)核代碼中寫死的, 靜態(tài)編譯到內(nèi)核代碼中的, 在內(nèi)核編譯后, 就不能再動(dòng)態(tài)修改. 在開啟ftrace相關(guān)的內(nèi)核配置選項(xiàng)后, 內(nèi)核中已經(jīng)在一些關(guān)鍵的地方設(shè)置了靜態(tài)探測點(diǎn), 需要使用時(shí), 即可查看到相應(yīng)的信息.
動(dòng)態(tài)探測點(diǎn), 基本原理為 : 利用mcount機(jī)制, 在內(nèi)核編譯時(shí), 在每個(gè)函數(shù)入口保留數(shù)個(gè)字節(jié), 然后在使用ftrace時(shí), 將保留的字節(jié)替換為需要的指令, 比如跳轉(zhuǎn)到需要的執(zhí)行探測操作的代碼。
ftrace的作用是幫助開發(fā)人員了解Linux內(nèi)核的運(yùn)行時(shí)行為, 以便進(jìn)行故障調(diào)試或性能分析.
最早ftrace是一個(gè)function tracer, 僅能夠記錄內(nèi)核的函數(shù)調(diào)用流程. 如今ftrace已經(jīng)成為一個(gè)
framework, 采用plugin的方式支持開發(fā)人員添加更多種類的trace功能.
Ftrace由RedHat的Steve Rostedt負(fù)責(zé)維護(hù). 到2.6.30為止, 已經(jīng)支持的tracer包括 :
這里還沒有列出所有的tracer,ftrace是目前非?;钴S的開發(fā)領(lǐng)域, 新的tracer將不斷被加入內(nèi)核。
Linux trace使用入門:http://blog.csdn.net/jscese/article/details/46415531
4.2 ftrace前端工具trace-cmd
trace-cmd 介紹
trace-cmd和 開源的kernelshark均是內(nèi)核Ftrace的前段工具, 用于分分析核性能.
他們相當(dāng)于是一個(gè)/sys/kernel/debug/tracing中文件系統(tǒng)接口的封裝, 為用戶提供了更加直接和方便的操作.
使用
# 收集信息 sudo trace-cmd reord subsystem:tracing # 解析結(jié)果 #sudo trace-cmd report
trace-cmd: A front-end for Ftrace:https://lwn.net/Articles/410200/
其本質(zhì)就是對(duì)/sys/kernel/debug/tracing/events下各個(gè)模塊進(jìn)行操作, 收集數(shù)據(jù)并解析
5 Kprobe && systemtap
5.1 內(nèi)核kprobe機(jī)制
kprobe是linux內(nèi)核的一個(gè)重要特性, 是一個(gè)輕量級(jí)的內(nèi)核調(diào)試工具, 同時(shí)它又是其他一些更高級(jí)的內(nèi)核調(diào)試工具(比如perf和systemtap)的 “基礎(chǔ)設(shè)施”, 4.0版本的內(nèi)核中, 強(qiáng)大的eBPF特性也寄生于kprobe之上, 所以kprobe在內(nèi)核中的地位就可見一斑了.
Kprobes提供了一個(gè)強(qiáng)行進(jìn)入任何內(nèi)核例程并從中斷處理器無干擾地收集信息的接口. 使用Kprobes可以收集處理器寄存器和全局?jǐn)?shù)據(jù)結(jié)構(gòu)等調(diào)試信息。開發(fā)者甚至可以使用Kprobes來修改 寄存器值和全局?jǐn)?shù)據(jù)結(jié)構(gòu)的值.
如何高效地調(diào)試內(nèi)核?
printk是一種方法, 但是printk終歸是毫無選擇地全量輸出, 某些場景下不實(shí)用, 于是你可以試一下tracepoint, 我使能tracepoint機(jī)制的時(shí)候才輸出. 對(duì)于傻傻地放置printk來輸出信息的方式,tracepoint是個(gè)進(jìn)步, 但是tracepoint只是內(nèi)核在某些特定行為(比如進(jìn)程切換)上部署的一些靜態(tài)錨點(diǎn), 這些錨點(diǎn)并不一定是你需要的, 所以你仍然需要自己部署tracepoint, 重新編譯內(nèi)核. 那么kprobe的出現(xiàn)就很有必要了, 它可以在運(yùn)行的內(nèi)核中動(dòng)態(tài)插入探測點(diǎn), 執(zhí)行你預(yù)定義的操作.
它的基本工作機(jī)制是 : 用戶指定一個(gè)探測點(diǎn), 并把一個(gè)用戶定義的處理函數(shù)關(guān)聯(lián)到該探測點(diǎn), 當(dāng)內(nèi)核執(zhí)行到該探測點(diǎn)時(shí), 相應(yīng)的關(guān)聯(lián)函數(shù)被執(zhí)行,然后繼續(xù)執(zhí)行正常的代碼路徑.
kprobe實(shí)現(xiàn)了三種類型的探測點(diǎn) :kprobes,jprobes和kretprobes(也叫返回探測點(diǎn)).kprobes是可以被插入到內(nèi)核的任何指令位置的探測點(diǎn),jprobes則只能被插入到一個(gè)內(nèi)核函數(shù)的入口, 而kretprobes則是在指定的內(nèi)核函數(shù)返回時(shí)才被執(zhí)行.
5.2 前端工具systemtap
SystemTap是監(jiān)控和跟蹤運(yùn)行中的Linux內(nèi)核的操作的動(dòng)態(tài)方法. 這句話的關(guān)鍵詞是動(dòng)態(tài), 因?yàn)镾ystemTap沒有使用工具構(gòu)建一個(gè)特殊的內(nèi)核, 而是允許您在運(yùn)行時(shí)動(dòng)態(tài)地安裝該工具. 它通過一個(gè)Kprobes的應(yīng)用編程接口 (API) 來實(shí)現(xiàn)該目的.
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í)行特定的代碼行
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)核以動(dòng)態(tài)的方式進(jìn)行跟蹤.
考慮到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)的操作腳本.
Linux 下的一個(gè)全新的性能測量和調(diào)式診斷工具 Systemtap, 第 3 部分: Systemtap:https://www.ibm.com/developerworks/cn/linux/l-cn-systemtap3/
6 kgdb && kgtp
6.1 kgdb
KDB 和 KGDB 合并, 并進(jìn)入內(nèi)核
KGDB是大名鼎鼎的內(nèi)核調(diào)試工具, 他是由KDB和KGDB項(xiàng)目合并而來.
kdb是一個(gè)Linux系統(tǒng)的內(nèi)核調(diào)試器, 它是由SGI公司開發(fā)的遵循GPL許可證的開放源碼調(diào)試工具.kdb嵌入在Linux內(nèi)核中. 為內(nèi)核&&驅(qū)動(dòng)程序員提供調(diào)試手段. 它適合于調(diào)試內(nèi)核空間的程序代碼. 譬如進(jìn)行設(shè)備驅(qū)動(dòng)程序調(diào)試. 內(nèi)核模塊的調(diào)試等.
kgdb和kdb現(xiàn)在已經(jīng)合并了. 對(duì)于一個(gè)正在運(yùn)行的kgdb而言, 可以使用gdbmonitor命令來使用kdb命令. 比如
(gdb)gdb monitor ps -A
就可以運(yùn)行kdb的ps命令了.
分析一下kdb補(bǔ)丁和合入主線的kdb有啥不同
kdb跟kgdb合并之后, 也可以使用kgdb的IO驅(qū)動(dòng)(比如鍵盤), 但是同時(shí)也kdb也喪失了一些功能.合并之后的kdb不在支持匯編級(jí)的源碼調(diào)試. 因此它現(xiàn)在也是平臺(tái)獨(dú)立的.
kdump和kexec已經(jīng)被移除。
從/proc/meninfo中獲取的信息比以前少了。
bt命令現(xiàn)在使用的是內(nèi)核的backtracer,而不是kdb原來使用的反匯編。
合并之后的kdb不在具有原來的反匯編(id命令)
總結(jié)一下 :kdb和kgdb合并之后,系統(tǒng)中對(duì)這兩種調(diào)試方式幾乎沒有了明顯的界限,比如通過串口進(jìn)行遠(yuǎn)程訪問的時(shí)候,可以使用kgdb命令, 也可以使用kdb命令(使用gdb monitor實(shí)現(xiàn))
6.2 KGTP
KGTP是一個(gè) 實(shí)時(shí) 輕量級(jí)Linux調(diào)試器 和 跟蹤器. 使用KGTP
使用KGTP不需要在Linux內(nèi)核上打PATCH或者重新編譯, 只要編譯KGTP模塊并insmod就可以.
其讓Linux內(nèi)核提供一個(gè)遠(yuǎn)程GDB調(diào)試接口, 于是在本地或者遠(yuǎn)程的主機(jī)上的GDB可以在不需要停止內(nèi)核的情況下用GDB tracepoint和其他一些功能 調(diào)試 和 跟蹤Linux.
即使板子上沒有GDB而且其沒有可用的遠(yuǎn)程接口,KGTP也可以用離線調(diào)試的功能調(diào)試內(nèi)核(見http://code.google.com/p/kgtp/wiki/HOWTOCN#/sys/kernel/debug/gtpframe和離線調(diào)試)。
KGTP支持 X86-32 , X86-64 , MIPS 和 ARM 。
KGTP在Linux內(nèi)核 2.6.18到upstream 上都被測試過。
而且還可以用在 Android 上(見http://code.google.com/p/kgtp/wiki/HowToUseKGTPinAndroid)
7 perf
Perf是用來進(jìn)行軟件性能分析的工具。
通過它, 應(yīng)用程序可以利用PMU,tracepoint和內(nèi)核中的特殊計(jì)數(shù)器來進(jìn)行性能統(tǒng)計(jì). 它不但可以分析指定應(yīng)用程序的性能問題 (per thread). 也可以用來分析內(nèi)核的性能問題, 當(dāng)然也可以同時(shí)分析應(yīng)用代碼和內(nèi)核,從而全面理解應(yīng)用程序中的性能瓶頸.
最初的時(shí)候, 它叫做Performance counter, 在2.6.31中第一次亮相. 此后他成為內(nèi)核開發(fā)最為活躍的一個(gè)領(lǐng)域. 在2.6.32中它正式改名為Performance Event, 因?yàn)閜erf已不再僅僅作為PMU的抽象, 而是能夠處理所有的性能相關(guān)的事件.
使用perf, 您可以分析程序運(yùn)行期間發(fā)生的硬件事件,比如instructions retired,processor clock cycles等; 您也可以分析軟件事件, 比如Page Fault和進(jìn)程切換。
這使得Perf擁有了眾多的性能分析能力, 舉例來說,使用Perf可以計(jì)算每個(gè)時(shí)鐘周期內(nèi)的指令數(shù), 稱為IPC,IPC偏低表明代碼沒有很好地利用CPU.
Perf還可以對(duì)程序進(jìn)行函數(shù)級(jí)別的采樣, 從而了解程序的性能瓶頸究竟在哪里等等.Perf還可以替代strace, 可以添加動(dòng)態(tài)內(nèi)核probe點(diǎn). 還可以做benchmark衡量調(diào)度器的好壞.
人們或許會(huì)稱它為進(jìn)行性能分析的”瑞士軍刀”, 但我不喜歡這個(gè)比喻, 我覺得perf應(yīng)該是一把世間少有的倚天劍.
金庸筆下的很多人都有對(duì)寶刀的癖好, 即便本領(lǐng)低微不配擁有, 但是喜歡, 便無可奈何. 我恐怕正如這些人一樣, 因此進(jìn)了酒館客棧, 見到相熟或者不相熟的人, 就要興沖沖地要講講那倚天劍的故事.
8 其他Tracer工具
8.1 LTTng
LTTng是一個(gè)Linux平臺(tái)開源的跟蹤工具, 是一套軟件組件, 可允許跟蹤Linux內(nèi)核和用戶程序, 并控制跟蹤會(huì)話(開始/停止跟蹤、啟動(dòng)/停止事件 等等). 這些組件被綁定如下三個(gè)包 :
8.2 eBPF
extended Berkeley Packet Filter(eBPF)是一個(gè)可以在事件上運(yùn)行程序的高效內(nèi)核虛擬機(jī)(JIT)。它可能最終會(huì)提供 ftrace 和 perf_events 的內(nèi)核編程,并強(qiáng)化其他的 tracer。這是 Alexei Starovoitov 目前正在開發(fā)的,還沒有完全集成,但是從4.1開始已經(jīng)對(duì)一些優(yōu)秀的工具有足夠的內(nèi)核支持了,如塊設(shè)備I/O的延遲熱圖??蓞⒖计渲饕髡?Alexei Starovoitov 的BPF slides和eBPF samples。
8.3 Ktap
ktap 在過去是一款前景很好的 tracer,它使用內(nèi)核中的 lua 虛擬機(jī)處理,在沒有調(diào)試信息的情況下在嵌入式設(shè)備上運(yùn)行的很好。它分為幾個(gè)步驟,并在有一段時(shí)間似乎超過了 Linux 上所有的追蹤器。然后 eBPF 開始進(jìn)行內(nèi)核集成,而 ktap 的集成在它可以使用 eBPF 替代它自己的虛擬機(jī)后才開始。因?yàn)?eBPF 仍將持續(xù)集成幾個(gè)月,ktap 開發(fā)者要繼續(xù)等上一段時(shí)間。我希??今年晚些時(shí)候它能重新開發(fā)。
8.4 dtrace4linux
dtrace4linux 主要是 Paul Fox 一個(gè)人在業(yè)余時(shí)間完成的,它是 Sun DTrace 的 Linux 版本。它引入矚目,還有一些 provider 可以運(yùn)行,但是從某種程度上來說還不完整,更多的是一種實(shí)驗(yàn)性的工具(不安全)。我認(rèn)為,顧忌到許可問題,人們會(huì)小心翼翼的為 dtrace4linux 貢獻(xiàn)代碼:由于當(dāng)年 Sun 開源DTrace 使用的是 CDDL 協(xié)議,而 dtrace4linux 也不大可能最終進(jìn)入 Linux kernel。Paul 的方法很可能會(huì)使其成為一個(gè) add-on。我很樂意看到 Linux 平臺(tái)上的 DTrace 和這個(gè)項(xiàng)目的完成,我認(rèn)為當(dāng)我加入 Netflix 后將會(huì)花些時(shí)間來協(xié)助完成這個(gè)項(xiàng)目。然而,我還是要繼續(xù)使用內(nèi)置的 tracers,如 ftrace 和 perf_events。
8.5 OL DTrace
Oracle Linux DTrace為了將 DTrace 引入 Linux,特別是 Oracle Linux,做出了很大的努力。這些年來發(fā)布的多個(gè)版本表明了它的穩(wěn)定進(jìn)展。開發(fā)者們以一種對(duì)這個(gè)項(xiàng)目的前景看好的態(tài)度談?wù)撝倪M(jìn) DTrace 測試套件。很多有用的 provider 已經(jīng)完成了,如:syscall, profile, sdt, proc, sched 以及USDT。我很期待 fbt(function boundary tracing, 用于內(nèi)核動(dòng)態(tài)跟蹤)的完成,它是 Linux 內(nèi)核上非常棒的 provider。OL DTrace 最終的成功將取決于人們對(duì)運(yùn)行 Oracle Linux(為技術(shù)支持付費(fèi))有多大興趣,另一方面取決于它是否完全開源:它的內(nèi)核元件是開源的,而我沒有看到它的用戶級(jí)別代碼。
8.6 sysdig
sysdig是一個(gè)使用類tcpdump語法來操作系統(tǒng)事件的新tracer,它使用lua提交進(jìn)程。它很優(yōu)秀,它見證了系統(tǒng)跟蹤領(lǐng)域的變革。它的局限性在于它只在當(dāng)前進(jìn)行系統(tǒng)調(diào)用,在提交進(jìn)行時(shí)將所有事件轉(zhuǎn)儲(chǔ)為用戶級(jí)別。你可以使用系統(tǒng)調(diào)用做很多事情,然而我還是很希望它能支持跟蹤點(diǎn)、kprobe和uprobe。我還期待它能支持eBPF做內(nèi)核摘要。目前,sysdig開發(fā)者正在增加容器支持。留意這些內(nèi)容。
審核編輯:湯梓紅
-
內(nèi)核
+關(guān)注
關(guān)注
3文章
1372瀏覽量
40289 -
Linux
+關(guān)注
關(guān)注
87文章
11304瀏覽量
209496 -
調(diào)試
+關(guān)注
關(guān)注
7文章
578瀏覽量
33941 -
文件系統(tǒng)
+關(guān)注
關(guān)注
0文章
284瀏覽量
19911 -
數(shù)據(jù)交換
+關(guān)注
關(guān)注
0文章
102瀏覽量
17925
原文標(biāo)題:8 其他Tracer工具
文章出處:【微信號(hào):嵌入式情報(bào)局,微信公眾號(hào):嵌入式情報(bào)局】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評(píng)論請先 登錄
相關(guān)推薦
評(píng)論