确认带宽控制

本节使用nuttcp来确认吞吐量。


wget-t0-c http://www.lcp.nrl.navy.mil/nuttcp/nuttcp-5.5.5.tar.bz2

tar jxvf nuttcp-5.5.5.tar.bz2

cd nuttcp-5.5.5

gcc-O2-o nuttcp nuttcp-5.5.5.c


首先,在IP地址192.168.0.100(receiver)一方作为服务器启动nuttcp。


[receiver]#./nuttcp-S


发送(sender)方按照下列方式执行nuttcp。默认为发送数据10秒钟,计算吞吐量。


[sender]#./nuttcp 192.168.0.100

0.1685 MB/10.00 sec=0.1413 Mbps 0%TX 0%RX


结果为141kbps,非常缓慢。停止CBQ,再次计算,就会得到如下所示的接近以太网物理带宽上限的速度。


[sender]#/usr/share/doc/iproute-2.6.22/examples/cbq.init-v0.7.3 stop

[sender]#./nuttcp 192.168.0.100


1125.2779 MB/10.03 sec=941.4133 Mbps 5%TX 13%RX

使用数据包捕获进行确认时,每隔约200毫秒传输一次数据。这是因为TSO(TCP Segmentation Offload)与CBQ的组合使其成为了无意图的动作。

因此这时需要禁用TSO。使用ethtool命令来确认TSO的设置。


[sender]#ethtool-k eth3

Offload parameters for eth3:

Cannot get device udp large send offload settings:Operation not supported

rx-checksumming:on

tx-checksumming:on

scatter-gather:on

tcp segmentation offload:on TSO启用

udp fragmentation offload:off

generic segmentation offload:off


本次使用的NIC具有TSO功能,默认是启用的。因此需要使用ethtool工具将TSO功能禁用,再次使用nuttcp命令来计算吞吐量。


[sender]#ethtool-K eth3 tso off

[sender]#ethtool-k eth3

Offload parameters for eth3:

Cannot get device udp large send offload settings:Operation not supported

rx-checksumming:on

tx-checksumming:on

scatter-gather:on

tcp segmentation offload:off

udp fragmentation offload:off

generic segmentation offload:off

[sender]#./nuttcp 192.168.0.100

92.3214 MB/10.00 sec=77.4083 Mbps 0%TX 3%RX


结果为77Mbps,与刚才的数值相比,虽然性能得到了改善,但77Mbps与设置值100Mbps相比,吞吐量明显降低。

这是因为对于千兆以太网的NIC来说,TBF的缓冲区不够大。TBF(Token Bucket Filter)是Qdisc(queueing discipline)之一,用来把通信数据包放入队列,这里不作具体介绍。在10Mbps的情况下推荐将缓冲区大小设置为10kb/8。可以在CBQ配置文件的BUFFER项目中进行设置。本次为Gbit,因此设置为1000kb/8。


[sender]#cat/etc/sysconfg/cbq/cbq-2.eth3

DEVICE=eth3,1000Mbit,100Mbit

RATE=100Mbit

WEIGHT=10Mbit

RULE=192.168.0.100

BUFFER=1000kb/8

[sender]#/usr/share/doc/iproute-2.6.22/examples/cbq.init-v0.7.3 restart

[sender]#./nuttcp 192.168.0.100

116.0705 MB/10.01 sec=97.3100 Mbps 0%TX 3%RX


这样就可以使用CBQ进行正确的带宽控制。