用于高清视频传输的万兆网络的性能优化
2018-11-02武同
武 同
(作者单位:成都希格玛光电科技有限公司)
在四川省科研院所科技成果转化资金项目“面向虚拟现实应用的全景视频处理系统”(计划编号:2017YSZH0012)中,使用了万兆以太网络来传输图像采集终端的高清视频数据。在系统设计阶段,预先估算了网络的理论利用率:图像采集系统单台相机单元输出图像分辨率是2 560×2 048,输出帧率是30帧每秒,输出图像格式是RGB888,这样相机图像视频数据率则为2 560×2 048×30×3×8≈ 3.8 Gbps。由于万兆以太网的带宽为10G bps,理论上足够传输单台相机单元的视频数据。
但是,在系统实际调试阶段却发现默认配置下万兆以太网接口的吞吐率远达不到10 Gbps,特别在数据包长度较短的极端情况下,吞吐率甚至只有500 Mbps,甚至还达不到千兆以太网的1G bps理论带宽。如此低的吞吐率直接导致网络接口上图像数据包被大量丢弃,应用程序无法正常恢复相机图像,影响了项目进展。经过对网络适配器驱动部分参数以及应用程序套接字参数进行多次调整尝试,最终实现了图像数据的完整传输。现将调整优化项目整理成文,以便各位同行参考。
1 网络适配器驱动调整项
1.1 接收方调整(RSS)
RSS(Receive Side Scaling)是一种能够在多处理器系统下使接收报文在多个处理器之间高效分发的网络适配器驱动技术,如果计算机系统为多处理器或多核处理器,打开接收方调整可以使网络适配器把接收数据的处理分配至多个处理器或多个内核,提高了系统资源利用率的同时提高了网络吞吐率。打开RSS后,需要调整RSS队列的最大数目,使其不超过处理器数量或者处理器内核数量。需要注意的是4个或更多队列用于要求高传输速率的应用程序,如基于Web服务器的应用程序,此时处理器的资源占用可能较高。接收方调整设置,如图1所示。
图1 接收方调整设置图示
1.2 校验和分载传输
此功能允许网络适配器以硬件方式计算确认接收到的数据包上的校验和,并计算被传输的数据包上的校验和,这样操作系统就不需要再用软件方式检验和计算。校验和分载传输可以分别在IP、TCP以及UDP三个层面开启,启用此功能可能会提高相应数据包的传输性能并降低处理器的占用率。校验和分载传输设置,如图2所示。
图2 校验和分载传输设置图示
1.3 巨帧数据包
巨帧(Jumbo Frame),是指长度大于以太网标准最大长度1 514字节的数据包(帧),对于千兆及万兆以太网,采用巨型帧能够使数据传输效率提高50%~100%。在视频传输等大数据量高实时性的应用环境中,巨型帧更具有非同寻常的意义。在万兆以太网网络中,如采用帧长为标准1 514字节的数据包,那么每秒需要传输处理高达812 000个数据包,而如采用长度为9 014字节的巨帧数据包,每秒需要传输处理的数据包仅仅只有14 000个,由于网络中数据包的个数减少,计算机需要处理的包头额外开销也大大减少,这样在提高了网络吞吐率的同时降低了处理器占用率,减少了网络延迟。巨帧数据包设置,如图3所示。
图3 巨帧数据包设置图示
1.4 中断裁决率
一个数据包到达时,网络适配器会生成一个中断,允许驱动程序来处理信息包。链接速度越高,产生的中断越多,处理器的使用量也将增大。这会导致系统性能降低。由于启用中断裁决会使网络适配器能积累中断,并发送单个(而不是一系列的)中断,所以在某些网络环境下,不适宜的中断裁决率会导致网络延迟,甚至导致数据包丢包。中断裁决设置,如图4所示。
1.5 接收缓冲区
图4 中断裁决设置图示
网络适配器在接收到数据包后,需要把数据直接写入位于计算机内存的缓冲区池,其由一定数量的固定长度的缓冲区块组成,该选项即是设定为网络适配器需要使用的传输缓冲区数量。万兆以太网由于数据量大,如果缓冲区数量设置过小则会导致缓冲区溢出而丢包,增加此值能增强接收性能,但也消耗系统内存,应该根据实际网络环境设置此值,达到网络性能和内存消耗的平衡。接收缓冲区设置,如图5所示。
图5 接收缓冲区设置图示
1.6 流量控制
如果网络接收端传入数据包速率大于网络适配器可以处理的数据率,则接收端可能会过载,这时适配器会丢弃数据包直到超载消失。IEEE802.3x协议提供了一种流量控制机制克服了这个问题——PAUSE帧,当接收方发生过载的时候,网络适配器会生成PAUSE帧,强制发送端停止传输。在某些网络环境下,比如传输发送端不支持PAUSE帧,启用流量控制会带来其他问题。流量控制设置,如图6所示。
图6 流量控制设置图示
2 应用程序调整项
从一些技术资料来看,Windows系统是从VISTA开始,支持Socket收缓冲区大小的动态调整的,而从Windows7和Windows Server 2008开始,支持Socket发缓冲区大小的动态调整的。在一些特殊应用中,这种自动调整的缓冲区大小可能并不是最优选择,不能提供最大的网络吞吐率。这时候需要禁用操作系统的缓冲区自动调整功能,改而在程序Socket参数中通过SO_SNDBUF和SO_RCVBUF手动调整缓冲区大小,进而优化网络性能。
3 调优实例
下面针对本项目的计算机系统配置和网络应用情况,详细说明各参数的调整优化。
本项目计算机系统配置如下:
操作系统:Windows 10 专业版
处理器:Intel Xeon E5-2698 V4
内存:256 GB
(1)由于Xeon处理器有20个内核,所以开启了接收方调整RSS,并将队列设置为8个;
(2)本项目中传输视频的数据包采用了UDP协议,所以开启了网络适配器的IP和UDP校验和分载选项;
(3)为了减少数据包开销处理次数,减少处理延时,本项目视频数据包设定为8 000字节固定长度,所以开启了网络适配器巨帧支持选项,同时设置巨帧长度最大为9 014字节;
(4)由于计算机系统处理器性能强劲且数据包采用巨帧模式,所以关闭了网络适配器的中断裁决选项,以降低网络延迟;
(5)由于计算机系统内存容量较大,所以将网络适配器的接收缓冲区设置为4 096个;
(6)考虑到实际网络环境为点到点连接,发送发数据率小于接收方理论带宽,且发送方不支持流量控制,关闭了网络适配器的流量控制选项;
(7)将应用程序Socket的接收缓冲区大小设定为1 024×1 024×128=128 MB。
通过上面优化设置,最后测试下来万兆网口的数据吞吐率从默认设置的300 Mbps提高到了9 Gbps。虽然没有达到理论的10 Gbps,但是已完全满足了本项目中图像数据实时传输的要求,保证了项目的顺利完成。