
2006年5月7日
我这篇文章说一个Socket的小技巧,另外咨询一个问题
这些天重点攻打Socket
以前总觉得Socket编程应该比较容易,也做过简单的Socket程序。
但真正要应用时,发现有很大问题!
我用C#语言
我这个程序用到的Socket也不算多。大概50个Socket客户端连接到internet上不同服务器上,用的是TCP协议。数据传输内容是一些琐碎的包,总共用到网络带宽大概512bps。
问题产生在数据延迟上了,程序对数据包的延迟要求很高,要求延迟平稳不跳动。程序每发送一个请求后,到从服务器接受到的反馈数据时间差要求基本一致。此外,程序还不停接受从服务器发送来的一些信息。
当开启几个Socket的时候,效果非常好,实时性很高,延迟稳定
但开到40个Socket的时候(每个socket连接不同服务器),就完全不一样了。发送请求后,接收到服务器响应的数据包的时间差距很大。从100ms~10000ms不等。这对于我的程序完全是个灾难!!!
在查询很多资料后,终于知道微软有个nagle算法。为了有效利用带宽,nagle算法会使得Socket发送短数据包尽量合并发送,就产生一个延迟。
使用socket.SetSocketOption(SocketOptionLevel.TCP,SocketOptionName.NoDelay,1)可以关闭nagle算法。这样发出的数据包就立刻出发了!~~ :)
程序性能终于有所改善,但还是有问题
数据包延迟从原来的100ms~10000ms变为100ms~2000ms了。这个延迟对我仍然是灾难。而ping的时间是比较稳定的40~60ms
这个就是我要向大家咨询的问题了
我也做了个测试,几台电脑通过一个电脑共享Internet连接,然后在这几台电脑上分别运行我的程序。发现延迟与所有电脑总连接数没有关系,只与当前电脑上连接数量有关。当前电脑连接越多,延迟越不稳定!!~~~如果当前电脑只有一个连接,其他电脑不管开多少连接都不会影响到这台电脑上程序的稳定!!~~~
这是什么原因呢?应该如何解决呢?
谢谢大家
posted @ 2006-05-07 11:54 闪电猪 阅读(3663) 评论(13)
编辑
这些天终于搞定线程调度的问题
开始重点攻打Socket
C#操作Socket还是比较方便
但终于还是出了问题
我这个程序用到的Socket也不算多。大概50个Socket客户端连接到internet上不同服务器上,用的是TCP协议。数据传输内容是一些琐碎的包,用到网络带宽大概512bps
问题产生在数据延迟上了
当开启几个Socket的时候,效果非常好,实时性很高,延迟稳定
然而开到40个Socket的时候,从服务器返回的数据包延迟就不稳定了。多数稳定,但有20%左右的数据包会延迟500~1000ms。我的这个程序对实时性要求很高,这个延迟可以说是种灾难。
每个Socket都设置了NoDelay关闭了微软的
nagle每个Socket是不同的线程操作,在程序上不存在阻塞问题。
CPU占用很低,2%左右。也不是资源问题。
网络带宽没有问题,Ping的延迟也很稳定
请指点一下,到底哪里出了问题呢??
谢谢各位
posted @ 2006-05-07 10:25 闪电猪 阅读(256) 评论(2)
编辑