作者:Benjamin H. Sigelman, Luiz Andr′e Barroso, Mike Burrows, Pat Stephenson, Manoj Plakal, Donald Beaver, Saul Jaspan, Chandan Shanbhag
概述
當(dāng)代的互聯(lián)網(wǎng)的服務(wù),通常都是用復(fù)雜的浇衬、大規(guī)模分布式集群來實(shí)現(xiàn)的。互聯(lián)網(wǎng)應(yīng)用構(gòu)建在不同的軟件模塊集上糊秆,這些軟件模塊,有可能是由不同的團(tuán)隊(duì)開發(fā)议双、可能使用不同的編程語言來實(shí)現(xiàn)痘番、有可能布在了幾千臺服務(wù)器,橫跨多個不同的數(shù)據(jù)中心。因此汞舱,就需要一些可以幫助理解系統(tǒng)行為伍纫、用于分析性能問題的工具。
Dapper--Google生產(chǎn)環(huán)境下的分布式跟蹤系統(tǒng)昂芜,應(yīng)運(yùn)而生莹规。那么我們就來介紹一個大規(guī)模集群的跟蹤系統(tǒng),它是如何滿足一個低損耗泌神、應(yīng)用透明的良漱、大范圍部署這三個需求的。當(dāng)然Dapper設(shè)計(jì)之初欢际,參考了一些其他分布式系統(tǒng)的理念母市,尤其是Magpie和X-Trace,但是我們之所以能成功應(yīng)用在生產(chǎn)環(huán)境上损趋,還需要一些畫龍點(diǎn)睛之筆患久,例如采樣率的使用以及把代碼植入限制在一小部分公共庫的改造上。
自從Dapper發(fā)展成為一流的監(jiān)控系統(tǒng)之后舶沿,給其他應(yīng)用的開發(fā)者和運(yùn)維團(tuán)隊(duì)幫了大忙墙杯,所以我們今天才發(fā)表這篇論文,來匯報一下這兩年來括荡,Dapper是怎么構(gòu)建和部署的高镐。Dapper最初只是作為一個自給自足的監(jiān)控工具起步的,但最終進(jìn)化成一個監(jiān)控平臺畸冲,這個監(jiān)控平臺促生出多種多樣的監(jiān)控工具嫉髓,有些甚至已經(jīng)不是由Dapper團(tuán)隊(duì)開發(fā)的了。下面我們會介紹一些使用Dapper搭建的分析工具邑闲,分享一下這些工具在google內(nèi)部使用的統(tǒng)計(jì)數(shù)據(jù)算行,展現(xiàn)一些使用場景,最后會討論一下我們迄今為止從Dapper收獲了些什么苫耸。
1. 介紹
我們開發(fā)Dapper是為了收集更多的復(fù)雜分布式系統(tǒng)的行為信息州邢,然后呈現(xiàn)給Google的開發(fā)者們。這樣的分布式系統(tǒng)有一個特殊的好處褪子,因?yàn)槟切┐笠?guī)模的低端服務(wù)器量淌,作為互聯(lián)網(wǎng)服務(wù)的載體,是一個特殊的經(jīng)濟(jì)劃算的平臺嫌褪。想要在這個上下文中理解分布式系統(tǒng)的行為呀枢,就需要監(jiān)控那些橫跨了不同的應(yīng)用、不同的服務(wù)器之間的關(guān)聯(lián)動作笼痛。
下面舉一個跟搜索相關(guān)的例子裙秋,這個例子闡述了Dapper可以應(yīng)對哪些挑戰(zhàn)琅拌。比如一個前段服務(wù)可能對上百臺查詢服務(wù)器發(fā)起了一個Web查詢,每一個查詢都有自己的Index摘刑。這個查詢可能會被發(fā)送到多個的子系統(tǒng)进宝,這些子系統(tǒng)分別用來處理廣告、進(jìn)行拼寫檢查或是查找一些像圖片泣侮、視頻或新聞這樣的特殊結(jié)果即彪。根據(jù)每個子系統(tǒng)的查詢結(jié)果進(jìn)行篩選,得到最終結(jié)果活尊,最后匯總到頁面上。我們把這種搜索模型稱為“全局搜索”(universal search)漏益∮济蹋總的來說,這一次全局搜索有可能調(diào)用上千臺服務(wù)器绰疤,涉及各種服務(wù)铜犬。而且,用戶對搜索的耗時是很敏感的轻庆,而任何一個子系統(tǒng)的低效都導(dǎo)致導(dǎo)致最終的搜索耗時癣猾。如果一個工程師只能知道這個查詢耗時不正常,但是他無從知曉這個問題到底是由哪個服務(wù)調(diào)用造成的余爆,或者為什么這個調(diào)用性能差強(qiáng)人意纷宇。首先,這個工程師可能無法準(zhǔn)確的定位到這次全局搜索是調(diào)用了哪些服務(wù)蛾方,因?yàn)樾碌姆?wù)像捶、乃至服務(wù)上的某個片段,都有可能在任何時間上過線或修改過桩砰,有可能是面向用戶功能拓春,也有可能是一些例如針對性能或安全認(rèn)證方面的功能改進(jìn)。其次亚隅,你不能苛求這個工程師對所有參與這次全局搜索的服務(wù)都了如指掌硼莽,每一個服務(wù)都有可能是由不同的團(tuán)隊(duì)開發(fā)或維護(hù)的。再次煮纵,這些暴露出來的服務(wù)或服務(wù)器有可能同時還被其他客戶端使用著懂鸵,所以這次全局搜索的性能問題甚至有可能是由其他應(yīng)用造成的。舉個例子醉途,一個后臺服務(wù)可能要應(yīng)付各種各樣的請求類型矾瑰,而一個使用效率很高的存儲系統(tǒng),比如Bigtable隘擎,有可能正被反復(fù)讀寫著殴穴,因?yàn)樯厦媾苤鞣N各樣的應(yīng)用。
上面這個案例中我們可以看到,對Dapper我們只有兩點(diǎn)要求:無所不在的部署采幌,持續(xù)的監(jiān)控劲够。無所不在的重要性不言而喻,因?yàn)樵谑褂酶櫹到y(tǒng)的進(jìn)行監(jiān)控時休傍,即便只有一小部分沒被監(jiān)控到征绎,那么人們對這個系統(tǒng)是不是值得信任都會產(chǎn)生巨大的質(zhì)疑。另外磨取,監(jiān)控應(yīng)該是7x24小時的人柿,畢竟,系統(tǒng)異趁ρ幔或是那些重要的系統(tǒng)行為有可能出現(xiàn)過一次凫岖,就很難甚至不太可能重現(xiàn)。那么逢净,根據(jù)這兩個明確的需求哥放,我們可以直接推出三個具體的設(shè)計(jì)目標(biāo):
1.低消耗:跟蹤系統(tǒng)對在線服務(wù)的影響應(yīng)該做到足夠小。在一些高度優(yōu)化過的服務(wù)爹土,即使一點(diǎn)點(diǎn)損耗也會很容易察覺到甥雕,而且有可能迫使在線服務(wù)的部署團(tuán)隊(duì)不得不將跟蹤系統(tǒng)關(guān)停。
2.應(yīng)用級的透明:對于應(yīng)用的程序員來說胀茵,是不需要知道有跟蹤系統(tǒng)這回事的社露。如果一個跟蹤系統(tǒng)想生效泥张,就必須需要依賴應(yīng)用的開發(fā)者主動配合垫蛆,那么這個跟蹤系統(tǒng)也太脆弱了,往往由于跟蹤系統(tǒng)在應(yīng)用中植入代碼的bug或疏忽導(dǎo)致應(yīng)用出問題两入,這樣才是無法滿足對跟蹤系統(tǒng)“無所不在的部署”這個需求轨奄。面對當(dāng)下想Google這樣的快節(jié)奏的開發(fā)環(huán)境來說孟害,尤其重要。
3.延展性:Google至少在未來幾年的服務(wù)和集群的規(guī)模挪拟,監(jiān)控系統(tǒng)都應(yīng)該能完全把控住挨务。
一個額外的設(shè)計(jì)目標(biāo)是為跟蹤數(shù)據(jù)產(chǎn)生之后,進(jìn)行分析的速度要快玉组,理想情況是數(shù)據(jù)存入跟蹤倉庫后一分鐘內(nèi)就能統(tǒng)計(jì)出來谎柄。盡管跟蹤系統(tǒng)對一小時前的舊數(shù)據(jù)進(jìn)行統(tǒng)計(jì)也是相當(dāng)有價值的,但如果跟蹤系統(tǒng)能提供足夠快的信息反饋惯雳,就可以對生產(chǎn)環(huán)境下的異常狀況做出快速反應(yīng)朝巫。
做到真正的應(yīng)用級別的透明,這應(yīng)該是當(dāng)下面臨的最挑戰(zhàn)性的設(shè)計(jì)目標(biāo)石景,我們把核心跟蹤代碼做的很輕巧劈猿,然后把它植入到那些無所不在的公共組件種拙吉,比如線程調(diào)用、控制流以及RPC庫揪荣。使用自適應(yīng)的采樣率可以使跟蹤系統(tǒng)變得可伸縮筷黔,并降低性能損耗,這些內(nèi)容將在第4.4節(jié)中提及仗颈。結(jié)果展示的相關(guān)系統(tǒng)也需要包含一些用來收集跟蹤數(shù)據(jù)的代碼佛舱,用來圖形化的工具,以及用來分析大規(guī)模跟蹤數(shù)據(jù)的庫和API挨决。雖然單獨(dú)使用Dapper有時就足夠讓開發(fā)人員查明異常的來源请祖,但是Dapper的初衷不是要取代所有其他監(jiān)控的工具。我們發(fā)現(xiàn)凰棉,Dapper的數(shù)據(jù)往往側(cè)重性能方面的調(diào)查损拢,所以其他監(jiān)控工具也有他們各自的用處。
1.1 文獻(xiàn)的總結(jié)
分布式系統(tǒng)跟蹤工具的設(shè)計(jì)空間已經(jīng)被一些優(yōu)秀文章探索過了撒犀,其中的Pinpoint[9]、Magpie[3]和X-Trace[12]和Dapper最為相近掏秩。這些系統(tǒng)在其發(fā)展過程的早期傾向于寫入研究報告中或舞,即便他們還沒來得及清楚地評估系統(tǒng)當(dāng)中一些設(shè)計(jì)的重要性。相比之下蒙幻,由于Dapper已經(jīng)在大規(guī)模生產(chǎn)環(huán)境中摸爬滾打了多年映凳,經(jīng)過這么多生產(chǎn)環(huán)境的驗(yàn)證之后,我們認(rèn)為這篇論文最適合重點(diǎn)闡述在部署Dapper的過程中我們有那些收獲邮破,我們的設(shè)計(jì)思想是如何決定的诈豌,以及以什么樣的方式實(shí)現(xiàn)它才會最有用。Dappe作為一個平臺抒和,承載基于Dapper開發(fā)的性能分析工具矫渔,以及Dapper自身的監(jiān)測工具,它的價值在于我們可以在回顧評估中找出一些意想不到的結(jié)果摧莽。
雖然Dapper在許多高階的設(shè)計(jì)思想上吸取了Pinpoint和Magpie的研究成果庙洼,但在分布式跟蹤這個領(lǐng)域中,Dapper的實(shí)現(xiàn)包含了許多新的貢獻(xiàn)镊辕。例如油够,我們想實(shí)現(xiàn)低損耗的話,特別是在高度優(yōu)化的而且趨于極端延遲敏感的Web服務(wù)中征懈,采樣率是很必要的石咬。或許更令人驚訝的是卖哎,我們發(fā)現(xiàn)即便是1/1000的采樣率鬼悠,對于跟蹤數(shù)據(jù)的通用使用層面上删性,也可以提供足夠多的信息。
我們的系統(tǒng)的另一個重要的特征厦章,就是我們能實(shí)現(xiàn)的應(yīng)用級的透明镇匀。我們的組件對應(yīng)用的侵入被先限制在足夠低的水平上,即使想Google網(wǎng)頁搜索這么大規(guī)模的分布式系統(tǒng)袜啃,也可以直接進(jìn)行跟蹤而無需加入額外的標(biāo)注(Annotation)汗侵。雖然由于我們的部署系統(tǒng)有幸是一定程度的同質(zhì)化的,所以更容易做到對應(yīng)用層的透明這點(diǎn)群发,但是我們證明了這是實(shí)現(xiàn)這種程度的透明性的充分條件晰韵。
2. Dapper的分布式跟蹤
圖1:這個路徑由用戶的X請求發(fā)起,穿過一個簡單的服務(wù)系統(tǒng)熟妓。用字母標(biāo)識的節(jié)點(diǎn)代表分布式系統(tǒng)中的不同處理過程雪猪。
分布式服務(wù)的跟蹤系統(tǒng)需要記錄在一次特定的請求后系統(tǒng)中完成的所有工作的信息。舉個例子起愈,圖1展現(xiàn)的是一個和5臺服務(wù)器相關(guān)的一個服務(wù)只恨,包括:前端(A),兩個中間層(B和C)抬虽,以及兩個后端(D和E)官觅。當(dāng)一個用戶(這個用例的發(fā)起人)發(fā)起一個請求時,首先到達(dá)前端阐污,然后發(fā)送兩個RPC到服務(wù)器B和C休涤。B會馬上做出反應(yīng),但是C需要和后端的D和E交互之后再返還給A笛辟,由A來響應(yīng)最初的請求功氨。對于這樣一個請求,簡單實(shí)用的分布式跟蹤的實(shí)現(xiàn)手幢,就是為服務(wù)器上每一次你發(fā)送和接收動作來收集跟蹤標(biāo)識符(message identifiers)和時間戳(timestamped events)捷凄。
為了將所有記錄條目與一個給定的發(fā)起者(例如,圖1中的RequestX)關(guān)聯(lián)上并記錄所有信息弯菊,現(xiàn)在有兩種解決方案纵势,黑盒(black-box)和基于標(biāo)注(annotation-based)的監(jiān)控方案。黑盒方案[1管钳,15钦铁,2]假定需要跟蹤的除了上述信息之外沒有額外的信息,這樣使用統(tǒng)計(jì)回歸技術(shù)來推斷兩者之間的關(guān)系才漆∨2埽基于標(biāo)注的方案[3,12醇滥,9黎比,16]依賴于應(yīng)用程序或中間件明確地標(biāo)記一個全局ID超营,從而連接每一條記錄和發(fā)起者的請求。雖然黑盒方案比標(biāo)注方案更輕便阅虫,他們需要更多的數(shù)據(jù)演闭,以獲得足夠的精度,因?yàn)樗麄円蕾囉诮y(tǒng)計(jì)推論颓帝∶着觯基于標(biāo)注的方案最主要的缺點(diǎn)是,很明顯购城,需要代碼植入吕座。在我們的生產(chǎn)環(huán)境中,因?yàn)樗械膽?yīng)用程序都使用相同的線程模型瘪板,控制流和RPC系統(tǒng)吴趴,我們發(fā)現(xiàn),可以把代碼植入限制在一個很小的通用組件庫中侮攀,從而實(shí)現(xiàn)了監(jiān)測系統(tǒng)的應(yīng)用對開發(fā)人員是有效地透明锣枝。
我們傾向于認(rèn)為,Dapper的跟蹤架構(gòu)像是內(nèi)嵌在RPC調(diào)用的樹形結(jié)構(gòu)兰英。然而惊橱,我們的核心數(shù)據(jù)模型不只局限于我們的特定的RPC框架,我們還能跟蹤其他行為箭昵,例如Gmail的SMTP會話,外界的HTTP請求回季,和外部對SQL服務(wù)器的查詢等家制。從形式上看,我們的Dapper跟蹤模型使用的樹形結(jié)構(gòu)泡一,Span以及Annotation颤殴。
2.1 跟蹤樹和span
在Dapper跟蹤樹結(jié)構(gòu)中,樹節(jié)點(diǎn)是整個架構(gòu)的基本單元鼻忠,而每一個節(jié)點(diǎn)又是對span的引用涵但。節(jié)點(diǎn)之間的連線表示的span和它的父span直接的關(guān)系。雖然span在日志文件中只是簡單的代表span的開始和結(jié)束時間帖蔓,他們在整個樹形結(jié)構(gòu)中卻是相對獨(dú)立的矮瘟,任何RPC相關(guān)的時間數(shù)據(jù)、零個或多個特定應(yīng)用程序的Annotation的相關(guān)內(nèi)容會在2.3節(jié)中討論塑娇。
圖2:5個span在Dapper跟蹤樹種短暫的關(guān)聯(lián)關(guān)系
在圖2中說明了span在一個大的跟蹤過程中是什么樣的澈侠。Dapper記錄了span名稱,以及每個span的ID和父ID埋酬,以重建在一次追蹤過程中不同span之間的關(guān)系哨啃。如果一個span沒有父ID被稱為root span烧栋。所有span都掛在一個特定的跟蹤上,也共用一個跟蹤id(在圖中未示出)拳球。所有這些ID用全局唯一的64位整數(shù)標(biāo)示审姓。在一個典型的Dapper跟蹤中,我們希望為每一個RPC對應(yīng)到一個單一的span上祝峻,而且每一個額外的組件層都對應(yīng)一個跟蹤樹型結(jié)構(gòu)的層級魔吐。
圖3:在圖2中所示的一個單獨(dú)的span的細(xì)節(jié)圖
圖3給出了一個更詳細(xì)的典型的Dapper跟蹤span的記錄點(diǎn)的視圖。在圖2中這種某個span表述了兩個“Helper.Call”的RPC(分別為server端和client端)呼猪。span的開始時間和結(jié)束時間画畅,以及任何RPC的時間信息都通過Dapper在RPC組件庫的植入記錄下來。如果應(yīng)用程序開發(fā)者選擇在跟蹤中增加他們自己的注釋(如圖中“foo”的注釋)(業(yè)務(wù)數(shù)據(jù))宋距,這些信息也會和其他span信息一樣記錄下來轴踱。
記住,任何一個span可以包含來自不同的主機(jī)信息谚赎,這些也要記錄下來淫僻。事實(shí)上,每一個RPC span可以包含客戶端和服務(wù)器兩個過程的注釋壶唤,使得鏈接兩個主機(jī)的span會成為模型中所說的span雳灵。由于客戶端和服務(wù)器上的時間戳來自不同的主機(jī),我們必須考慮到時間偏差闸盔。在我們的分析工具悯辙,我們利用了這個事實(shí):RPC客戶端發(fā)送一個請求之后,服務(wù)器端才能接收到迎吵,對于響應(yīng)也是一樣的(服務(wù)器先響應(yīng)躲撰,然后客戶端才能接收到這個響應(yīng))。這樣一來击费,服務(wù)器端的RPC就有一個時間戳的一個上限和下限拢蛋。
2.2 植入點(diǎn)
Dapper可以以對應(yīng)用開發(fā)者近乎零浸入的成本對分布式控制路徑進(jìn)行跟蹤,幾乎完全依賴于基于少量通用組件庫的改造蔫巩。如下:
- 當(dāng)一個線程在處理跟蹤控制路徑的過程中谆棱,Dapper把這次跟蹤的上下文的在ThreadLocal中進(jìn)行存儲。追蹤上下文是一個小而且容易復(fù)制的容器圆仔,其中承載了Scan的屬性比如跟蹤ID和span ID垃瞧。
- 當(dāng)計(jì)算過程是延遲調(diào)用的或是異步的,大多數(shù)Google開發(fā)者通過線程池或其他執(zhí)行器荧缘,使用一個通用的控制流庫來回調(diào)皆警。Dapper確保所有這樣的回調(diào)可以存儲這次跟蹤的上下文,而當(dāng)回調(diào)函數(shù)被觸發(fā)時截粗,這次跟蹤的上下文會與適當(dāng)?shù)木€程關(guān)聯(lián)上信姓。在這種方式下鸵隧,Dapper可以使用trace ID和span ID來輔助構(gòu)建異步調(diào)用的路徑。
- 幾乎所有的Google的進(jìn)程間通信是建立在一個用C++和Java開發(fā)的RPC框架上意推。我們把跟蹤植入該框架來定義RPC中所有的span豆瘫。span的ID和跟蹤的ID會從客戶端發(fā)送到服務(wù)端。像那樣的基于RPC的系統(tǒng)被廣泛使用在Google中菊值,這是一個重要的植入點(diǎn)外驱。當(dāng)那些非RPC通信框架發(fā)展成熟并找到了自己的用戶群之后,我們會計(jì)劃對RPC通信框架進(jìn)行植入腻窒。
Dapper的跟蹤數(shù)據(jù)是獨(dú)立于語言的昵宇,很多在生產(chǎn)環(huán)境中的跟蹤結(jié)合了用C++和Java寫的進(jìn)程的數(shù)據(jù)。在3.2節(jié)中儿子,我們討論應(yīng)用程序的透明度時我們會把這些理論的是如何實(shí)踐的進(jìn)行討論瓦哎。
2.3 Annotation
上述植入點(diǎn)足夠推導(dǎo)出復(fù)雜的分布式系統(tǒng)的跟蹤細(xì)節(jié),使得Dapper的核心功能在不改動Google應(yīng)用的情況下可用柔逼。然而蒋譬,Dapper還允許應(yīng)用程序開發(fā)人員在Dapper跟蹤的過程中添加額外的信息,以監(jiān)控更高級別的系統(tǒng)行為愉适,或幫助調(diào)試問題犯助。我們允許用戶通過一個簡單的API定義帶時間戳的Annotation,核心的示例代碼入圖4所示维咸。這些Annotation可以添加任意內(nèi)容剂买。為了保護(hù)Dapper的用戶意外的過分熱衷于日志的記錄,每一個跟蹤span有一個可配置的總Annotation量的上限癌蓖。但是雷恃,應(yīng)用程序級的Annotation是不能替代用于表示span結(jié)構(gòu)的信息和記錄著RPC相關(guān)的信息。
除了簡單的文本Annotation费坊,Dapper也支持的key-value映射的 Annotation,提供給開發(fā)人員更強(qiáng)的跟蹤能力旬痹,如持續(xù)的計(jì)數(shù)器附井,二進(jìn)制消息記錄和在一個進(jìn)程上跑著的任意的用戶數(shù)據(jù)。鍵值對的Annotation方式用來在分布式追蹤的上下文中定義某個特定應(yīng)用程序的相關(guān)類型两残。
2.4 采樣率
低損耗的是Dapper的一個關(guān)鍵的設(shè)計(jì)目標(biāo)永毅,因?yàn)槿绻@個工具價值未被證實(shí)但又對性能有影響的話,你可以理解服務(wù)運(yùn)營人員為什么不愿意部署它人弓。況且沼死,我們想讓開發(fā)人員使用Annotation的API,而不用擔(dān)心額外的開銷崔赌。我們還發(fā)現(xiàn)意蛀,某些類型的Web服務(wù)對植入帶來的性能損耗確實(shí)非常敏感耸别。因此,除了把Dapper的收集工作對基本組件的性能損耗限制的盡可能小之外县钥,我們還有進(jìn)一步控制損耗的辦法秀姐,那就是遇到大量請求時只記錄其中的一小部分。我們將在4.4節(jié)中討論跟蹤的采樣率方案的更多細(xì)節(jié)若贮。
圖5:Dapper收集管道的總覽
2.5 跟蹤的收集
Dapper的跟蹤記錄和收集管道的過程分為三個階段(參見圖5)省有。首先,span數(shù)據(jù)寫入(1)本地日志文件中谴麦。然后Dapper的守護(hù)進(jìn)程和收集組件把這些數(shù)據(jù)從生產(chǎn)環(huán)境的主機(jī)中拉出來(2)蠢沿,最終寫到(3)Dapper的Bigtable倉庫中。一次跟蹤被設(shè)計(jì)成Bigtable中的一行匾效,每一列相當(dāng)于一個span舷蟀。Bigtable的支持稀疏表格布局正適合這種情況,因?yàn)槊恳淮胃櫩梢杂腥我舛鄠€span弧轧。跟蹤數(shù)據(jù)收集(即從應(yīng)用中的二進(jìn)制數(shù)據(jù)傳輸?shù)街醒雮}庫所花費(fèi)的時間)的延遲中位數(shù)少于15秒雪侥。第98百分位的延遲(The 98th percentile latency)往往隨著時間的推移呈現(xiàn)雙峰型;大約75%的時間,第98百分位的延遲時間小于2分鐘精绎,但是另外大約25%的時間速缨,它可以增漲到幾個小時。
Dapper還提供了一個API來簡化訪問我們倉庫中的跟蹤數(shù)據(jù)代乃。 Google的開發(fā)人員用這個API旬牲,以構(gòu)建通用和特定應(yīng)用程序的分析工具。第5.1節(jié)包含更多如何使用它的信息搁吓。
2.5.1 帶外數(shù)據(jù)跟蹤收集
tip1:帶外數(shù)據(jù):傳輸層協(xié)議使用帶外數(shù)據(jù)(out-of-band原茅,OOB)來發(fā)送一些重要的數(shù)據(jù),如果通信一方有重要的數(shù)據(jù)需要通知對方時,協(xié)議能夠?qū)⑦@些數(shù)據(jù)快速地發(fā)送到對方。為了發(fā)送這些數(shù)據(jù)堕仔,協(xié)議一般不使用與普通數(shù)據(jù)相同的通道,而是使用另外的通道擂橘。
tip2:這里指的in-band策略是把跟蹤數(shù)據(jù)隨著調(diào)用鏈進(jìn)行傳送,out-of-band是通過其他的鏈路進(jìn)行跟蹤數(shù)據(jù)的收集摩骨,Dapper的寫日志然后進(jìn)行日志采集的方式就屬于out-of-band策略
Dapper系統(tǒng)請求樹樹自身進(jìn)行跟蹤記錄和收集帶外數(shù)據(jù)通贞。這樣做是為兩個不相關(guān)的原因。首先恼五,帶內(nèi)收集方案--這里跟蹤數(shù)據(jù)會以RPC響應(yīng)頭的形式被返回--會影響應(yīng)用程序網(wǎng)絡(luò)動態(tài)昌罩。在Google里的許多規(guī)模較大的系統(tǒng)中,一次跟蹤成千上萬的span并不少見灾馒。然而茎用,RPC回應(yīng)大小--甚至是接近大型分布式的跟蹤的根節(jié)點(diǎn)的這種情況下-- 仍然是比較小的:通常小于10K。在這種情況下,帶內(nèi)Dapper的跟蹤數(shù)據(jù)會讓應(yīng)用程序數(shù)據(jù)和傾向于使用后續(xù)分析結(jié)果的數(shù)據(jù)量相形見絀轨功。其次旭斥,帶內(nèi)收集方案假定所有的RPC是完美嵌套的。我們發(fā)現(xiàn)夯辖,在所有的后端的系統(tǒng)返回的最終結(jié)果之前琉预,有許多中間件會把結(jié)果返回給他們的調(diào)用者。帶內(nèi)收集系統(tǒng)是無法解釋這種非嵌套的分布式執(zhí)行模式的蒿褂。
2.6 安全和隱私考慮
記錄一定量的RPC有效負(fù)載信息將豐富Dapper的跟蹤能力圆米,因?yàn)榉治龉ぞ吣軌蛟谟行лd荷數(shù)據(jù)(方法傳遞的參數(shù))中找到相關(guān)的樣例,這些樣例可以解釋被監(jiān)控系統(tǒng)的為何表現(xiàn)異常啄栓。然而娄帖,有些情況下,有效載荷數(shù)據(jù)可能包含的一些不應(yīng)該透露給未經(jīng)授權(quán)用戶(包括正在debug的工程師)的內(nèi)部信息昙楚。
由于安全和隱私問題是不可忽略的近速,dapper中的雖然存儲RPC方法的名稱,但在這個時候不記錄任何有效載荷數(shù)據(jù)堪旧。相反削葱,應(yīng)用程序級別的Annotation提供了一個方便的可選機(jī)制:應(yīng)用程序開發(fā)人員可以在span中選擇關(guān)聯(lián)那些為以后分析提供價值的數(shù)據(jù)。
Dapper還提供了一些安全上的便利淳梦,是它的設(shè)計(jì)者事先沒有預(yù)料到的析砸。通過跟蹤公開的安全協(xié)議參數(shù),Dapper可以通過相應(yīng)級別的認(rèn)證或加密爆袍,來監(jiān)視應(yīng)用程序是否滿足安全策略首繁。例如。Dapper還可以提供信息陨囊,以基于策略的的隔離系統(tǒng)按預(yù)期執(zhí)行弦疮,例如支撐敏感數(shù)據(jù)的應(yīng)用程序不與未經(jīng)授權(quán)的系統(tǒng)組件進(jìn)行了交互。這樣的測算提供了比源碼審核更強(qiáng)大的保障蜘醋。
3. Dapper部署狀況
Dapper作為我們生產(chǎn)環(huán)境下的跟蹤系統(tǒng)已經(jīng)超過兩年胁塞。在本節(jié)中,我們會匯報系統(tǒng)狀態(tài)压语,把重點(diǎn)放在Dapper如何滿足了我們的目標(biāo)——無處不在的部署和應(yīng)用級的透明闲先。
3.1 Dapper運(yùn)行庫
也許Dapper代碼中中最關(guān)鍵的部分,就是對基礎(chǔ)RPC无蜂、線程控制和流程控制的組件庫的植入,其中包括span的創(chuàng)建蒙谓,采樣率的設(shè)置斥季,以及把日志寫入本地磁盤。除了做到輕量級,植入的代碼更需要穩(wěn)定和健壯酣倾,因?yàn)樗c海量的應(yīng)用對接舵揭,維護(hù)和bug修復(fù)變得困難。植入的核心代碼是由未超過1000行的C++和不超過800行Java代碼組成躁锡。為了支持鍵值對的Annotation還添加了額外的500行代碼午绳。
3.2 生產(chǎn)環(huán)境下的涵蓋面
Dapper的滲透可以總結(jié)為兩個方面:一方面是可以創(chuàng)建Dapper跟蹤的過程(與Dapper植入的組件庫相關(guān)),和生產(chǎn)環(huán)境下的服務(wù)器上在運(yùn)行Dapper跟蹤收集守護(hù)進(jìn)程映之。Dapper的守護(hù)進(jìn)程的分布相當(dāng)于我們服務(wù)器的簡單的拓?fù)鋱D拦焚,它存在于Google幾乎所有的服務(wù)器上。這很難確定精確的Dapper-ready進(jìn)程部分杠输,因?yàn)檫^程即便不產(chǎn)生跟蹤信息Dapper也是無從知曉的赎败。盡管如此,考慮到無處不在Dapper組件的植入庫蠢甲,我們估計(jì)幾乎每一個Google的生產(chǎn)進(jìn)程都是支持跟蹤的僵刮。
在某些情況下Dapper的是不能正確的跟蹤控制路徑的。這些通常源于使用非標(biāo)準(zhǔn)的控制流鹦牛,或是Dapper的錯誤的把路徑關(guān)聯(lián)歸到不相關(guān)的事件上搞糕。Dapper提供了一個簡單的庫來幫助開發(fā)者手動控制跟蹤傳播作為一種變通方法。目前有40個C++應(yīng)用程序和33個Java應(yīng)用程序需要一些手動控制的追蹤傳播曼追,不過這只是上千個的跟蹤中的一小部分窍仰。也有非常小的一部分程序使用的非組件性質(zhì)的通信庫(比如原生的TCP Socket或SOAP RPC),因此不能直接支持Dapper的跟蹤拉鹃。但是這些應(yīng)用可以單獨(dú)接入到Dapper中辈赋,如果需要的話。
考慮到生產(chǎn)環(huán)境的安全膏燕,Dapper的跟蹤也可以關(guān)閉钥屈。事實(shí)上,它在部署的早起就是默認(rèn)關(guān)閉的坝辫,直到我們對Dapper的穩(wěn)定性和低損耗有了足夠的信心之后才把它開啟篷就。Dapper的團(tuán)隊(duì)偶爾會執(zhí)行審查尋找跟蹤配置的變化,來看看那些服務(wù)關(guān)閉了Dapper的跟蹤近忙。但這種情況不多見竭业,而且通常是源于對監(jiān)控對性能消耗的擔(dān)憂。經(jīng)過了對實(shí)際性能消耗的進(jìn)一步調(diào)查和測量及舍,所有這些關(guān)閉Dapper跟蹤都已經(jīng)恢復(fù)開啟了未辆,不過這些已經(jīng)不重要了。
3.3 跟蹤Annotation的使用
程序員傾向于使用特定應(yīng)用程序的Annotation锯玛,無論是作為一種分布式調(diào)試日志文件咐柜,還是通過一些應(yīng)用程序特定的功能對跟蹤進(jìn)行分類兼蜈。例如,所有的Bigtable的請求會把被訪問的表名也記錄到Annotation中拙友。目前为狸,70%的Dapper span和90%的所有Dapper跟蹤都至少有一個特殊應(yīng)用的Annotation。
41個Java應(yīng)用和68個C++應(yīng)用中都添加自定義的Annotation為了更好地理解應(yīng)用程序中的span在他們的服務(wù)中的行為遗契。值得注意的是辐棒,迄今為止我們的Java開發(fā)者比C++開發(fā)者更多的在每一個跟蹤span上采用Annotation的API。這可能是因?yàn)槲覀兊腏ava應(yīng)用的作用域往往是更接近最終用戶(C++偏底層);這些類型的應(yīng)用程序經(jīng)常處理更廣泛的請求組合牍蜂,因此具有比較復(fù)雜的控制路徑漾根。
4. 處理跟蹤損耗
跟蹤系統(tǒng)的成本由兩部分組成:1.正在被監(jiān)控的系統(tǒng)在生成追蹤和收集追蹤數(shù)據(jù)的消耗導(dǎo)致系統(tǒng)性能下降,2捷兰。需要使用一部分資源來存儲和分析跟蹤數(shù)據(jù)立叛。雖然你可以說一個有價值的組件植入跟蹤帶來一部分性能損耗是值得的,我們相信如果基本損耗能達(dá)到可以忽略的程度贡茅,那么對跟蹤系統(tǒng)最初的推廣會有極大的幫助秘蛇。
在本節(jié)中,我們會展現(xiàn)一下三個方面:Dapper組件操作的消耗顶考,跟蹤收集的消耗赁还,以及Dapper對生產(chǎn)環(huán)境負(fù)載的影響。我們還介紹了Dapper可調(diào)節(jié)的采樣率機(jī)制如何幫我們處理低損耗和跟蹤代表性之間的平衡和取舍驹沿。
4.1 生成跟蹤的損耗
生成跟蹤的開銷是Dapper性能影響中最關(guān)鍵的部分艘策,因?yàn)槭占头治隹梢愿菀自诰o急情況下被關(guān)閉。Dapper運(yùn)行庫中最重要的跟蹤生成消耗在于創(chuàng)建和銷毀span和annotation渊季,并記錄到本地磁盤供后續(xù)的收集朋蔫。根span的創(chuàng)建和銷毀需要損耗平均204納秒的時間,而同樣的操作在其他span上需要消耗176納秒却汉。時間上的差別主要在于需要在跟span上給這次跟蹤分配一個全局唯一的ID驯妄。
如果一個span沒有被采樣的話,那么這個額外的span下創(chuàng)建annotation的成本幾乎可以忽略不計(jì),他由在Dapper運(yùn)行期對ThreadLocal查找操作構(gòu)成,這平均只消耗9納秒栽连。如果這個span被計(jì)入采樣的話,會用一個用字符串進(jìn)行標(biāo)注--在圖4中有展現(xiàn)--平均需要消耗40納秒微猖。這些數(shù)據(jù)都是在2.2GHz的x86服務(wù)器上采集的。
在Dapper運(yùn)行期寫入到本地磁盤是最昂貴的操作缘屹,但是他們的可見損耗大大減少凛剥,因?yàn)閷懭肴罩疚募筒僮飨鄬τ诒桓櫟膽?yīng)用系統(tǒng)來說都是異步的。不過轻姿,日志寫入的操作如果在大流量的情況犁珠,尤其是每一個請求都被跟蹤的情況下就會變得可以察覺到傅瞻。我們記錄了在4.3節(jié)展示了一次Web搜索的負(fù)載下的性能消耗。
4.2 跟蹤收集的消耗
讀出跟蹤數(shù)據(jù)也會對正在被監(jiān)控的負(fù)載產(chǎn)生干擾盲憎。表1展示的是最壞情況下,Dapper收集日志的守護(hù)進(jìn)程在高于實(shí)際情況的負(fù)載基準(zhǔn)下進(jìn)行測試時的cpu使用率胳挎。在生產(chǎn)環(huán)境下饼疙,跟蹤數(shù)據(jù)處理中,這個守護(hù)進(jìn)程從來沒有超過0.3%的單核cpu使用率慕爬,而且只有很少量的內(nèi)存使用(以及堆碎片的噪音)窑眯。我們還限制了Dapper守護(hù)進(jìn)程為內(nèi)核scheduler最低的優(yōu)先級,以防在一臺高負(fù)載的服務(wù)器上發(fā)生cpu競爭医窿。
Dapper也是一個帶寬資源的輕量級的消費(fèi)者磅甩,每一個span在我們的倉庫中傳輸只占用了平均426的byte。作為網(wǎng)絡(luò)行為中的極小部分姥卢,Dapper的數(shù)據(jù)收集在Google的生產(chǎn)環(huán)境中的只占用了0.01%的網(wǎng)絡(luò)資源卷要。
表1:Dapper守護(hù)進(jìn)程在負(fù)載測試時的CPU資源使用率
4.3 在生產(chǎn)環(huán)境下對負(fù)載的影響
每個請求都會利用到大量的服務(wù)器的高吞吐量的線上服務(wù),這是對有效跟蹤最主要的需求之一独榴;這種情況需要生成大量的跟蹤數(shù)據(jù)僧叉,并且他們對性能的影響是最敏感的。在表2中我們用集群下的網(wǎng)絡(luò)搜索服務(wù)作為例子棺榔,我們通過調(diào)整采樣率瓶堕,來衡量Dapper在延遲和吞吐量方面對性能的影響。
表2:網(wǎng)絡(luò)搜索集群中症歇,對不同采樣率對網(wǎng)絡(luò)延遲和吞吐的影響郎笆。延遲和吞吐的實(shí)驗(yàn)誤差分別是2.5%和0.15%。
我們看到宛蚓,雖然對吞吐量的影響不是很明顯,但為了避免明顯的延遲德频,跟蹤的采樣還是必要的苍息。然而,延遲和吞吐量的帶來的損失在把采樣率調(diào)整到小于1/16之后就全部在實(shí)驗(yàn)誤差范圍內(nèi)壹置。在實(shí)踐中竞思,我們發(fā)現(xiàn)即便采樣率調(diào)整到1/1024仍然是有足夠量的跟蹤數(shù)據(jù)的用來跟蹤大量的服務(wù)。保持Dapper的性能損耗基線在一個非常低的水平是很重要的钞护,因?yàn)樗鼮槟切?yīng)用提供了一個寬松的環(huán)境使用完整的Annotation API而無懼性能損失盖喷。使用較低的采樣率還有額外的好處,可以讓持久化到硬盤中的跟蹤數(shù)據(jù)在垃圾回收機(jī)制處理之前保留更長的時間难咕,這樣為Dapper的收集組件給了更多的靈活性课梳。
4.4 可變采樣
任何給定進(jìn)程的Dapper的消耗和每個進(jìn)程單位時間的跟蹤的采樣率成正比距辆。Dapper的第一個生產(chǎn)版本在Google內(nèi)部的所有進(jìn)程上使用統(tǒng)一的采樣率,為1/1024暮刃。這個簡單的方案是對我們的高吞吐量的線上服務(wù)來說是非常有用跨算,因?yàn)槟切└信d趣的事件(在大吞吐量的情況下)仍然很有可能經(jīng)常出現(xiàn),并且通常足以被捕捉到椭懊。
然而诸蚕,在較低的采樣率和較低的傳輸負(fù)載下可能會導(dǎo)致錯過重要事件,而想用較高的采樣率就需要能接受的性能損耗氧猬。對于這樣的系統(tǒng)的解決方案就是覆蓋默認(rèn)的采樣率背犯,這需要手動干預(yù)的,這種情況是我們試圖避免在dapper中出現(xiàn)的盅抚。
我們在部署可變采樣的過程中漠魏,參數(shù)化配置采樣率時,不是使用一個統(tǒng)一的采樣方案妄均,而是使用一個采樣期望率來標(biāo)識單位時間內(nèi)采樣的追蹤柱锹。這樣一來,低流量低負(fù)載自動提高采樣率丛晦,而在高流量高負(fù)載的情況下會降低采樣率奕纫,使損耗一直保持在控制之下。實(shí)際使用的采樣率會隨著跟蹤本身記錄下來烫沙,這有利于從Dapper的跟蹤數(shù)據(jù)中準(zhǔn)確的分析匹层。
4.5 應(yīng)對積極采樣(Coping with aggressive sampling)
新的Dapper用戶往往覺得低采樣率--在高吞吐量的服務(wù)下經(jīng)常低至0.01%--將會不利于他們的分析。我們在Google的經(jīng)驗(yàn)使我們相信锌蓄,對于高吞吐量服務(wù)升筏,積極采樣(aggressive sampling)并不妨礙最重要的分析。如果一個顯著的操作在系統(tǒng)中出現(xiàn)一次瘸爽,他就會出現(xiàn)上千次您访。低吞吐量的服務(wù)--也許是每秒請求幾十次,而不是幾十萬--可以負(fù)擔(dān)得起跟蹤每一個請求剪决,這是促使我們下決心使用自適應(yīng)采樣率的原因灵汪。
4.6 在收集過程中額外的采樣
上述采樣機(jī)制被設(shè)計(jì)為盡量減少與Dapper運(yùn)行庫協(xié)作的應(yīng)用程序中明顯的性能損耗。Dapper的團(tuán)隊(duì)還需要控制寫入中央資料庫的數(shù)據(jù)的總規(guī)模柑潦,因此為達(dá)到這個目的享言,我們結(jié)合了二級采樣。
目前我們的生產(chǎn)集群每天產(chǎn)生超過1TB的采樣跟蹤數(shù)據(jù)渗鬼。Dapper的用戶希望生產(chǎn)環(huán)境下的進(jìn)程的跟蹤數(shù)據(jù)從被記錄之后能保存至少兩周的時間览露。逐漸增長的追蹤數(shù)據(jù)的密度必須和Dapper中央倉庫所消耗的服務(wù)器及硬盤存儲進(jìn)行權(quán)衡。對請求的高采樣率還使得Dapper收集器接近寫入吞吐量的上限譬胎。
為了維持物質(zhì)資源的需求和漸增的Bigtable的吞吐之間的靈活性差牛,我們在收集系統(tǒng)自身上增加了額外的采樣率的支持命锄。我們充分利用所有span都來自一個特定的跟蹤并分享同一個跟蹤ID這個事實(shí),雖然這些span有可能橫跨了數(shù)千個主機(jī)偏化。對于在收集系統(tǒng)中的每一個span脐恩,我們用hash算法把跟蹤ID轉(zhuǎn)成一個標(biāo)量Z,這里0<=Z<=1侦讨。如果Z比我們收集系統(tǒng)中的系數(shù)低的話被盈,我們就保留這個span信息,并寫入到Bigtable中搭伤。反之,我們就拋棄他袜瞬。通過在采樣決策中的跟蹤ID怜俐,我們要么保存、要么拋棄整個跟蹤邓尤,而不是單獨(dú)處理跟蹤內(nèi)的span拍鲤。我們發(fā)現(xiàn),有了這個額外的配置參數(shù)使管理我們的收集管道變得簡單多了汞扎,因?yàn)槲覀兛梢院苋菀椎卦谂渲梦募姓{(diào)整我們的全局寫入率這個參數(shù)季稳。
如果整個跟蹤過程和收集系統(tǒng)只使用一個采樣率參數(shù)確實(shí)會簡單一些,但是這就不能應(yīng)對快速調(diào)整在所有部署的節(jié)點(diǎn)上的運(yùn)行期采樣率配置的這個要求澈魄。我們選擇了運(yùn)行期采樣率景鼠,這樣就可以優(yōu)雅的去掉我們無法寫入到倉庫中的多余數(shù)據(jù),我們還可以通過調(diào)節(jié)收集系統(tǒng)中的二級采樣率系數(shù)來調(diào)整這個運(yùn)行期采樣率痹扇。Dapper的管道維護(hù)變得更容易铛漓,因?yàn)槲覀兙涂梢酝ㄟ^修改我們的二級采樣率的配置,直接增加或減少我們的全局覆蓋率和寫入速度鲫构。
5. 通用的Dapper工具
幾年前浓恶,當(dāng)Dapper還只是個原型的時候,它只能在Dapper開發(fā)者耐心的支持下使用结笨。從那時起包晰,我們逐漸迭代的建立了收集組件,編程接口炕吸,和基于Web的交互式用戶界面伐憾,幫助Dapper的用戶獨(dú)立解決自己的問題。在本節(jié)中算途,我們會總結(jié)一下哪些的方法有用塞耕,哪些用處不大,我們還提供關(guān)于這些通用的分析工具的基本的使用信息嘴瓤。
5.1 Dapper Depot API
Dapper的“Depot API”或稱作DAPI扫外,提供在Dapper的區(qū)域倉庫中對分布式跟蹤數(shù)據(jù)一個直接訪問莉钙。DAPI和Dapper跟蹤倉庫被設(shè)計(jì)成串聯(lián)的,而且DAPI意味著對Dapper倉庫中的元數(shù)據(jù)暴露一個干凈和直觀的的接口筛谚。我們使用了以下推薦的三種方式去暴露這樣的接口:
- 通過跟蹤ID來訪問:DAPI可以通過他的全局唯一的跟蹤ID讀取任何一次跟蹤信息磁玉。
- 批量訪問:DAPI可以利用的MapReduce提供對上億條Dapper跟蹤數(shù)據(jù)的并行讀取。用戶重寫一個虛擬函數(shù)驾讲,它接受一個Dapper的跟蹤信息作為其唯一的參數(shù)蚊伞,該框架將在用戶指定的時間窗口中調(diào)用每一次收集到的跟蹤信息。
- 索引訪問:Dapper的倉庫支持一個符合我們通用調(diào)用模板的唯一索引吮铭。該索引根據(jù)通用請求跟蹤特性(commonly-requested trace features)進(jìn)行繪制來識別Dapper的跟蹤信息时迫。因?yàn)楦橧D是根據(jù)偽隨機(jī)的規(guī)則創(chuàng)建的,這是最好的辦法去訪問跟某個服務(wù)或主機(jī)相關(guān)的跟蹤數(shù)據(jù)谓晌。
所有這三種訪問模式把用戶指向不同的Dapper跟蹤記錄掠拳。正如第2.1節(jié)所述的,Dapper的由span組成的跟蹤數(shù)據(jù)是用樹形結(jié)構(gòu)建模的纸肉,因此溺欧,跟蹤數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu),也是一個簡單的由span組成遍歷樹柏肪。Span就相當(dāng)于RPC調(diào)用姐刁,在這種情況下,RPC的時間信息是可用的烦味。帶時間戳的特殊的應(yīng)用標(biāo)注也是可以通過這個span結(jié)構(gòu)來訪問的聂使。
選擇一個合適的自定義索引是DAPI設(shè)計(jì)中最具挑戰(zhàn)性的部分。壓縮存儲要求在跟蹤數(shù)據(jù)種建立一個索引的情況只比實(shí)際數(shù)據(jù)小26%谬俄,所以消耗是巨大的岩遗。最初,我們部署了兩個索引:第一個是主機(jī)索引凤瘦,另一個是服務(wù)名的索引宿礁。然而,我們并沒有找到主機(jī)索引和存儲成本之間的利害關(guān)系蔬芥。當(dāng)用戶對每一臺主機(jī)感興趣的時候梆靖,他們也會對特定的服務(wù)感興趣,所以我們最終選擇把兩者相結(jié)合笔诵,成為一個組合索引返吻,它允許以服務(wù)名稱,主機(jī)乎婿,和時間戳的順序進(jìn)行有效的查找测僵。
5.1.1 DAPI在Google內(nèi)部的使用
DAPI在谷歌的使用有三類:使利用DAPI的持續(xù)的線上Web應(yīng)用,維護(hù)良好的可以在控制臺上調(diào)用的基于DAPI的工具,可以被寫入捍靠,運(yùn)行沐旨、不過大部分已經(jīng)被忘記了的一次性分析工具。我們知道的有3個持久性的基于DAPI的應(yīng)用程序榨婆,8個額外的按需定制的基于DAPI分析工具磁携,以及使用DAPI框架構(gòu)建的約15~20一次性的分析工具。在這之后的工具就這是很難說明了良风,因?yàn)殚_發(fā)者可以構(gòu)建谊迄、運(yùn)行和丟棄這些項(xiàng)目,而不需要Dapper團(tuán)隊(duì)的技術(shù)支持烟央。
5.2 Dapper的用戶接口
絕大多數(shù)用戶使用發(fā)生在基于web的用戶交互接口统诺。篇幅有限,我們不能列出每一個特點(diǎn)疑俭,而只能把典型的用戶工作流在圖6中展示篙议。
圖6
- 用戶描述的他們關(guān)心的服務(wù)和時間,和其他任何他們可以用來區(qū)分跟蹤模板的信息(比如怠硼,span的名稱)。他們還可以指定與他們的搜索最相關(guān)的成本度量(cost metric)(比如移怯,服務(wù)響應(yīng)時間)香璃。
- 一個關(guān)于性能概要的大表格,對應(yīng)確定的服務(wù)關(guān)聯(lián)的所有分布式處理圖表舟误。用戶可以把這些執(zhí)行圖標(biāo)排序成他們想要的葡秒,并選擇一種直方圖去展現(xiàn)出更多的細(xì)節(jié)。
- 一旦某個單一的分布式執(zhí)行部分被選中后嵌溢,用戶能看到關(guān)于執(zhí)行部分的的圖形化描述眯牧。被選中的服務(wù)被高亮展示在該圖的中心。
- 在生成與步驟1中選中的成本度量(cost metric)維度相關(guān)的統(tǒng)計(jì)信息之后赖草,Dapper的用戶界面會提供了一個簡單的直方圖学少。在這個例子中,我們可以看到一個大致的所選中部分的分布式響應(yīng)時間分布圖秧骑。用戶還會看到一個關(guān)于具體的跟蹤信息的列表版确,展現(xiàn)跟蹤信息在直方圖中被劃分為的不同區(qū)域。在這個例子中乎折,用戶點(diǎn)擊列表種第二個跟蹤信息實(shí)例時绒疗,會在下方看到這個跟蹤信息的詳細(xì)視圖(步驟5)。
- 絕大多數(shù)Dapper的使用者最終的會檢查某個跟蹤的情況骂澄,希望能收集一些信息去了解系統(tǒng)行為的根源所在吓蘑。我們沒有足夠的空間來做跟蹤視圖的審查,但我們使用由一個全局時間軸(在上方可以看到)坟冲,并能夠展開和折疊樹形結(jié)構(gòu)的交互方式磨镶,這也很有特點(diǎn)溃蔫。分布式跟蹤樹的連續(xù)層用內(nèi)嵌的不同顏色的矩形表示。每一個RPC的span被從時間上分解為一個服務(wù)器進(jìn)程中的消耗(綠色部分)和在網(wǎng)絡(luò)上的消耗(藍(lán)色部分)棋嘲。用戶Annotation沒有顯示在這個截圖中酒唉,但他們可以選擇性的以span的形式包含在全局時間軸上。
為了讓用戶查詢實(shí)時數(shù)據(jù)沸移,Dapper的用戶界面能夠直接與Dapper每一臺生產(chǎn)環(huán)境下的服務(wù)器上的守護(hù)進(jìn)程進(jìn)行交互痪伦。在該模式下,不可能指望能看到上面所說的系統(tǒng)級的圖表展示雹锣,但仍然可以很容易基于性能和網(wǎng)絡(luò)特性選取一個特定的跟蹤网沾。在這種模式下,可在幾秒鐘內(nèi)查到實(shí)時的數(shù)據(jù)蕊爵。
根據(jù)我們的記錄辉哥,大約有200個不同的Google工程師在一天內(nèi)使用的Dapper的UI;在一周的過程中,大約有750-1000不同的用戶攒射。這些用戶數(shù)醋旦,在新功能的內(nèi)部通告上,是按月連續(xù)的会放。通常用戶會發(fā)送特定跟蹤的連接饲齐,這將不可避免地在查詢跟蹤情況時中產(chǎn)生很多一次性的,持續(xù)時間較短的交互咧最。
6. 經(jīng)驗(yàn)
Dapper在Google被廣泛應(yīng)用捂人,一部分直接通過Dapper的用戶界面,另一部分間接地通過對Dapper API的二次開發(fā)或者建立在基于api的應(yīng)用上矢沿。在本節(jié)中滥搭,我們并不打算羅列出每一種已知的Dapper使用方式,而是試圖覆蓋Dapper使用方式的“基本向量”捣鲸,并努力來說明什么樣的應(yīng)用是最成功的瑟匆。
6.1 在開發(fā)中使用Dapper
Google AdWords系統(tǒng)是圍繞一個大型的關(guān)鍵詞定位準(zhǔn)則和相關(guān)文字廣告的數(shù)據(jù)庫搭建的。當(dāng)新的關(guān)鍵字或廣告被插入或修改時栽惶,它們必須通過服務(wù)策略術(shù)語的檢查(如檢查不恰當(dāng)?shù)恼Z言脓诡,這個過程如果使用自動復(fù)查系統(tǒng)來做的話會更加有效)。
當(dāng)輪到從頭重新設(shè)計(jì)一個廣告審查服務(wù)時媒役,這個團(tuán)隊(duì)迭代的從第一個系統(tǒng)原型開始使用Dapper祝谚,并且,最終用Dapper一直維護(hù)著他們的系統(tǒng)酣衷。Dapper幫助他們從以下幾個方面改進(jìn)了他們的服務(wù):
- 性能:開發(fā)人員針對請求延遲的目標(biāo)進(jìn)行跟蹤交惯,并對容易優(yōu)化的地方進(jìn)行定位。Dapper也被用來確定在關(guān)鍵路徑上不必要的串行請求--通常來源于不是開發(fā)者自己開發(fā)的子系統(tǒng)--并促使團(tuán)隊(duì)持續(xù)修復(fù)他們。
- 正確性:廣告審查服務(wù)圍繞大型數(shù)據(jù)庫系統(tǒng)搭建席爽。系統(tǒng)同時具有只讀副本策略(數(shù)據(jù)訪問廉價)和讀寫的主策略(訪問代價高)意荤。Dapper被用來在很多種情況中確定,哪些查詢是無需通過主策略訪問而可以采用副本策略訪問只锻。Dapper現(xiàn)在可以負(fù)責(zé)監(jiān)控哪些主策略被直接訪問玖像,并對重要的系統(tǒng)常量進(jìn)行保障。
- 理解性:廣告審查查詢跨越了各種類型的系統(tǒng)齐饮,包括BigTable—之前提到的那個數(shù)據(jù)庫捐寥,多維索引服務(wù),以及其他各種C++和Java后端服務(wù)祖驱。Dapper的跟蹤用來評估總查詢成本握恳,促進(jìn)重新對業(yè)務(wù)的設(shè)計(jì),用以在他們的系統(tǒng)依賴上減少負(fù)載捺僻。
- 測試:新的代碼版本會經(jīng)過一個使用Dapper進(jìn)行跟蹤的QA過程乡洼,用來驗(yàn)證正確的系統(tǒng)行為和性能。在跑測試的過程中能發(fā)現(xiàn)很多問題匕坯,這些問題來自廣告審查系統(tǒng)自身的代碼或是他的依賴包束昵。
廣告審查團(tuán)隊(duì)廣泛使用了Dapper Annotation API。Guice[13]開源的AOP框架用來在重要的軟件組件上標(biāo)注“@Traced”葛峻。這些跟蹤信息可以進(jìn)一步被標(biāo)注锹雏,包含:重要子路徑的輸入輸出大小、基礎(chǔ)信息泞歉、其他調(diào)試信息,所有這些信息將會額外發(fā)送到日志文件中匿辩。
同時腰耙,我們也發(fā)現(xiàn)了一些廣告審查小組在使用方面的不足。比如:他們想根據(jù)他們所有跟蹤的Annotation信息铲球,在一個交互時間段內(nèi)進(jìn)行搜索挺庞,然而這就必須跑一個自定義的MapReduce或進(jìn)行每一個跟蹤的手動檢查。另外稼病,在Google還有一些其他的系統(tǒng)在也從通用調(diào)試日志中收集和集中信息选侨,把那些系統(tǒng)的海量數(shù)據(jù)和Dapper倉庫整合也是有價值的。
總的來說然走,即便如此援制,廣告審查團(tuán)隊(duì)仍然對Dapper的作用進(jìn)行了以下評估,通過使用Dapper的跟蹤平臺的數(shù)據(jù)分析芍瑞,他們的服務(wù)延遲性已經(jīng)優(yōu)化了兩個數(shù)量級晨仑。
6.1.1 與異常監(jiān)控的集成
Google維護(hù)了一個從運(yùn)行進(jìn)程中不斷收集并集中異常信息報告的服務(wù)。如果這些異常發(fā)生在Dapper跟蹤采樣的上下文中,那么相應(yīng)的跟蹤ID和span的ID也會作為元數(shù)據(jù)記錄在異常報告中洪己。異常監(jiān)測服務(wù)的前端會提供一個鏈接妥凳,從特定的異常信息的報告直接導(dǎo)向到他們各自的分布式跟蹤。廣告審查團(tuán)隊(duì)使用這個功能可以了解bug發(fā)生的更大范圍的上下文答捕。通過暴露基于簡單的唯一ID構(gòu)建的接口逝钥,Dapper平臺被集成到其他事件監(jiān)測系統(tǒng)會相對容易。
6.2 解決延遲的長尾效應(yīng)
考慮到移動部件的數(shù)量拱镐、代碼庫的規(guī)模艘款、部署的范圍,調(diào)試一個像全文搜索那樣服務(wù)(第1節(jié)里提到過)是非常具有挑戰(zhàn)性的痢站。在這節(jié)磷箕,我們描述了我們在減輕全文搜索的延遲分布的長尾效應(yīng)上做的各種努力。Dapper能夠驗(yàn)證端到端的延遲的假設(shè)阵难,更具體地說岳枷,Dapper能夠驗(yàn)證對于搜索請求的關(guān)鍵路徑。當(dāng)一個系統(tǒng)不僅涉及數(shù)個子系統(tǒng)呜叫,而是幾十個開發(fā)團(tuán)隊(duì)的涉及到的系統(tǒng)的情況下空繁,端到端性能較差的根本原因到底在哪,這個問題即使是我們最好的和最有經(jīng)驗(yàn)的工程師也無法正確回答朱庆。在這種情況下盛泡,Dapper可以提供急需的數(shù)據(jù),而且可以對許多重要的性能問題得出結(jié)論娱颊。
圖7:全局搜索的跟蹤片段傲诵,在不常遇到高網(wǎng)絡(luò)延遲的情況下,在沿著關(guān)鍵路徑的端到端的請求延遲箱硕,如圖所示拴竹。
在調(diào)試延遲長尾效應(yīng)的過程中,工程師可以建立一個小型庫剧罩,這個小型庫可以根據(jù)DAPI跟蹤對象來推斷關(guān)鍵路徑的層級結(jié)構(gòu)栓拜。這些關(guān)鍵路徑的結(jié)構(gòu)可以被用來診斷問題,并且為全文搜索提供可優(yōu)先處理的預(yù)期的性能改進(jìn)惠昔。Dapper的這項(xiàng)工作導(dǎo)致了下列發(fā)現(xiàn):
- 在關(guān)鍵路徑上的短暫的網(wǎng)絡(luò)性能退化不影響系統(tǒng)的吞吐量幕与,但它可能會對延遲異常值產(chǎn)生極大的影響。在圖7中可以看出镇防,大部分的全局搜索的緩慢的跟蹤都來源于關(guān)鍵路徑的網(wǎng)絡(luò)性能退化啦鸣。
- 許多問題和代價很高的查詢模式來源于一些意想不到的服務(wù)之間的交互。一旦發(fā)現(xiàn)来氧,往往容易糾正它們赏陵,但是Dapper出現(xiàn)之前想找出這些問題是相當(dāng)困難的饼齿。
- 通用的查詢從Dapper之外的安全日志倉庫中收取,并使用Dapper唯一的跟蹤ID蝙搔,與Dapper的倉庫做關(guān)聯(lián)缕溉。然后,該映射用來建立關(guān)于在全局搜索中的每一個獨(dú)立子系統(tǒng)都很慢的實(shí)例查詢的列表吃型。
6.3 推斷服務(wù)依賴
在任何給定的時間內(nèi)证鸥,Google內(nèi)部的一個典型的計(jì)算集群是一個匯集了成千上萬個邏輯“任務(wù)”的主機(jī),一套的處理器在執(zhí)行一個通用的方法勤晚。Google維護(hù)著許多這樣的集群枉层,當(dāng)然,事實(shí)上赐写,我們發(fā)現(xiàn)在一個集群上計(jì)算著的這些任務(wù)通常依賴于其他的集群上的任務(wù)鸟蜡。由于任務(wù)們之間的依賴是動態(tài)改變的,所以不可能僅從配置信息上推斷出所有這些服務(wù)之間的依賴關(guān)系挺邀。不過揉忘,除了其他方面的原因之外,在公司內(nèi)部的各個流程需要準(zhǔn)確的服務(wù)依賴關(guān)系信息端铛,以確定瓶頸所在泣矛,以及計(jì)劃服務(wù)的遷移。Google的可稱為“Service Dependencies”的項(xiàng)目是通過使用跟蹤Annotation和DAPI MapReduce接口來實(shí)現(xiàn)自動化確定服務(wù)依賴歸屬的禾蚕。
Dapper核心組件與Dapper跟蹤Annotation一并使用的情況下您朽,“Service Dependencies”項(xiàng)目能夠推算出任務(wù)各自之間的依賴,以及任務(wù)和其他軟件組件之間的依賴换淆。比如哗总,所有的BigTable的操作會加上與受影響的表名稱相關(guān)的標(biāo)記。運(yùn)用Dapper的平臺倍试,Service Dependencies團(tuán)隊(duì)就可以自動的推算出依賴于命名的不同資源的服務(wù)粒度讯屈。
6.4 不同服務(wù)的網(wǎng)絡(luò)使用率
Google投入了大量的人力和物力資源在他的網(wǎng)絡(luò)結(jié)構(gòu)上。從前網(wǎng)絡(luò)管理員可能只關(guān)注獨(dú)立的硬件信息易猫、常用工具及以及搭建出的各種全局網(wǎng)絡(luò)鳥瞰圖的dashboard上的信息耻煤。網(wǎng)絡(luò)管理員確實(shí)可以一覽整個網(wǎng)絡(luò)的健康狀況具壮,但是准颓,當(dāng)遇到問題時,他們很少有能夠準(zhǔn)確查找網(wǎng)絡(luò)負(fù)載的工具棺妓,用來定位應(yīng)用程序級別的罪魁禍?zhǔn)住?/p>
雖然Dapper不是設(shè)計(jì)用來做鏈路級的監(jiān)控的攘已,但是我們發(fā)現(xiàn),它是非常適合去做集群之間網(wǎng)絡(luò)活動性的應(yīng)用級任務(wù)的分析怜跑。Google能夠利用Dapper這個平臺样勃,建立一個不斷更新的控制臺吠勘,來顯示集群之間最活躍的網(wǎng)絡(luò)流量的應(yīng)用級的熱點(diǎn)。此外峡眶,使用Dapper我們能夠?yàn)榘嘿F的網(wǎng)絡(luò)請求提供指出的構(gòu)成原因的跟蹤剧防,而不是面對不同服務(wù)器之間的信息孤島而無所適從。建立一個基于Dapper API的dashboard總共沒花超過2周的時間辫樱。
6.5 分層和共享存儲系統(tǒng)
在Google的許多存儲系統(tǒng)是由多重獨(dú)立復(fù)雜層級的分布式基礎(chǔ)設(shè)備組成的峭拘。例如,Google的App Engine[5]就是搭建在一個可擴(kuò)展的實(shí)體存儲系統(tǒng)上的狮暑。該實(shí)體存儲系統(tǒng)在基于BigTable上公開某些RDBMS功能鸡挠。 BigTable的同時使用Chubby[7](分布式鎖系統(tǒng))及GFS。再者搬男,像BigTable這樣的系統(tǒng)簡化了部署拣展,并更好的利用了計(jì)算資源。
在這種分層的系統(tǒng)缔逛,并不總是很容易確定最終用戶資源的消費(fèi)模式备埃。例如,來自于一個給定的BigTable單元格的GFS大信息量主要來自于一個用戶或是由多個用戶產(chǎn)生译株,但是在GFS層面瓜喇,這兩種明顯的使用場景是很難界定。而且歉糜,如果缺乏一個像Dapper一樣的工具的情況下乘寒,對共享服務(wù)的競爭可能會同樣難于調(diào)試。
第5.2節(jié)中所示的Dapper的用戶界面可以聚合那些調(diào)用任意公共服務(wù)的多個客戶端的跟蹤的性能信息匪补。這就很容易讓提供這些服務(wù)的源從多個維度給他們的用戶排名伞辛。(例如,入站的網(wǎng)絡(luò)負(fù)載夯缺,出站的網(wǎng)絡(luò)負(fù)載蚤氏,或服務(wù)請求的總時間)
6.6 Dapper的救火能力(Firefighting)
對于一些“救火”任務(wù),Dapper可以處理其中的一部分踊兜「捅酰“救火”任務(wù)在這里是指一些有風(fēng)險很高的在分布式系統(tǒng)上的操作。通常情況下捏境,Dapper用戶當(dāng)正在進(jìn)行“救火”任務(wù)時需要使用新的數(shù)據(jù)于游,并且沒有時間寫新的DAPI代碼或等待周期性的報告運(yùn)行。
對于那些高延遲垫言,不贰剥,可能更糟糕的那些在正常負(fù)載下都會響應(yīng)超時的服務(wù),Dapper用戶界面通常會把這些延遲瓶頸的位置隔離出來筷频。通過與Dapper守護(hù)進(jìn)程的直接通信蚌成,那些特定的高延遲的跟蹤數(shù)據(jù)輕易的收集到前痘。當(dāng)出現(xiàn)災(zāi)難性故障時,通常是沒有必要去看統(tǒng)計(jì)數(shù)據(jù)以確定根本原因担忧,只查看示例跟蹤就足夠了(因?yàn)榍拔奶岬竭^從Dapper守護(hù)進(jìn)程中幾乎可以立即獲得跟蹤數(shù)據(jù))芹缔。
但是,如在6.5節(jié)中描述的共享的存儲服務(wù)瓶盛,要求當(dāng)用戶活動過程中突然中斷時能盡可能快的匯總信息乖菱。對于事件發(fā)生之后,共享服務(wù)仍然可以利用匯總的的Dapper數(shù)據(jù)蓬网,但是窒所,除非收集到的Dapper數(shù)據(jù)的批量分析能在問題出現(xiàn)10分鐘之內(nèi)完成,否則Dapper面對與共享存儲服務(wù)相關(guān)的“救火”任務(wù)就很難按預(yù)想的那般順利完成帆锋。
7. 其他收獲
雖然迄今為止吵取,我們在Dapper上的經(jīng)驗(yàn)已經(jīng)大致符合我們的預(yù)期,但是也出現(xiàn)了一些積極的方面是我們沒有充分預(yù)料到的锯厢。首先皮官,我們獲得了超出預(yù)期的Dapper使用用例的數(shù)量,對此我們可謂歡心鼓舞实辑。另外捺氢,在除了幾個的在第6節(jié)使用經(jīng)驗(yàn)中提到過的一些用例之外,還包括資源核算系統(tǒng)剪撬,對指定的通訊模式敏感的服務(wù)的檢查工具摄乒,以及一種對RPC壓縮策略的分析器,等等残黑。我們認(rèn)為這些意想不到的用例一定程度上是由于我們向開發(fā)者以一種簡單的編程接口的方式開放了跟蹤數(shù)據(jù)存儲的緣故馍佑,這使得我們能夠充分利用這個大的多的社區(qū)的創(chuàng)造力。除此之外梨水,Dapper對舊的負(fù)載的支持也比預(yù)期的要簡單拭荤,只需要在程序中引入一個用新版本的重新編譯過的公共組件庫(包含常規(guī)的線程使用,控制流和RPC框架)即可疫诽。
Dapper在Google內(nèi)部的廣泛使用還為我們在Dapper的局限性上提供了寶貴的反饋意見舅世。下面我們將介紹一些我們已知的最重要的Dapper的不足:
- 合并的影響:我們的模型隱含的前提是不同的子系統(tǒng)在處理的都是來自同一個被跟蹤的請求。在某些情況下奇徒,緩沖一部分請求雏亚,然后一次性操作一個請求集會更加有效。(比如逼龟,磁盤上的一次合并寫入操作)评凝。在這種情況下追葡,一個被跟蹤的請求可以看似是一個大型工作單元腺律。此外奕短,當(dāng)有多個追蹤請求被收集在一起,他們當(dāng)中只有一個會用來生成那個唯一的跟蹤ID匀钧,用來給其他span使用翎碑,所以就無法跟蹤下去了。我們正在考慮的解決方案之斯,希望在可以識別這種情況的前提下日杈,用盡可能少的記錄來解決這個問題。
- 跟蹤批處理負(fù)載:Dapper的設(shè)計(jì)佑刷,主要是針對在線服務(wù)系統(tǒng)莉擒,最初的目標(biāo)是了解一個用戶請求產(chǎn)生的系統(tǒng)行為。然而瘫絮,離線的密集型負(fù)載涨冀,例如符合MapReduce[10]模型的情況,也可以受益于性能挖潛麦萤。在這種情況下鹿鳖,我們需要把跟蹤ID與一些其他的有意義的工作單元做關(guān)聯(lián),諸如輸入數(shù)據(jù)中的鍵值(或鍵值的范圍)壮莹,或是一個MapReduce shard翅帜。
- 尋找根源:Dapper可以有效地確定系統(tǒng)中的哪一部分致使系統(tǒng)整個速度變慢,但并不總是能夠找出問題的根源。例如,一個請求很慢有可能不是因?yàn)樗约旱男袨楹嫌怯捎陉?duì)列中其他排在它前面的(queued ahead of)請求還沒處理完污尉。程序可以使用應(yīng)用級的annotation把隊(duì)列的大小或過載情況寫入跟蹤系統(tǒng)。此外延曙,如果這種情況屢見不鮮,那么在ProfileMe[11]中提到的成對的采樣技術(shù)可以解決這個問題。它由兩個時間重疊的采樣率組成腋妙,并觀察它們在整個系統(tǒng)中的相對延遲。
- 記錄內(nèi)核級的信息:一些內(nèi)核可見的事件的詳細(xì)信息有時對確定問題根源是很有用的讯榕。我們有一些工具骤素,能夠跟蹤或以其他方式描述內(nèi)核的執(zhí)行,但是愚屁,想用通用的或是不那么突兀的方式济竹,是很難把這些信息到捆綁到用戶級別的跟蹤上下文中。我們正在研究一種妥協(xié)的解決方案霎槐,我們在用戶層面上把一些內(nèi)核級的活動參數(shù)做快照送浊,然后綁定他們到一個活動的span上。
8. 相關(guān)產(chǎn)品
在分布式系統(tǒng)跟蹤領(lǐng)域丘跌,有一套完整的體系袭景,一部分系統(tǒng)主要關(guān)注定位到故障位置唁桩,其他的目標(biāo)是針對性能進(jìn)行優(yōu)化。 Dapper確實(shí)被用于發(fā)現(xiàn)系統(tǒng)問題耸棒,但它更通常用于探查性能不足荒澡,以及提高全面大規(guī)模的工作負(fù)載下的系統(tǒng)行為的理解。
與Dapper相關(guān)的黑盒監(jiān)控系統(tǒng)与殃,比如Project5[1]单山,WAP5[15]和Sherlock[2],可以說不依賴運(yùn)行庫的情況下幅疼,黑盒監(jiān)控系統(tǒng)能夠?qū)崿F(xiàn)更高的應(yīng)用級透明米奸。黑盒的缺點(diǎn)是一定程度上不夠精確,并可能在統(tǒng)計(jì)推斷關(guān)鍵路徑時帶來更大的系統(tǒng)損耗爽篷。
對于分布式系統(tǒng)監(jiān)控來說躏升,基于Annotation的中間件或應(yīng)用自身是一個可能是更受歡迎的解決辦法.拿Pip[14]和Webmon[16]系統(tǒng)舉例,他們更依賴于應(yīng)用級的Annotation狼忱,而X-Trace[12]膨疏,Pinpoint[9]和Magpie[3]大多集中在對庫和中間件的修改。Dapper更接近后者钻弄。像Pinpoint佃却,X-Trace,和早期版本的Magpie一樣窘俺,Dapper采用了全局標(biāo)識符把分布式系統(tǒng)中各部分相關(guān)的事件聯(lián)系在一起饲帅。和這些系統(tǒng)類似,Dapper嘗試避免使用應(yīng)用級Annotation瘤泪,而是把的植入隱藏在通用組件模塊內(nèi)灶泵。Magpie放棄使用全局ID,仍然試圖正確的完成請求的正確傳播对途,他通過采用應(yīng)用系統(tǒng)各自寫入的事件策略赦邻,最終也能精確描述不同事件之間關(guān)系。但是目前還不清楚Magpie在實(shí)際環(huán)境中實(shí)現(xiàn)透明性這些策略到底多么有效实檀。 X-Trace的核心Annotation比Dapper更有野心一些惶洲,因?yàn)閄-Trace系統(tǒng)對于跟蹤的收集,不僅在跟蹤節(jié)點(diǎn)層面上膳犹,而且在節(jié)點(diǎn)內(nèi)部不同的軟件層也會進(jìn)行跟蹤恬吕。而我們對于組件的低性能損耗的要求迫使我們不能采用X-Trace這樣的模型,而是朝著把一個請求連接起來完整跟蹤所能做到的最小代價而努力须床。而Dapper的跟蹤仍然可以從可選的應(yīng)用級Annotation中獲益铐料。
9. 總結(jié)
在本文中,我們介紹Dapper這個Google的生產(chǎn)環(huán)境下的分布式系統(tǒng)跟蹤平臺,并匯報了我們開發(fā)和使用它的相關(guān)經(jīng)驗(yàn)钠惩。 Dapper幾乎在部署在所有的Google系統(tǒng)上柒凉,并可以在不需要應(yīng)用級修改的情況下進(jìn)行跟蹤,而且沒有明顯的性能影響妻柒。Dapper對于開發(fā)人員和運(yùn)維團(tuán)隊(duì)帶來的好處,可以從我們主要的跟蹤用戶界面的廣泛使用上看出來耘分,另外我們還列舉了一些Dapper的使用用例來說明Dapper的作用举塔,這些用例有些甚至都沒有Dapper開發(fā)團(tuán)隊(duì)參與,而是被應(yīng)用的開發(fā)者開發(fā)出來的求泰。
據(jù)我們所知央渣,這是第一篇匯報生產(chǎn)環(huán)境下分布式系統(tǒng)跟蹤框架的論文。事實(shí)上渴频,我們的主要貢獻(xiàn)源于這個事實(shí):論文中回顧的這個系統(tǒng)已經(jīng)運(yùn)行兩年之久芽丹。我們發(fā)現(xiàn),結(jié)合對開發(fā)人員提供簡單API和對應(yīng)用系統(tǒng)完全透明來增強(qiáng)跟蹤的這個決定卜朗,是非常值得的拔第。
我們相信,Dapper比以前的基于Annotation的分布式跟蹤達(dá)到更高的應(yīng)用透明度场钉,這一點(diǎn)已經(jīng)通過只需要少量人工干預(yù)的工作量得以證明蚊俺。雖然一定程度上得益于我們的系統(tǒng)的同質(zhì)性,但它本身仍然是一個重大的挑戰(zhàn)逛万。最重要的是泳猬,我們的設(shè)計(jì)提出了一些實(shí)現(xiàn)應(yīng)用級透明性的充分條件,對此我們希望能夠?qū)Ωe雜環(huán)境下的解決方案的開發(fā)有所幫助宇植。
最后得封,通過開放Dapper跟蹤倉庫給內(nèi)部開發(fā)者,我們促使更多的基于跟蹤倉庫的分析工具的產(chǎn)生指郁,而僅僅由Dapper團(tuán)隊(duì)默默的在信息孤島中埋頭苦干的結(jié)果遠(yuǎn)達(dá)不到現(xiàn)在這么大的規(guī)模忙上,這個決定促使了設(shè)計(jì)和實(shí)施的展開箫柳。
Acknowledgments
We thank Mahesh Palekar, Cliff Biffle, Thomas Kotzmann, Kevin Gibbs, Yonatan Zunger, Michael Kleber, and Toby Smith for their experimental data and feedback about Dapper experiences. We also thank Silvius Rus for his assistance with load testing. Most importantly, though, we thank the outstanding team of engineers who have continued to develop and improve Dapper over the years; in order of appearance, Sharon Perl, Dick Sites, Rob von Behren, Tony DeWitt, Don Pazel, Ofer Zajicek, Anthony Zana, Hyang-Ah Kim, Joshua MacDonald, Dan Sturman, Glenn Willen, Alex Kehlenbeck, Brian McBarron, Michael Kleber, Chris Povirk, Bradley White, Toby Smith, Todd Derr, Michael De Rosa, and Athicha Muthitacharoen. They have all done a tremendous amount of work to make Dapper a day-to-day reality at Google.
References
[1] M. K. Aguilera, J. C. Mogul, J. L. Wiener, P. Reynolds, and A. Muthitacharoen. Performance Debugging for Distributed Systems of Black Boxes. In Proceedings of the 19th ACM Symposium on Operating Systems Principles, December 2003.
[2] P. Bahl, R. Chandra, A. Greenberg, S. Kandula, D. A. Maltz, and M. Zhang. Towards Highly Reliable Enterprise Network Services Via Inference of Multi-level Dependencies. In Proceedings of SIGCOMM, 2007.
[3] P. Barham, R. Isaacs, R. Mortier, and D. Narayanan. Magpie: online modelling and performance-aware systems. In Proceedings of USENIX HotOS IX, 2003.
[4] L. A. Barroso, J. Dean, and U. Holzle. Web Search for a Planet: The Google Cluster Architecture. IEEE Micro, 23(2):22–28, March/April 2003.
[5] T. O. G. Blog. Developers, start your engines. http://googleblog.blogspot.com/2008/04/developers-start-your-engines.html,2007.
[6] T. O. G. Blog. Universal search: The best answer is still the best answer. http://googleblog.blogspot.com/2007/05/universal-search-best-answer-is-still.html, 2007.
[7] M. Burrows. The Chubby lock service for loosely-coupled distributed systems. In Proceedings of the 7th USENIX Symposium on Operating Systems Design and Implementation, pages 335 – 350, 2006.
[8] F. Chang, J. Dean, S. Ghemawat, W. C. Hsieh, D. A. Wallach, M. Burrows, T. Chandra, A. Fikes, and R. E. Gruber. Bigtable: A Distributed Storage System for Structured Data. In Proceedings of the 7th USENIX Symposium on Operating Systems Design and Implementation (OSDI’06), November 2006.
[9] M. Y. Chen, E. Kiciman, E. Fratkin, A. fox, and E. Brewer. Pinpoint: Problem Determination in Large, Dynamic Internet Services. In Proceedings of ACM International Conference on Dependable Systems and Networks, 2002.
[10] J. Dean and S. Ghemawat. MapReduce: Simplified Data Processing on Large Clusters. In Proceedings of the 6th USENIX Symposium on Operating Systems Design and Implementation (OSDI’04), pages 137 – 150, December 2004.
[11] J. Dean, J. E. Hicks, C. A. Waldspurger, W. E. Weihl, and G. Chrysos. ProfileMe: Hardware Support for Instruction-Level Profiling on Out-of-Order Processors. In Proceedings of the IEEE/ACM International Symposium on Microarchitecture, 1997.
[12] R. Fonseca, G. Porter, R. H. Katz, S. Shenker, and I. Stoica. X-Trace: A Pervasive Network Tracing Framework. In Proceedings of USENIX NSDI, 2007.
[13] B. Lee and K. Bourrillion. The Guice Project Home Page. http://code.google.com/p/google-guice/, 2007.
[14] P. Reynolds, C. Killian, J. L. Wiener, J. C. Mogul, M. A. Shah, and A. Vahdat. Pip: Detecting the Unexpected in Distributed Systems. In Proceedings of USENIX NSDI, 2006.
[15] P. Reynolds, J. L. Wiener, J. C. Mogul, M. K. Aguilera, and A. Vahdat. WAP5: Black Box Performance Debugging for Wide-Area Systems. In Proceedings of the 15th International World Wide Web Conference, 2006.
[16] P. K. G. T. Gschwind, K. Eshghi and K. Wurster. WebMon: A Performance Profiler for Web Transactions. In E-Commerce Workshop, 2002.