網絡監控困難
- 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
map(R,[exprs],[fields]) //exprs表達式,寫在元組流上的可用字段,産生新的字段fields
result = map(pktstream, [tin/epoch _ size], [epoch])
- zip
zip(R,S) //将R和S合并,輸出既滿足R又滿足S的元組的流
result = zip(R1,R2)
- groupby
groupby(R,[fields],fun) //根據不同的fields分别執行聚合函數fun
def new _ flow([fcount], []):
if fcount == 0:
fcount = 1
emit()
result = groupby(pktstream, [5tuple], new_flow) //groupby的輸出是包含聚合字段(例如,5元組)和聚集值(例如count)的流。輸出流僅包含執行聚合函數期間遇到的emit()語句的元組
Marple 的硬體設計
- 一個可程式設計的鍵值存儲:其中鍵表示流的辨別,值表示由聚合函數計算的狀态
Language-Directed Hardware Design for Network Performance Monitoring——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