局域网1toN场景下网络传输的最优参数(UDP)
为了在局域网中实现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 |
从表中我们可以看出:
- 接收端能够达到的最大的接收速度为11M左右,最大速度在延迟5ms,数据包大小1280byte时获得;
- 能够达到11M以上接收速度的数据包的最大大小为1280byte,大于1280的数据包几乎没有上榜,并不是因为我没有测试(测试的最大包大小为10240),而是当数据包大于1280的时候会导致丢包率飙升,这反而使接收速度更慢了。
- delta_speed是发送速度和接收速度的差值,它表示发送速度和接收速度的匹配程度,当这个值太大的时候说明发送速度比接收速度快太多,这可能会导致大量的丢包或者数据大量堆积在缓存中;
- 在发送速度大于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分包对接收速度的影响非常大,因为它会放大丢包对速度的影响;