使用Ryu时如何获取Mininet拓扑链路带宽与时延参数
Ryu控制器获取链路时延与带宽参数的实现方法
Ryu框架本身仅内置拓扑发现、流表下发的基础能力,链路时延、带宽指标需要结合内置模块加自定义测量逻辑获取,具体方式如下:
- 前置依赖配置
启动Ryu控制器时需要先加载两个官方内置模块,为链路指标采集提供拓扑和交换机状态查询能力:
上述两个模块会自动维护全网交换机、端口、直连链路的映射关系,同时开放REST接口供上层应用查询交换机、端口的基础状态。ryu-manager ryu.app.rest_topology ryu.app.ofctl_rest 你的自定义转发应用.py - 链路时延获取
直接复用Ryu拓扑发现自带的LLDP报文收发流程就能测时延,不用额外加探测协议:- 控制器给源端口发封装LLDP的Packet_out报文时,在报文里打上本地发送时间戳
- 链路对端端口收到LLDP报文后,会通过Packet_in把报文送回控制器,控制器记录收到报文的时间
- 两个时间的差值减去控制器到两台交换机的控制面往返耗时,算出来的就是这条链路的单向时延
测出来的时延直接存在全局链路状态字典里就行,写转发选路逻辑的时候直接查字典取值。不想自己写测量逻辑的话,直接加载配套的时延监测模块就行,模块会自动周期扫全链路时延,默认访问http://<控制器IP>:8080/delay就能拿到结构化的时延数据。
- 链路带宽获取
带宽分物理最大带宽和实时可用带宽两种,获取逻辑不一样:- 物理最大带宽:交换机上报端口状态的时候会自带端口支持的最大速率字段,要么监听
EventPortStatsReply事件异步拿端口参数,要么直接调ofctl模块的GET /stats/port/<交换机dpid>接口查,返回结果里的curr_speed就是对应端口的物理带宽,单位是kbps,对照拓扑里存的链路两端端口映射关系,就能拼出每条链路的最大带宽。 - 实时可用带宽:按1-5秒的固定周期拉取端口的收发字节统计值,用
(周期内字节差值 * 8) / 周期时长算出端口当前的已用带宽,拿物理最大带宽减已用带宽就是剩余可用带宽。端口统计值要么周期调ofctl的REST接口轮询,要么在自己的应用里定期给交换机发PortStatsRequest消息,异步收统计结果算就行,算完的数值同样存在全局链路状态字典里供转发逻辑调用。
- 物理最大带宽:交换机上报端口状态的时候会自带端口支持的最大速率字段,要么监听
注意:采集周期别设得比1秒短,不然高频的探测包、统计请求会把控制面占满,反而影响正常的流表下发和转发。
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

