網絡監控困難
- 1、僅僅通過去增加特定的監控功能到交換機是不能滿足運營商不斷變化的需求的。(交換機需要支持網絡性能問題的表達語言)
- 2、他們缺乏對網絡深處的性能問題進行本地化的可見性,間接推斷網絡問題的原因
- 3、當前的交換機監控并沒有提供相關的性能數據,沒辦法直觀的查看性能統計信息來診斷問題
操作員使用 Marple
Marple 的功能結構
數據包性能流作為基礎輸入流的一部分,我們稱之為pktstream。Marple為每個隊列中的每個分組提供一個元組,并且具有以下字段(switch, qid, hdrs, uid, tin, tout, qsize)。switch和qid表示數據包被觀察到的交換機和隊列,常規的數據包頭(以太網,IP,TCP等)在hdrs字段集合中可用,其中唯一確定一個數據包的uid,tin和tout表示數據包的入隊和出隊時間戳,qsize表示數據包入隊時的隊列深度。
pktstream中的元組按照包出隊時間(tout)的順序進行處理,如果丟包,tout和qsize是無窮大的。 對應于丟棄的分組的元組可以以任意順序處理。
- filter
construct:
filter(R, pred) //R是包含性能元數據(例如,pktstream)的一些流,并且過濾器謂詞pred可能涉及分組頭,性能元數據。filter的結果是另一個只包含滿足pred的元組的流。
example:
result = filter(pktstream, qid == Q and switch == S and tout - tin > 1ms)
- map
construct:
map(R,[exprs],[fields]) //exprs表達式,寫在元組流上的可用字段,產生新的字段fields
example:
result = map(pktstream, [tin/epoch _ size], [epoch])
- zip
construct:
zip(R,S) //將R和S合并,輸出既滿足R又滿足S的元組的流
example:
result = zip(R1,R2)
- groupby
construct:
groupby(R,[fields],fun) //根據不同的fields分別執行聚合函數fun
example:
def new _ flow([fcount], []):
if fcount == 0:
fcount = 1
emit()
result = groupby(pktstream, [5tuple], new_flow) //groupby的輸出是包含聚合字段(例如,5元組)和聚集值(例如count)的流。輸出流僅包含執行聚合函數期間遇到的emit()語句的元組
Marple 的硬件設計
- 一個可編程的鍵值存儲:其中鍵表示流的標識,值表示由聚合函數計算的狀態
線性可拓展聚合(TODO)
我們可以將任何聚合函數與S = A(p)·S + B(p)的狀態更新合并,其中S是狀態,A(p)和B(p)是最后k個數據包的函數。 我們稱這個條件為線性狀態條件,并且說A(p)和B(p)是有界包歷史的函數。
查詢編譯(TODO)
相關資料
paper:http://nms.lcs.mit.edu/papers/marple.pdf
marple官網:http://web.mit.edu/marple
視頻:https://www.youtube.com/watch?v=-mT4KXBFOfs&t=17s