局域网1toN场景下网络传输的最优参数(UDP)

Published: by Creative Commons Licence

为了在局域网中实现1到60或者1到100台设备的文件最快传输速度,我们需要研究网络参数是如何影响文件传输速度的。为了得到这样的最优参数,我们在网络模拟环境中测得了这些测试数据。

测试环境参数如下:

  • 发送端数量:1
  • 接收端数量:100
  • 发送端网络:出站无限制,入站限制和接收端一致。
  • 接收端网络:出站无限制,入站带宽1mbit(125KiB),丢包5%,延迟40ms,抖动10ms(外加25%依赖,正态分布方式)。
  • docker版本: 18.06.1
  • 网络限速方式:docker桥接网络,tbf+netem调度方式
  • 数据传输协议:UDP单播
  • 系统:Linux Mint 19,内核4.18,64位
  • CPU:i7-7700,4核8线程
  • 测试时系统可用内存5G,系统平均负载1.5

因为我们有100台接收端,因此100个接收端能够达到的总最大接收速度是100*125KiB=12.5MiB,理论上这就是接收端的最大接收速度,我们期望有一组参数可以让接收端保持这样的最大接受速度。

我们控制2个变量发送延迟(纵轴)和数据包大小(横轴),将测试结果按照接收速度从大到小排序(每个数据都是由三组测试数据平均),前32名的结果如下:

count interval size loss send_speed recv_speed↓ delta_speed send_pps recv_pps
数量 延时ms byte % KiB KiB KiB pps pps
1000 5 1280 5 17787 11753 6034 14170 9372
1000 3 1280 4.98 27888 11748 16140 22259 9375
1000 4 1280 4.96 21886 11748 10138 17452 9373
1000 1 1280 4.93 72678 11744 60935 58092 9368
1000 6 1280 4.97 14797 11743 3054 11779 9356
1000 2 1280 4.93 39415 11736 27678 31481 9366
1000 0 1280 4.99 467522 11724 455799 373966 9342
1000 7 1280 5.08 13134 11705 1428 10468 9307
1000 0 1024 5.03 363358 11666 351693 363306 11608
1000 1 1024 5.01 58184 11648 46536 58134 11579
1000 3 1024 5.02 22955 11638 11317 22907 11578
1000 2 1024 4.98 31024 11630 19395 30973 11565
1000 4 1024 4.99 18541 11624 6918 18491 11572
1000 5 1024 5.02 15365 11622 3743 15307 11574
1000 0 768 5 243763 11487 232276 324967 15262
1000 1 768 5.01 43893 11466 32427 58476 15242
1000 2 768 4.96 24835 11460 13375 33065 15239
1000 3 768 5.03 17756 11447 6309 23623 15212
1000 4 768 4.98 13606 11444 2162 18088 15206
1000 0 512 5.04 136807 11173 125634 273560 22297
1000 2 512 5.04 17605 11091 6514 35159 22129
1000 1 512 4.99 31755 11022 20733 63461 21993
1000 3 512 5.03 12088 10991 1098 24127 21929
1000 6 1024 5.03 11718 10991 727 11670 10940
1000 8 1280 5.04 11556 10881 674 9206 8654
1000 7 1536 26.3 14799 10741 4058 9815 7110
1000 8 1536 24.95 12941 10731 2210 8571 7103
1000 5 768 5.03 11066 10336 730 14710 13734
1000 9 4352 68.27 30109 10289 19819 7037 2376
1000 0 256 4.97 61151 10255 50896 244556 40972
1000 1 256 4.98 16066 10105 5961 64216 40371
1000 9 4096 68.6 30254 9987 20267 7513 2447

从表中我们可以看出:

  1. 接收端能够达到的最大的接收速度为11M左右,最大速度在延迟5ms,数据包大小1280byte时获得;
  2. 能够达到11M以上接收速度的数据包的最大大小为1280byte,大于1280的数据包几乎没有上榜,并不是因为我没有测试(测试的最大包大小为10240),而是当数据包大于1280的时候会导致丢包率飙升,这反而使接收速度更慢了。
  3. delta_speed是发送速度和接收速度的差值,它表示发送速度和接收速度的匹配程度,当这个值太大的时候说明发送速度比接收速度快太多,这可能会导致大量的丢包或者数据大量堆积在缓存中;
  4. 在发送速度大于11M的情况下,delta_speed在延迟7ms,数据包大小为1280byte的时候取得最小值1428;

因此,在这个测试中每隔7ms发送一个数据大小为1280byte的数据包时,可以使接收速度接近最大值并且发送速度和接收速度差值较小。

1280byte的数据包大小和网络路径的最大MTU是相关的,由于UDP在以太网下的最大MTU为1472,因此我又测了一组数据包大小为1472的数据:

count interval size loss send_speed recv_speed delta_speed send_pps recv_pps
1000 0 1472 4.99 431343 11829 419514 300015 8188
1000 4 1472 5.01 25605 11807 13798 17762 8189
1000 2 1472 4.97 46041 11806 34235 31980 8183
1000 6 1472 5.03 16941 11802 5139 11729 8189
1000 5 1472 5.05 20256 11800 8456 14048 8184
1000 7 1472 5 15052 11795 3258 10425 8174
1000 3 1472 5.08 33246 11787 21459 23079 8172
1000 1 1472 4.97 85670 11776 73894 59547 8157
1000 5 1280 5 17787 11753 6034 14170 9372
1000 3 1280 4.98 27888 11748 16140 22259 9375
1000 4 1280 4.96 21886 11748 10138 17452 9373
1000 1 1280 4.93 72678 11744 60935 58092 9368
1000 6 1280 4.97 14797 11743 3054 11779 9356
1000 2 1280 4.93 39415 11736 27678 31481 9366
1000 8 1472 5.01 13134 11725 1410 9081 8114
1000 0 1280 4.99 467522 11724 455799 373966 9342
1000 7 1280 5.08 13134 11705 1428 10468 9307
1000 0 1024 5.03 363358 11666 351693 363306 11608
1000 1 1024 5.01 58184 11648 46536 58134 11579
1000 3 1024 5.02 22955 11638 11317 22907 11578

结果显示它所能达到的效果都要优于1280,这也是预料之中的。

因此,在实际中用UDP单播为了达到最大接收速度应该:

  • 使用路径最大MTU作为数据包大小;
  • 使发送速度尽可能和接收速度匹配,不对发送速度进行任何限制很可能不能达到最高的接收速度;

这个测试中并没有对发送速度做限制,在实际中发送带宽也是有限制的,1000块的路由器在较差的无线网络环境下的最高发送带宽也只能达到30mbit,可能更低,因此在不限制发送带宽的情况下,会造成非常高的丢包率,从而使实际情况更加偏离以上测试。

ps: 其实从这次的测试结果中还可以挖掘出很多其他的信息,比如:

  • 程序的最高send_pps值是在数据包1280byte的时候取得的,并不是包越小pps就会越大;
  • IP分包对接收速度的影响非常大,因为它会放大丢包对速度的影响;