问题背景:
程序使用winsocket TCP协议发送视频数据,一帧帧发送,之前测试一直没有问题。直到最近产品计划提升性能,将视频码率提升至4096kbps,本地32路远程16路同时获取,计算一下,网络需要8MB/s的速度。8MB/s = 64Mb/s, 那么一般的百兆网卡和网管肯定是不行了,需要搭建千兆传输网络。我们的网络环境为千兆网,网速实测到50-60MB/s。另外client接收到数据后直接返回,因此接收端不影响速度。
测试场景1:Server和Client本机测试。
通过性能监视器显示Server的确发送速度为8MB/s,内存稳定,符合预期。
测试场景2:Server和Client部署在网络中两台机器上。
通过性能监视器显示Server端发送速度为2MB/s,不符合预期,且由于发送速度过低造成了缓存增大进而引起内存上涨。
为什么本机和千兆网里的表现差别这么大呢?
排查与修改过程:
- 经过检查,发现发送逻辑在判断发生WSAEWOULDBLOCK(缓冲区溢出)错误后,数据保存然后返回,等到FD_WRITE事件再次触发,再次发送数据。这个处理过程本身并没有什么问题,问题是如果WSAEWOULDBLOCK发生次数过多就会引起发送效率降低,因此通过打log跟踪,发现的确