今天在测试DPDK性能的时候,发现发包工具的发包速率无法提升上去,千兆网卡设置速率70W qps,只能发出1W的速率。
抓包发现有大量的PAUSE流控帧。
一、PAUSE帧介绍
PAUSE帧是以太网在全双工模式下,MAC控制子层发出的流量控制帧。IEEE802.3协议为MAC控制子层提供了一个全双工流量控制结构框架,MAC控制子层是介于逻辑链路控制子层和介质访问控制子层间的可选功能。
交换控制电路要防止缓冲区溢出,可以利用MAC控制子层来控制以太网介质访问控制子层的操作。当已用缓冲区容量达到一个预先设定的阈值时,端口向全双工链路对方发出停止发送数据的请求,这个请求通过MAC控制子层产生的控制帧实现。
同样,端口可以接收由其他站点MAC控制子层产生的控制帧,控制帧夹在客户数据帧流中发送,接收方会根据帧的内容将控制帧分离出来,提交到MAC控制子层中的流量控制模块,流量控制模块解析控制帧的内容,提取帧中的控制参数,根据控制参数决定暂停发送的时间。
PAUSE帧中携带了时间参数。收到PAUSE帧的设备通过简单的解析,就可以确定停止发送的时长。对端设备出现拥塞的通常情况下,本端端口通常会连续收到多个PAUSE帧。只要对端设备的拥塞状态没有解除,相关的端口就会一直发送PAUSE.
二、PAUSE帧格式
PAUSE帧的帧长为64字节,结构非常简单。如下所示:
PAUSE帧的目的MAC地址是保留的MAC地址0180-C200-0001,源MAC则是发送PAUSE帧的设备的MAC地址。
Length/Type域是十六进制数0x8808.
MAC Control Opcode域的值是0x0001.其实,PAUSE帧是MAC控制帧的一种,其他类型的MAC控制帧使用不同的opcode值,此处不做详细说明。后面会谈到和PAUSE类似的PFC帧,PFC帧中该域的取值是0x0101.
MAC Control Parameters域需要根据MAC Control Opcode的类型来解析。对于PAUSE帧而言,该域是个2字节的无符号数,取值范围是0~65535.该域的时间单位是pause_quanta,每个pause_quanta相当于512比特时间。
PAUSE操作参数:为2字节的暂停时间参数。它是PAUSE发送方请求对方停止发送数据帧的时间长度,通常为0xFFFF,时间度量单位是以当前传输速率传输512位数据所用的时间,接收方实际暂停的时间为操作参数字段内容与以当前传输速率传输512位数据所用时间的乘积。
三、其他流控技术
在半双工模式下,主要采用Back-Pressure技术,也叫背压技术。端口向外发送一些信号来占用链路,对端也就没有机会发送报文。这样,可以间接达到和流控类似的效果。
四、以太网卡流控的开启/关闭
大多数的网卡,都有流控的开关命令。Linux系统中,可通过ethtool工具控制。
ethtool -A ethx autoneg off //自协商关闭
ethtool -A ethx tx off //发送模块关闭
ethtool -A ethx rx off //接收模块关闭