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。

结果展示

output.png

[1] https://www.sdnctc.com/home/views/default/resource/pdf/Performance.pdf


发表评论

  • OωO
  • |´・ω・)ノ
  • ヾ(≧∇≦*)ゝ
  • (☆ω☆)
  • (╯‵□′)╯︵┴─┴
  •  ̄﹃ ̄
  • (/ω\)
  • ∠(ᐛ」∠)_
  • (๑•̀ㅁ•́ฅ)
  • →_→
  • ୧(๑•̀⌄•́๑)૭
  • ٩(ˊᗜˋ*)و
  • (ノ°ο°)ノ
  • (´இ皿இ`)
  • ⌇●﹏●⌇
  • (ฅ´ω`ฅ)
  • (╯°A°)╯︵○○○
  • φ( ̄∇ ̄o)
  • (งᵒ̌皿ᵒ̌)ง⁼³₌₃
  • (ó﹏ò。)
  • Σ(っ°Д°;)っ
  • ╮(╯▽╰)╭
  • o(*
  • >﹏<
  • (。•ˇ‸ˇ•。)
  • 泡泡
  • 颜文字

*