DTrace(動態追蹤)
/ DEE-trayss /
在現代 Linux 追蹤工具存在之前,「我要怎麼安全地對一個活的正式環境系統提出任意問題?」這個問題,最早、也最具影響力地,是由 DTrace 來回答的。DTrace 於 2000 年代初在 Sun Microsystems 為 Solaris 作業系統而生,是一套全面的動態追蹤框架,讓維運者能在一台運行中的正式環境機器上,用單一一致的工具,安全地對幾乎任何東西插樁——核心函式、系統呼叫、以及應用程式探針。它是這整個領域所描述之物的智識祖先。
具體來說,DTrace 統一了 Linux 後來才零散長出來的想法。它暴露數千個探針(在核心裡、以及透過 USDT 在使用者空間裡),你用一個刻意受限的小語言 D 來寫腳本——類似 awk,帶有述語與彙總——編譯成由核心內虛擬機執行的安全位元碼。這聽起來很耳熟是有原因的:Linux 上的 eBPF + bpftrace 組合刻意呼應了 DTrace 的設計。DTrace 從一開始就圍繞正式環境安全來打造:停用時基本上免費的探針、一個沒有迴圈或任意記憶體寫入的語言(如此一次追蹤不會弄當或卡死系統)、以及有界的資源使用。它的觸及範圍遠超 Solaris:DTrace 被移植到 BSD 家族(尤其是 FreeBSD)以及 macOS,在 macOS 上它多年來撐起了像 Instruments 這樣的工具,所以一個剖析 App 的 Mac 開發者很可能用過 DTrace 卻沒叫出它的名字。
它的重要性在於它是起源故事、也是一個活著的工具:「度量—日誌—追蹤—探針」的心態、安全設計的追蹤語言、USDT 探針、以及在核心裡彙總,全都可追溯到 DTrace 的影響。給今天學習者的誠實定位:在 Linux 上你通常會拿 eBPF/bpftrace 而非 DTrace 本身,因為 DTrace 的家在 Solaris 與 BSD,它的 Linux 移植從未成為主流路徑;但理解 DTrace 能解釋現代工具「為什麼」長成這樣,而在 macOS 與 FreeBSD 上,DTrace 仍然非常確實是一個在用的真工具。
# 一行 DTrace 指令(Solaris/FreeBSD/macOS):依程式名統計系統呼叫 # dtrace -n 'syscall:::entry { @[execname] = count(); }' # sshd 12 # postgres 8841 # 對照 Linux 上幾乎一模一樣的 bpftrace 寫法 —— 同一血脈
一段 DTrace 腳本讀起來幾乎和 bpftrace 一模一樣——這相似是血緣造成的:bpftrace 是仿 DTrace 的設計而生。
一個常見混淆:DTrace 與 eBPF 是不同作業系統上的不同實作,不是同一個東西——eBPF 是 Linux 原生的機制,而 DTrace 仍是 macOS、FreeBSD 與啟發了它的 Solaris 血脈上的原生工具。