動態追蹤技術:Linux喜迎DTrace
通過前面幾篇文章的介紹,我們已經可以通過一系列命令,從不同維度獲得操作系統當前的性能運行情況。 另外,借助類似Ganglia這樣的開源產品,持續不斷地實施性能數據采集和存儲,我們基于時間序列的歷史性能圖形,就可以大致判讀出計算集群的資源消耗情況和變化趨勢。 但是,僅僅這些還是不夠的,在很多情況下,我們希望能夠知道:“慢,是為什么慢;快,又是為什么快”。 如果要回答這個問題,就必須引入另外一件神兵利器:動態追蹤技術(Dynamic Tracing)。
鑒于這套兵器過于復雜(牛逼),屬于專家級技能, advanced performance analysis and troubleshooting tool。據稱掌握該技能需要耗費大約100小時以上,所以如果不是對于系統性能問題有***追求,以及變態般地技術狂熱,建議繞過本文。
為了便于展開,今天先起個頭,重點梳理下動態追蹤技術的發展簡史和目前的生態環境。更加具體詳細的內容,會在后續的文章中陸續發表。
上月底,正當全國人民翹首以盼光棍節的時候,開源社區傳來一則重要新聞: Linux 4.9-rc1發布,正式合并了一項重要特性:BPF追蹤(Timed sampling)。
系統性能領域的國際導師Brendan Gregg,感動得都快哭了,當即在Twitter上表示這是一個重要的里程碑! 他隨后又寫了一篇長文《DTrace for Linux 2016》,以示慶祝。
As a long time DTrace user and expert, this is an exciting milestone! --Brendan Gregg
Linux 合并了BPF而已嘛,跟DTrace這個勞什子有什么關系呢?
DTrace 是動態追蹤技術的鼻祖,源自 Solaris 操作系統,提供了高級性能分析和調試功能,它的源代碼采用 CDDL 許可證,不兼容 Linux 內核使用的 GPLv2 許可證,無法直接移植。 當然,江湖上還有另外一種說法,Linux之所以一直沒有原生支持DTrace,是因為Linus 覺得這玩意沒什么必要。 Anyway,隨著 BPF跟蹤的***主要功能合并到 Linux 4.9-rc1,Linux 現在有了類似 DTrace 的高級分析和調試功能。
Linux 這次合并的BPF(The Berkeley Packet Filter ),和Ganglia一樣,來自于加州大學伯克利分校(這所大學很有意思,以后還要反復提到)。 BPF,顧名思義,最早只是一個純粹的封***濾器,大家比較熟知的netfilter,就是基于BPF實現的動態編譯器。 后來在很多牛人的參與下,進行了擴展,得到了一個所謂的 eBPF,可以作為某種更加通用的內核虛擬機。 通過這種機制,我們其實可以在 Linux 中構建類似 DTrace 那種常駐內核的動態追蹤虛擬機。
Linux 沒有 DTrace(名字),但現在有了 DTrace(功能)
嚴格來說,DTrace這個詞本身,已經并不是狹義上基于Solaris的那套工具了,而是代表的是后現代操作系統的一整套工具家族和方法論。
History
當時 Solaris 操作系統的幾個工程師花了幾天幾夜去排查一個看似非常詭異的線上問題。 開始他們以為是很高級的問題,就特別賣力,結果折騰了幾天,***發現其實是一個非常愚蠢的、某個不起眼的地方的配置問題。 自從那件事情之后,這些工程師就痛定思痛,創造了 DTrace 這樣一個非常高級的調試工具,來幫助他們在未來的工作當中避免把過多精力花費在愚蠢問題上面。 畢竟大部分所謂的“詭異問題”其實都是低級問題,屬于那種“調不出來很郁悶,調出來了更郁悶”的類型。---《漫談動態追蹤技術》
通觀DTrace的演變過程,幾乎相當于一部現代操作系統系統的發展史,細查起來,極其復雜。 但是有兩個人非常值得關注,一個是***的布道師,一個是國內的代表人物, 初學者完全可以通過閱讀他們的文章、代碼,甚至微博/Twitter動態,了解動態追蹤技術的實際應用情況。
Brendan Gregg
前SUN性能工程師,最早的DTrace用戶,出版了包括《性能之巔》在內的一大批書籍,囊括了性能問題領域的技術、工具、方法論等方方面面。 是動態追蹤技術當之無愧的***布道師。他維護的個人博客發布了大量的原創內容,并且持續保持著相當的活躍度??梢宰鳛?**手的學習資料。
Twitter: 個人網站:
章亦春 網名 agentzh。開源項目OpenResty創始人,編寫了很多 Nginx 的第三方模塊, Perl 開源模塊,以及最近一些年寫的很多 Lua 方面的庫。 他發表過的《漫談動態追蹤技術》,是目前唯一由Brendan認證的中文資料,入門***。 另外,他本人也在目前的工作、開源項目運營中大量使用動態追蹤技術。
Linux 追蹤器選型
動態追蹤技術最復雜的地方在于追蹤器種類繁多,讓人一時無從下手。 根據前人的一些經驗總結,建議按照以下路徑進行選擇:
普通模式
適用于:開發者, 系統管理員, DevOps, SRE
CPU分析
perf_events的應用很廣泛,配合Brendan Gregg老師研究的火焰圖工具,可以分析程序在所有代碼基的資源消耗,精確定位到函數級。 例如
進程追蹤
- # ./execsnoop
- Tracing exec()s. Ctrl-C to end.
- PID PPID ARGS
- 22898 22004 man ls
- 22905 22898 preconv -e UTF-8
- 22908 22898 pager -s
- 22907 22898 nroff -mandoc -rLL=164n -rLT=164n -Tutf8
HARD模式
適用于:性能或內核工程師
Understanding all the Linux tracers to make a rational decision between them a huge undertaking.
- ftrace 內核hacker的***。已經包含在內核,能夠支持 tracepoints, kprobes, and uprobes, 并提供一些能力: 事件追蹤, 可選擇過濾器和參數; 事件計數和時間采樣,內核概覽;基于函數的路徑追蹤。
- perf_events Linux用戶的主要追蹤器之一,它的源代碼在內核中,通常在一個 linux-tools-common包。
- eBPF 基于內核的虛擬機
- SystemTap ***有力的追蹤器。它可以做幾乎所有的事情: 分析,打點, kprobes, uprobes (源子 SystemTap), USDT, 內核編程等。
- LTTng 事件收集器, 優于其它追蹤器,支持多種事件類型,包括 USDT。
- ktap 一個很有前景的追蹤器,基于lua內核虛擬機
- dtrace4linux 個人開發者業余產出 (Paul Fox) ,將 Sun DTrace遷移到 Linux。
- OL DTrace Oracle Linux DTrace,將 DTrace 遷移到Oracle Linux的實現。
- sysdig 一種新型追蹤器, 能夠基于類似tcpdump的命令操作 syscall events, 再用lua后處理。