日期:2014-05-16  浏览次数:20638 次

关于Socket编程的诡异问题,求解
是这样的,我在Linux下有个SOCKET服务器,想测试下性能,结果就在windows下用一个程序去测试。

测试流程如下
1. 客户端首先发送一个包给服务器端
2. 服务器接收到这个包,立即返回一个包给客户端
3. 客户端收到服务器返回的包,再立即给服务器端发送一个

如此循环

。。。。。
也就是说是严格单程的 客户端发 -> 服务器收 -> 服务器发 -> 客户端收 ,同一时间客户端和服务器端要么发,要么收,


测试下来,10秒钟大概能发5000个包,没什么问题

但是诡异的是,现在我开始搞两组 包1 包2,在包内容里带上了1和2
包1的处理方式和之前不变,发出去,收到服务器回应后立即再发回去,如此循环

包2的处理是启动一个timer,20毫秒,人为的延时20毫秒发送,
客户端发 -> 服务器收 -> 服务器发 -> 客户端收延时20毫秒 ->客户端发

这样的话,10秒钟只能发大概1000个包左右了,性能急剧下降,但是按理说我现在是双线,就算包2完全帮不上忙也不应该影响包1,因为包1的处理方式跟之前5000个包是一样的。

然后我分析的问题会不是是socket的问题,因为第一种模式下 socket连接 同一时间只可能是 收包或者发包,但是第二种模式下,可能这条连接在收包1的时候,包2请求发送,这样同一时间既收又发,导致性能出问题。

补充:
1.我双开了两个测试程序,两个程序同时用第一种方式测试,两个都没有问题,都能达到5000的量,也没有太大的延时。
2.在用包1加包2混合的模式时,大部分的包延时都低于1毫秒,但是有些包居然延时有100多毫秒
3.服务器端用的epoll模型,客户端用了MFC的CAsyncSocket 和 flash的socket做测试,两者结论相同



求解,先谢谢各位了,有什么疑问可以问我,会一直在线等待解答!!

------解决方案--------------------
包的大小?抓包的情况截个图(延时100ms的)?难道是传说中的nagle算法...
------解决方案--------------------
关闭了NEGLE