丢包延时对带宽的影响


前几天线上发现一个丢包的场景,丢包率大概在0.3%左右,有同学认为这个丢包对网络没有影响,但是实际的测试结果,对带宽的影响已经很大了,所以这边测试了一下不同的丢包率跟延时对带宽的影响,测试的脚本如下:

#!/bin/env python
import sys
import math
import commands

loss = 0.01

for i in range(10):
    delay = 0.1
    for j in range(10):
        tc_add_command = "tc qdisc add dev bond0 root netem delay " + str(delay) + "ms loss " + str(loss)
        tc_del_command = "tc qdisc del dev bond0 root netem delay " + str(delay) + "ms loss " + str(loss)
        iperf_command = "iperf -c 10.0.3.47"
        status, tcout = commands.getstatusoutput(tc_add_command)
        status, iperfout = commands.getstatusoutput(iperf_command)
        status, tcout = commands.getstatusoutput(tc_del_command)
        iperf_last_line = iperfout.split("\n")[-1].split()
        bw = float(iperf_last_line[-2])
        if iperf_last_line[-1] == "Gbits/sec":
            bw = bw * 1000
        sys.stdout.write(str(loss) + ":" + str(delay) + ":" + str(bw) + "  ")
        sys.stdout.flush()
        delay = delay * 2
    print ""
    loss = loss * 2


注意其中需要一台服务器一个iperf server端,然后把脚本中的iperf命令的连接ip替换掉


测试使用了两台10G网卡的机器,网络带宽的上限为10G=10000Mbps,tcp拥塞算法是cubic


测试的结果数据如下:(行为延迟,单位ms,列为丢包率)

0.1 0.2 0.4 0.8 1.6 3.2 6.4 12.8 25.6 51.2
0.01 9000 8900 8560 7100 4880 2970 2310 1160 867 612
0.02 9080 8320 8330 6100 3170 1900 1010 1300 979 535
0.04 9010 8190 6170 4240 2810 1580 1070 849 485 507
0.08 8030 6990 4490 3220 1840 1130 462 546 361 135
0.16 4270 4150 2980 2000 1170 692 431 201 147 235
0.32 2820 2210 1820 1190 438 337 152 43.9 83 6.01
0.64 972 829 809 556 322 183 117 56.4 78.4 5.12
1.28 462 435 277 237 178 106 37.1 12 7.27 2.61
2.56 94.1 61.2 64.4 83.1 68.2 40.5 17.8 7.53 4.19 13.2
5.12 30.8 19.2 14.7 13.4 15.6 19.1 12.1 4.38 2.64 1.45


我们可以看下据此数据绘出的图表:


可以看出在最低延时跟最低丢包率的场景下,基本带宽是可以跑满的,也就是最上面的一个小平台,而后面随着丢包或延时的增加,带宽迅速下降,当在长途链路上的时候,情况显然会更加恶化,所以,丢包其实是一个很可怕的事情


之前的文章也介绍过,带宽其实跟窗口跟延时有关系,带宽=窗口/延时,压测中也发现,窗口跟丢包率有一定的关系,一定丢包率会让窗口稳定在一个值上,但是其中的关系,目前还不是很明白,留待下一篇文章解释吧

此条目发表在好玩的linux, 网络分类目录。将固定链接加入收藏夹。