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