网络监控困难
- 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