关于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