关于大数据量阻塞式发送卡住的解决方法

来源:互联网 发布:win8 java 编辑:程序博客网 时间:2024/06/05 09:34

最近做一个服务器间的通讯

通讯客户端使用阻塞方式发送数据,发送频率较低时,一切正常。

但是频率提高后就会导致send函数长时间保持阻塞状态。

接收端服务器采用epoll模型,接收缓冲区设成了0。

研究好了好几天没有答案,经过各种尝试之后发现,把接收缓冲区设成非零(我是取消了缓冲区大小设定,使用默认值)之后send函数不会再被阻塞。

原因推测

服务端接收到第一个数据后要对数据做处理,此时因为接收缓冲区为0,客户端发来的数据无法存储,因此客户端阻塞。

接收到的数据要压入逻辑层的消息队列,需要加锁处理,更加耗时。

再者客户端发来的数据包不应定是完整的,可能只有一部分,此时服务端收到数据不能处理,而服务器同时也要做消息发送操作。因此会出现服务器接收一条完整数据对应发送好几条数据出去。

虽然发送数据量较大,但是客户端卡住好几秒钟的状况却无法解释。

原创粉丝点击