動態(tài)追蹤技術(shù):Linux喜迎DTrace

通過前面幾篇文章的介紹,我們已經(jīng)可以通過一系列命令,從不同維度獲得操作系統(tǒng)當(dāng)前的性能運(yùn)行情況。
另外,借助類似Ganglia這樣的開源產(chǎn)品,持續(xù)不斷地實(shí)施性能數(shù)據(jù)采集和存儲,我們基于時間序列的歷史性能圖形,就可以大致判讀出計(jì)算集群的資源消耗情況和變化趨勢。
但是,僅僅這些還是不夠的,在很多情況下,我們希望能夠知道:“慢,是為什么慢;快,又是為什么快”。
如果要回答這個問題,就必須引入另外一件神兵利器:動態(tài)追蹤技術(shù)(Dynamic Tracing)。

鑒于這套兵器過于復(fù)雜(牛逼),屬于專家級技能, advanced performance analysis and troubleshooting tool。
據(jù)稱掌握該技能需要耗費(fèi)大約100小時以上,所以如果不是對于系統(tǒng)性能問題有極致追求,以及變態(tài)般地技術(shù)狂熱,建議繞過本文。

為了便于展開,今天先起個頭,重點(diǎn)梳理下動態(tài)追蹤技術(shù)的發(fā)展簡史和目前的生態(tài)環(huán)境。更加具體詳細(xì)的內(nèi)容,會在后續(xù)的文章中陸續(xù)發(fā)表。

上月底,正當(dāng)全國人民翹首以盼光棍節(jié)的時候,開源社區(qū)傳來一則重要新聞:
Linux 4.9-rc1發(fā)布,正式合并了一項(xiàng)重要特性:BPF追蹤(Timed sampling)。

系統(tǒng)性能領(lǐng)域的國際導(dǎo)師Brendan Gregg,感動得都快哭了,當(dāng)即在Twitter上表示這是一個重要的里程碑!
他隨后又寫了一篇長文《DTrace for Linux 2016》,以示慶祝。

As a long time DTrace user and expert, this is an exciting milestone!
--Brendan Gregg

Linux 合并了BPF而已嘛,跟DTrace這個勞什子有什么關(guān)系呢?

DTrace 是動態(tài)追蹤技術(shù)的鼻祖,源自 Solaris 操作系統(tǒng),提供了高級性能分析和調(diào)試功能,它的源代碼采用 CDDL 許可證,不兼容 Linux 內(nèi)核使用的 GPLv2 許可證,無法直接移植。
當(dāng)然,江湖上還有另外一種說法,Linux之所以一直沒有原生支持DTrace,是因?yàn)長inus 覺得這玩意沒什么必要。
Anyway,隨著 BPF跟蹤的最后主要功能合并到 Linux 4.9-rc1,Linux 現(xiàn)在有了類似 DTrace 的高級分析和調(diào)試功能。

Linux 這次合并的BPF(The Berkeley Packet Filter ),和Ganglia一樣,來自于加州大學(xué)伯克利分校(這所大學(xué)很有意思,以后還要反復(fù)提到)。
BPF,顧名思義,最早只是一個純粹的封包過濾器,大家比較熟知的netfilter,就是基于BPF實(shí)現(xiàn)的動態(tài)編譯器。
后來在很多牛人的參與下,進(jìn)行了擴(kuò)展,得到了一個所謂的 eBPF,可以作為某種更加通用的內(nèi)核虛擬機(jī)。
通過這種機(jī)制,我們其實(shí)可以在 Linux 中構(gòu)建類似 DTrace 那種常駐內(nèi)核的動態(tài)追蹤虛擬機(jī)。

Linux 沒有 DTrace(名字),但現(xiàn)在有了 DTrace(功能)

嚴(yán)格來說,DTrace這個詞本身,已經(jīng)并不是狹義上基于Solaris的那套工具了,而是代表的是后現(xiàn)代操作系統(tǒng)的一整套工具家族和方法論。

History

當(dāng)時 Solaris 操作系統(tǒng)的幾個工程師花了幾天幾夜去排查一個看似非常詭異的線上問題。
開始他們以為是很高級的問題,就特別賣力,結(jié)果折騰了幾天,最后發(fā)現(xiàn)其實(shí)是一個非常愚蠢的、某個不起眼的地方的配置問題。
自從那件事情之后,這些工程師就痛定思痛,創(chuàng)造了 DTrace 這樣一個非常高級的調(diào)試工具,來幫助他們在未來的工作當(dāng)中避免把過多精力花費(fèi)在愚蠢問題上面。
畢竟大部分所謂的“詭異問題”其實(shí)都是低級問題,屬于那種“調(diào)不出來很郁悶,調(diào)出來了更郁悶”的類型。---《漫談動態(tài)追蹤技術(shù)》

通觀DTrace的演變過程,幾乎相當(dāng)于一部現(xiàn)代操作系統(tǒng)系統(tǒng)的發(fā)展史,細(xì)查起來,極其復(fù)雜。
但是有兩個人非常值得關(guān)注,一個是國際級的布道師,一個是國內(nèi)的代表人物,
初學(xué)者完全可以通過閱讀他們的文章、代碼,甚至微博/Twitter動態(tài),了解動態(tài)追蹤技術(shù)的實(shí)際應(yīng)用情況。

Brendan Gregg

前SUN性能工程師,最早的DTrace用戶,出版了包括《性能之巔》在內(nèi)的一大批書籍,囊括了性能問題領(lǐng)域的技術(shù)、工具、方法論等方方面面。
是動態(tài)追蹤技術(shù)當(dāng)之無愧的首席布道師。他維護(hù)的個人博客發(fā)布了大量的原創(chuàng)內(nèi)容,并且持續(xù)保持著相當(dāng)?shù)幕钴S度??梢宰鳛榈谝皇值膶W(xué)習(xí)資料。

Twitter:https://twitter.com/brendangregg
個人網(wǎng)站:http://www.brendangregg.com

章亦春
網(wǎng)名 agentzh。開源項(xiàng)目OpenResty創(chuàng)始人,編寫了很多 Nginx 的第三方模塊, Perl 開源模塊,以及最近一些年寫的很多 Lua 方面的庫。
他發(fā)表過的《漫談動態(tài)追蹤技術(shù)》,是目前唯一由Brendan認(rèn)證的中文資料,入門首選。
另外,他本人也在目前的工作、開源項(xiàng)目運(yùn)營中大量使用動態(tài)追蹤技術(shù)。
微博:http://weibo.com/agentzh

Linux 追蹤器選型

動態(tài)追蹤技術(shù)最復(fù)雜的地方在于追蹤器種類繁多,讓人一時無從下手。
根據(jù)前人的一些經(jīng)驗(yàn)總結(jié),建議按照以下路徑進(jìn)行選擇:

普通模式

適用于:開發(fā)者, 系統(tǒng)管理員, DevOps, SRE

CPU分析

perf_events的應(yīng)用很廣泛,配合Brendan Gregg老師研究的火焰圖工具,可以分析程序在所有代碼基的資源消耗,精確定位到函數(shù)級。
例如:


火焰圖實(shí)例

進(jìn)程追蹤

# ./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模式

適用于:性能或內(nèi)核工程師

Understanding all the Linux tracers to make a rational decision between them a huge undertaking.

  1. ftrace
    內(nèi)核hacker的最愛。已經(jīng)包含在內(nèi)核,能夠支持 tracepoints, kprobes, and uprobes,
    并提供一些能力: 事件追蹤, 可選擇過濾器和參數(shù); 事件計(jì)數(shù)和時間采樣,內(nèi)核概覽;基于函數(shù)的路徑追蹤。

  2. perf_events
    Linux用戶的主要追蹤器之一,它的源代碼在內(nèi)核中,通常在一個 linux-tools-common包。

  3. eBPF
    基于內(nèi)核的虛擬機(jī)

  4. SystemTap
    最強(qiáng)有力的追蹤器。它可以做幾乎所有的事情: 分析,打點(diǎn), kprobes, uprobes (源子 SystemTap), USDT, 內(nèi)核編程等。

  5. LTTng
    事件收集器, 優(yōu)于其它追蹤器,支持多種事件類型,包括 USDT。

  6. ktap
    一個很有前景的追蹤器,基于lua內(nèi)核虛擬機(jī)

  7. dtrace4linux
    個人開發(fā)者業(yè)余產(chǎn)出 (Paul Fox) ,將 Sun DTrace遷移到 Linux。

  8. OL DTrace
    Oracle Linux DTrace,將 DTrace 遷移到Oracle Linux的實(shí)現(xiàn)。

  9. sysdig
    一種新型追蹤器, 能夠基于類似tcpdump的命令操作 syscall events, 再用lua后處理。

擴(kuò)展閱讀:Linux 操作系統(tǒng)

推薦:電子書《Linux Perf Master》

發(fā)表在GitBook平臺,歡迎訂閱、下載、批評指正:
https://www.gitbook.com/book/riboseyim/linux-perf-master/details

eBook
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容