确认带宽控制
本节使用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进行正确的带宽控制。