Ryu内置控制器性能测试模块
我们在使用控制器的时候,有时候会想知道Packet In的速率。借鉴于Ryu拓扑发现模块的设计思路,我们可以把测量Packet In速率也作为一个模块。测量Packet In速率算是测量控制器性能的一种方式,扩展一下,我们可以在这个模块里添加其他用于测量控制器性能的功能。这里我们参考全球SDN测试认证中心发布的白皮书[1],可以添加一些里面的功能。
模块设计思路
在ryu/ryu目录下创建packet_目录,里面包含如下核心文件:
dump.py作为应用文件,将packet_in.py里的PacketIn类实例化。
PacketIn类是核心,里面会主要实现一些测量的功能。
api.py提供一些函数给其他应用来调用,用来获取例如Packet In速率这样的信息。这些函数内部会发送对应的事件请求。这些事件在event.py里面定义。
下面来看一下这个模块里都需要什么样的功能以及如何实现
注册CLI参数
拓扑发现的模块有--observe-links这个CLI参数来控制,这个测量Packet控制器速率也可以CLI参数来控制。在packet_in.py中加入注册CLI参数的代码。
CONF = cfg.CONF
CONF.log_opt_values(LOG,20)
CONF.register_cli_opt(
cfg.BoolOpt('packet-in', default=False,
help='Calculate Packet In rate')
)
加上代码以后,我们需要让ryu-manager在运行的时候知道存在这么一个CLI参数。因此我们需要在ryu/ryu/cmd/manager.py里面import我们的模块。
from ryu.packet_in import packet_in
测量Packet In速率
在初始化PacketIn这个应用时候,我们定义了总Packet In数据包数量,各个交换机的发送的Packet In数据包数量以及Packet In速率。控制器应用在处理Packet In报文的时候会对这些变量进行累加。 我们需要额外启动一个线程来计算速率。
temp = 0
while self.is_active:
LOG.info("Total Packet-In number is : %d",self.pkin_total_num)
self.pkin_total_rate = (self.pkin_total_num - temp) / self.period
temp = self.pkin_total_num
LOG.info("Current Packet-In PPS is : %d",self.pkin_total_rate)
处理API调用
之前说到api.py里面的函数会发送对应的事件,例如EventRateRequest,这个是获取Packet In速率的事件,send_request是一个同步请求,用于将事件发到运行的Ryu应用。与之对应的是reply_to_request,这是用来响应这个请求的函数。
下一步,我们需要在PacketIn应用中处理这个请求,处理完成后发出响应。
@set_ev_cls(event.EventRateRequest)
def rate_request_handler(self, req):
rep = event.EventRateReply(req.src, self.pkin_total_rate)
self.reply_to_request(req, rep)
性能测试
- SDN控制器性能测试白皮书里面也列出了很多性能测试的方法,例如获取内存/CPU使用率,这个部分我已经加入了计算Packet In速率的线程中。
- 为交换机安装流表项的速率,响应Packet Out数据包的速率部分,目前我的策略是控制器收到Packet In之后,针对ARP报文以及TCP报文做单独处理,尽量增加流表匹配字段,由此多下发流表项。在下发流表项的同时发出Packet Out,每个独立的ARP请求,TCP Flow都会安装单独的流表项。当然按照白皮书的指引,这部分可以再做更精细的拆分。
- 有关拓扑发现和拓扑更新的时间,这些最好结合拓扑发现模块,可以在拓扑发现模块中添加相应的功能代码,实现时间计算。
- 路径生成的时间需要在数据平面的主机之间建立连通性,涉及到数据平面真实可达的流量传输,而前面的测试基本不需要流量可达。因此这需要我们对控制器添加代码来下发正确的流表项进行配合。
- 目前所有的的性能输出均为终端输出,将来可以考虑添加Web代码把结果用图表展示出来。
使用方式
模块代码已经上传到Github https://github.com/manml/Ryu/tree/master/packet_in
PacketIn完成之后是一个内置的模块,和拓扑发现性质类似,不会影响到我们正常编写并运行的Ryu应用。我们需要把这个模块放置在目录ryu/ryu/下。并且对这个模块的代码进行修改之后,都需要重新安装一下Ryu。
python3 setup.py install
之后创建拓扑,找一个Ryu应用运行,并加入--packet-in CLI参数,即可启用这个模块。
详细使用方式可以查看github上的README。
结果展示
[1] https://www.sdnctc.com/home/views/default/resource/pdf/Performance.pdf