onos是一个网络控制器。applications通过intent apis与onos进行交互。onos通过其南向适配层控制数据网络的转发(例如,openflow网络)。onos控制层与数据转发层之间是onos流 子系统,onos流子系统是将application intens转换为openflow流规则的重要组成部分。onos也是一个分布式系统,至关重要的是onos分布式架构使其性能随着集群数量增加而提 高。这份评估报告将onos看作一个整体的集群系统,计划从应用和操作环境两个角度去评估onos性能。
我们设计了一系列的实验,测试在各种应用和网络环境下onos的延迟和吞吐量。并通过分析结果,我们希望提供给网络运营商和应用开发商第一手资料去了解onos的性能。此外,实验的结果将有助于开发人员发现性能瓶颈并优化。
下图把onos分布式系统作为一个整体,介绍了关键的测试点。

onos分布式系统作为一个整体
图中包括如下性能测试点:
延迟:
a -交换机 连接/断开;
b -link启用/断开;
c -intent的批量安装/删除/路径切换;
吞吐量:
d -intent操作;
e -link事件(测试暂缓);
f –迸发流规则安装。
<a target="_blank"></a>
集群规模性能测试:
onos最突出的特点是其分布式架构。因此,onos性能测试的一个关键方面是比较和分析不同集群大小下onos的性能。所有的测试用例将以onos集群节点数量为1,3,5,7展开。
为了展示onos的本质特征,使测试不受测试仪器的瓶颈限制,我们采用了一些比较实用的工具进行实验。所有实验,除了与openflow协议交互的 交换机和端口及其它相关的,我们在onos的适配层部署了一套null providers与onos core进行交互。null providers担任着生成device,link,host以及大量的流规则的角色。通过使用null providers,我们可以避免并消除openflow适配和使用真实设备或者模拟的openflow设备所存在的潜在的性能瓶颈。
同时,我们也部署了一些负载生成器,这样可以使应用或者网络接口生成高强度的负载去触及onos的性能极限。
这些生成器包括:
1.intent performance 生成器“onos-app-intent-perf”,它与intent api交互,生成intent安装/删除操作,并根据onos可承受的最高速度自我调节生成的intent操作的负载。
2.流规则安装python脚本工具与onos flow subsystem交互去安装和删除subsystem中的流规则。
3.null linkprovider中的link 事件(闪烁)生成器,可以迅速提升发送速度到onos所能承受的极限并依此速率发送link up/down信息给onos core。
4.此外,我们在"topology-events-metrics" 和"intents-events-metrics" 应用中利用计数器去获取关键事件的时间戳与处理速率来方便那些时间及速度相关的测试。
我们将在后续的每个不同的测试过程中详细介绍这些生成器的配置。
a 7台 集群实验所需要的裸服务器。每个服务器的规格如下:
双intel xeon e5-2670v2处理器为2.5ghz - 10核心/20超线程内核
32gb1600mhz的ddr3 dram
1gbps的网络接口卡
ubuntu的14.04 os
集群之间使用ptpd同步
java hotspot(tm) (tm)64-bit server vm; version 1.8.0_31
java_opts=“${java_opts: - xms8g-xmx8g}”
onos-1.1.0 snapshot:
a31e13471ee626abce2bc43c413fab17586f4fc3
其他的具体与用例相关的onos参数将在具体的用例中进行说明
下面将具体介绍每个用例的细节配置,测试结果讨论及分析。
本实验是测试onos控制器在不同规模的集群环境中是如何响应拓扑事件的,测试拓扑事件的类型包括:
1)交换机连接或断开onos节点
2)在现有拓扑中链路的up和down
onos作为一个分布式的系统架构,多节点集群相比于独立节点可能会发生额外的同步拓扑事件的延迟。除了限制独立模式下的延迟时间,也要减少由于onos集群间由于ew-wise通信事件产生额外延时。
下面的图表说明了测试设置。一个交换机连接事件,是在一个“floating”(即没有交换机端口和链路)的ovs(of1.3)上通过“set- controller”命令设置ovs桥连接到onos1控制器。我们在of控制层面网络上使用tshark工具捕捉交换机上线的时间戳,onos device和graph使用“topology-event-metrics”应用记录时间戳。通过整理核对这些时间戳,我们得出从最初的事件触发到 onos在其拓扑中记录此事件的“端到端”的时序曲线。
交换机连接断开的延迟测试设置
所需得到的几个关键时间戳如下:
1.设备启动连接时间点t0,tcp syn/ ack;
2.openflow协议的交换:
t0 -> onos features reply;
ovs features reply -> onos role request; (onos 在这里处理选择主备控制器);
onos role request -> ovs role reply –of协议的初始交换完成。
3.onos core处理事件的过程:
of协议交换完成后触发device event;
本地节点的device event触发topology (graph) event。
同样的,测试交换机断开事件,我们使用ovs命令“del-controller”断开交换机与它连接的onos节点,捕获的时间戳如下:
1.ovs tcp syn/fin (t0);
2.ovs tcp fin;
3.onos device event;
4.onos graph event (t1).
交换机断开端到端的延迟为(t1 - t0)
当我们增大onos集群的大小,我们只连接和断开onos1上的交换机,并记录所有节点上的事件时间戳。集群的整体延迟是graph event报告中最迟的节点的延时时间。在我们的测试脚本中,我们一次测试运行多个迭代(例如,20次迭代)来收集统计结果。
测试一条链接up / down事件的延迟,除了我们用两个ovs交换机创建链路(我们使用mininet创建一个简单的两个交换机的线性拓扑结构)外,我们使用了与交换机连接 测试的类似方法。这两个交换机的主控权属于onos1。参照下面的图表。初步建立交换机-控制器连接后,设置一个交换机的接口up或down,我们通过端 口up或down事件来触发此测试。
一些关键的时间戳记录,如下所述:
1. 交换机端口up/down, t0;
2. ovs向onos1发送of portstatus update消息;
2a.在端口up的情况下,onos通过给每个ovs交换机发送链路发现消息来产生链路发现事件,同时onos收到其他交换机发送的openflow packetin消息。
3.onos core处理事件过程:
由of port status消息引起的device事件; (onos处理)
链路down时,link event由device event触发在本地节点产生,链路up时,link event是在链路发现packetin/out完成后产生的;(主要时间都是在ofp消息和onos处理上)
本地节点生成graph event。(onos处理)
类似于交换机的连接测试,我们认为在graph event中登记的集群中最迟的节点的延时时间为集群的延迟。
onos core处理事件过程
switch-add event:
交换机连接断开switch-add
link up/down event:
link up down event (up)
switch connect/disconnect event:
当一个交换机连接到onos时,明显的时延划分为以下几个部分:
1.链路发现的中时延最长的部分,是从最初的tcp连接到onos收到openflow features-replay消息。进一步分析数据包(在结果图中未示出),我们可以看到大部分时间是花在初始化控制器与交换机的openflow握手 阶段,onos等待ovs交换机响应它的features_request。而这个时延很大程度上不是由onos的处理引起的。
2.其次是在"ofp feature reply -> ofp role request"部分,这部分时延也会随着onos集群规模增加而增加,其主要花费在onos给新上线的交换机选择主控权上,这是由于单节点的onos只 需在本地处理,而多节点的集群环境中,集群节点之间的通信将会带来这个额外的延时
3.接着便是从openflow握手完成(ofp role reply)到onos登记一个device event的过程中消耗的时延。这部分的时延也受多节点onos配置影响,因为此事件需要onos将其写入device store。
4.最后一个延时比较长的是onos在本地处理来着device store的device event到向graph中注册拓扑信息事件的部分。
断开交换机时,随着onos集群规模的增大onos触发device事件的时延将略有增加。
总之,在openflow消息交换期间,ovs对feature-request的响应时延占据了交换机建立连接事件中,整体时延的绝大部分。接 着,onos花费约9毫秒处理主控权选。最后,onos在多节点集群环境下,由于各节点之间需要通信选举主节点,交换机上/下线时延将都会增加。
link up/down events:
此次测试,我们首先观察到的是,链路up事件比链路down事件花费更长的时间。通过时延分析,我们可以看到ovs的端口up事件触发了onos特 殊的行为链路发现,因此,绝大多数时延主要由处理链路发现事件引起。与单节点的onos相比这部分时延受集群节点的影响也比较大。另外,大多数onos core花费在向graph登记拓扑事件上的时延在个位数的ms级别。
在大部分的网络操作情况下,虽然整体拓扑事件的低延迟是可以被容忍的,但是交换机/链路断开事件却至关重要,因为它们被更多的看作是 applications的adverse events。当onos能更快速的检测到link down/up事件时,pplications也就能更快速的响应此adverse events,我们测试的此版本的onos具有在个位数ms级发现switch/link down事件的能力。
这组测试旨在得到onos当一个application安装,退出多种批大小的intents时的延迟特性(即响应时间)。
同时也得到onos路径切换事件的延时特性,即最短路径不可用,已安装的intent由于路径改变而需要重路由时所花费的时延。这是一个onos的 全方位系统测试,从onos的 nb api 经过intent 和flow subsystem 到onos的 sb api;采用null provider代替openflow adaptor进行测试。
这组测试结果将向网络运营商和应用开发者提供当operating intents时applications所期望的响应时间以及intents批的大小和集群数量的大小对时延的影响的第一手资料。
参考下图,我们用onos内置的app“push-test-intent”从onos1并通过onos1的intent api推进一个批的点对点intents。“push-test-intent”工具构造一系列的基于终点的,批大小和application id的intents。然后通过intent api 发送这些intents请求。当成功安装所有的intents时,返回延迟(响应时间)。随后退出这些intents并返回一个退出响应时间。当 intents请求被发送时,onos内部转换intents到流规则并写入相应的分布式存储来分发intents和流表。
参考下图,特别是我们的实验中,intents被构建在一个端到端的7个线性配置的交换机上,也就是说所有intents的入口是从s1的一个端口 和它们的出口是s7的一个端口。(我们使用在拓扑中额外的交换机s8进行intent re-route测试,这个测试后续描述)。我们通过null providers来构建交换机(null devices),拓扑(null links)和流量(null flows)。
当增大集群节点数量时,我们重新平均分配switch的主控权到各个集群节点。
使用指标来衡量onos性能
在这个实验中,我们将使用如下指标来衡量onos性能:
所有安装的intents是6hops点到点intents;
intent批的大小:1,10,100,1000,5000 intents;
测试次数:每个用例重复测试20次(4次预测试之后统计);
集群规模大小从1到3,5,7个节点。
同样参照上图,intent re-route延迟是一个测试onos在最短路径不可用的情况下,重新安装所有intents到新路径的速度。
测试顺序如下:
1.我们通过“push-test-intents -i”选项预安装不会自动退出的intents在线性最短路径上。然后我们通过修改null provider 链路定义文件模拟最短路径的故障。当新拓扑被onos发现时,我们通过检查onos 日志获取触发事件的初始时间戳t0;
2.由于 6-hop最短路径已不可用。onos切换到通过s8的7-hop备份路径。intent和流系统响应该事件,退出旧intents并删除旧流表(因为onos当前实现,所有intents和流已不可重新使用)。
3.接下来,onos重新编译intents和流,并安装。在验证所有intents确实被成功安装后,我们从“intents-events-metrics”捕获最后的intent安装时间戳(t1)。
4.我们把(t1-t0)作为onos 重路由intent(s)的延迟。
5.测试脚本迭代的几个参数:
a. intent初始安装的批大小:1,10,100,1000和5000 intents;
b.每个测试结果统计的是运行20次的结果平均值(4个预测试之后开始统计);
c. onos集群规模从1,到3,5,7节点。
c实验 延迟测试
我们从这个实验中得出结论:
1.正如预期,与单节点的onos相比,多个节点的onos集群由于ew-wise通信的需要延迟比较大
2.小批intents(1-100),不计批大小时,其主要的延时是一个固定的处理时延,因此当批大小增大,每一个intent安装时间减少,这就是时延大批的优点。
3.批大小非常大的情况下(如5000),随着集群大小增加(从3到7),延迟减少,其主要是由于每个节点处理较小数量的intents;
4.re-routeing延时比初始化安装和退出的延迟都小。
本项测试的目的是衡量onos处理intents operations 请求的能力。sdn控制器其中一个重要用例就是允许agile applications通过intents和流规则频繁更改网络配置。作为一款sdn控制器,onos应该具有高水平的intents安装和撤销处理能 力。onos使用的分布式架构, 随着集群规模的增加,理应能够维持较高的intent operation吞吐量。
下图描述了测试方法:
d实验 测试方法
本测试使用工具"intent-perf"来产生大量的intents operation请求。这个intent-perf工具可以在onos集群环境中的任何一个节点激活并使用。这个工具在使用过程中有个三个参数需要配置:
numkeys – 唯一的intents数量, 默认 40,000;
cycleperiod – intents安装和撤销的周期(时间间隔),默认 1000ms;
numneighbors –程序运行时,发送到各个集群节点的方式。0表示本节点;-1表示所有的集群节点
当intent-perf在onos节点运行时,以恒定的速率产生大量的、onos系统可以支持的intents安装撤销请求。在onos 日志中或 cli request中,会周期性的给出总体的intents处理吞吐量。持续运行一段时间后,我们可以观察到在集群的某个或某些节点总体吞吐量达到了饱和状 态。总体吞吐量需要包含intents安装撤销操作。统计所有运行intent-perf这个工具的onos节点上的吞吐量并求和,从而得到onos集群 的总体吞吐量。
intent-perf只产生"1-hop" 的intents,即这些intents被编译而成的流表的出口和入口都是在同一个交换机上,所以null providers模块不需要生成一个健全的拓扑结构。
特别是本实验中,我们使用两个相邻的场景。首先,设置numneighbors = 0,这种场景下,intent-perf只需要为本地的onos节点产生的intents安装和撤销请求,从而把intents的东西向接口通信降至最 低;其次,设置numneighbors 为-1后,intent-perf生成器产生的intents安装和撤销请求需要分发到所有的onos集群节点,这样会把东西向接口的通信量最大化。本次 测试持续进行了300秒的负载测试,统计集群的总体吞吐量。其他的参数使用默认值。
d实验吞吐量 结果
通过本次实验得出结论如下:
1.我们看到在onos的intents operations测试中一个明显趋势:总体吞吐量随着集群节点的增加而增加;
2.在流表子系统测试中集群的场景对吞吐量的影响微乎其微。
如前面所提到的,流子系统是onos的一个组成部分,其作用是将intents转换成可以安装到openflow交换机上的流规则。另外,应用程序 可以直接调用其北向api来注入流规则。使用北向api和intent框架是此次性能评估的关键。另外,此次实验不但给我们暴漏了端到端intent performance的性能缺陷,而且展示了当直接与流规则子系统交互时对应用的要求。
为了产生一批将被onos安装删除的流规则,我们使用脚本“flow-tester.py”。实际上这些脚本是onos工具执行的一部分。具体位置 在($onos_root/tools/test/bin)目录下。执行这个脚本将触发onos安装一套流规则到所控制的交换机设备,当所有流规则安装成 功之后将会返回一个时延时间。这个脚本也会根据接收的一系列的参数去决定这个测试怎么运行。这些参数如下:
每个交换机所安装的流规则的数量
邻居的数量-由于交换机的连接的控制器并非本地的onos节点,需要onos本地节点同步流规则到(除了运行脚本的onos本地节点之外的)onos节点
服务的数量-运行onos脚本的节点数量,即产生流规则的onos节点数量
下图简要的描述了测试的配置:
从下图可以看出,onos1,onos2是运行onos脚本产生流规则的两个服务器;当两个流生成服务器生成流给两个邻居,也就是所生成的流规则被传递到两个与之相邻的节点安装。(因为这个流规则属于被邻居节点控制器的交换机)。
f实验 简要的描述了测试的配置
我们使用了null provider作为流规则的消费者,绕过了使用openflow适配器和真实的或者模拟的交换机存在的潜在的性能限制。
null devices的数量保持常量35不变,然后被平均的分配到集群中的所有节点,例如,当运行的集群中有5个节点,每个节点将控制7个null devices;
集群一共安装122500条流规则-选择这个值其一是因为它足够大,其二,它很容易平均分配到测试中所使用的集群节点。这也是工具“flow-tester.py”计算每个交换机所安装的流规则数量的一个依据。
我们测试了2个关联场景:1)邻居数量为0,即所有的流规则都安装在产生流的服务器上场景;2)邻居数量为-1,即每个节点给自己以及集群中的其它节点产生流规则
测试集群规模1,3,5,7
响应时间为4次预测试之后20次的的测试时间统计整合得出
备注:版本发布的时候,onos核心仍然采用hazelcast作为存储协议来备份流规则。
实验表明,使用hazelcast协议作为备份,可能导致流规则安装速率频繁迸发增长。
在这一系列实验中,我们通过修改发布版本如下路径的代码关闭了流规则备份。($onos_root/core/store/dist/src /main/java/org/onosproject/store/flow/impl /distributedflowrulestore.java)
f实验并发吞吐量测试 结果
通过测试,可以得出如下系统性能测试结论:
1.根据测试数据显示,当配置n=0时,与配置n=“all”相比,系统有更高的吞吐量。也就是说当生成的流规则只安装给本地onos节点控制器的 设备时,流子系统的性能比安装给所有onos节点控制的设备时高。因为,onos节点之间的ew-wise通信存在开销/瓶颈。即,当配置n=“all” 时,性能低,符合预期值。
2.总的来说,这两种情况下通过增大集群节点数量测试,吞吐量随着集群数量的增加有明显的提高。但是这种提高是非线性的。例如,n=“all”与n=“0”相比,当节点间需要通信同步时,平稳增加的性能趋于平缓。
3.设置n=“all”与n=“0”获得的类似的性能数据说明,ew-wise通信没有成为onos intent operation性能的瓶颈。
原文发布时间:2015-05-04
本文来自云栖合作伙伴“linux中国”