问题描述
最近在做Windows上UDP服务端的性能测试,发现这样一个事情,如果模拟发包的程序源端口在不停的变化,那么接收端就会大量丢包(大概5k每秒的发包速度只能收到3k每秒),如果源端口不变化则不丢包。请问下各位高手,是不是由于源端口变化会新建socket,而Windows是对socket数量有什么限制么?怎么突破这个限制?谢谢!
解决方案
解决方案二:
补充下,在Linux上是没有这个问题的,同样的发包程序,同样的收包程序,收包程序非常简单,就是收到一个包记一个数,不做任何业务逻辑处理。代码如下:IPEndPointRemoteIpEndPoint=newIPEndPoint(IPAddress.Any,portNumber);recvClient=newUdpClient(portNumber);recvClient.Ttl=100;recvClient.Client.ReceiveBufferSize=1500*1024*1024;while(!isShouldReceiveStop){try{byte[]b=recvClient.Receive(refRemoteIpEndPoint);Interlocked.Increment(refCount);}catch(Exceptionex){Logger.Error(ex.Message);recvClient.Close();recvClient=null;}}
解决方案三:
只谈.net中的udp封装:udpClient是可以绑定本地端口的。如果不绑定,才会由系统去随机分配端口。而不绑定发送端口,其实对保证通讯性能是有好处的。你遇到的问题可能跟你的“极端”测试有关。udp本身是不可靠的,而你可能放大到一个单机客户端根本不可能达到的并发量去测试,那么这种不可靠性就真正爆发出来了。这种测试,反而不真实了。
解决方案四:
这么说吧,如果一个不可靠的通讯,在一个极端不真实的并发量下去测试,得到的结果是有序的,那么说明它性能极端低下,才可能不丢数据。
解决方案五:
udp接收这块要绑定端口,这个定下来就够了,发送方都往这个端口发,发送方的端口本来就是随机的,没必要指定,windows对发udp没有限制。tcp从xp版本以后没连接限制了。udp是无连接的,只管发。
解决方案六:
同样的发包程序,同样的收包程序是什么意思,操作系统都换了怎么还会一样?
解决方案七:
引用3楼sp1234的回复:
这么说吧,如果一个不可靠的通讯,在一个极端不真实的并发量下去测试,得到的结果是有序的,那么说明它性能极端低下,才可能不丢数据。
五千个包每秒的数据量非常小,就像您说的,不绑定发送端口才是真实情况,所以这种情况下如此小的数据量是不应该丢包的,而且同样在linux上是非常稳定的,所以我才觉得windows应该是有什么限制
解决方案八:
引用4楼sinodzh的回复:
udp接收这块要绑定端口,这个定下来就够了,发送方都往这个端口发,发送方的端口本来就是随机的,没必要指定,windows对发udp没有限制。tcp从xp版本以后没连接限制了。udp是无连接的,只管发。
是的,所以这种情况下出现丢包是不可接受的
解决方案九:
引用5楼shingoscar的回复:
同样的发包程序,同样的收包程序是什么意思,操作系统都换了怎么还会一样?
我的意思是同样的处理逻辑,我用go语言实现了一份,同样的代码,两个操作系统跑出来windows大量丢包,linux非常稳定
解决方案十:
windows非服务器系统有最大连接数,超过就拒绝连接。
解决方案十一:
引用9楼xomix的回复:
windows非服务器系统有最大连接数,超过就拒绝连接。
我是在WindowsServer2008上试的,而且是UDP,不是TCP
解决方案十二:
引用10楼ruiruirui971的回复:
Quote: 引用9楼xomix的回复:
windows非服务器系统有最大连接数,超过就拒绝连接。我是在WindowsServer2008上试的,而且是UDP,不是TCP
抓不到丢包的实际情况的时候,没法明白分析,有高级点的交换机或者网卡能抓包吗,抓全部数据包看看
解决方案十三:
引用8楼ruiruirui971的回复:
Quote: 引用5楼shingoscar的回复:
同样的发包程序,同样的收包程序是什么意思,操作系统都换了怎么还会一样?我的意思是同样的处理逻辑,我用go语言实现了一份,同样的代码,两个操作系统跑出来windows大量丢包,linux非常稳定
发送方的程序是一样的吗?另外不知道你有没有试过直接在交换机上抓包,看是否真丢了按微软的说法,原生的winsock只受到内存的限制
解决方案十四:
引用11楼xomix的回复:
Quote: 引用10楼ruiruirui971的回复:
Quote: 引用9楼xomix的回复:
windows非服务器系统有最大连接数,超过就拒绝连接。我是在WindowsServer2008上试的,而且是UDP,不是TCP
抓不到丢包的实际情况的时候,没法明白分析,有高级点的交换机或者网卡能抓包吗,抓全部数据包看看
感谢提供新的思路哈,确实没有在交换机上抓包。但是我发现一个事情,丢包的同时,一个CPU占用率非常高,看起来基本上可以确定是由于CPU处理不过来导致的丢包。但是还是没搞清楚为什么源端口变化,这么小的数据量能把CPU占满
解决方案十五:
引用12楼shingoscar的回复:
Quote: 引用8楼ruiruirui971的回复:
Quote: 引用5楼shingoscar的回复:
同样的发包程序,同样的收包程序是什么意思,操作系统都换了怎么还会一样?我的意思是同样的处理逻辑,我用go语言实现了一份,同样的代码,两个操作系统跑出来windows大量丢包,linux非常稳定
发送方的程序是一样的吗?另外不知道你有没有试过直接在交换机上抓包,看是否真丢了按微软的说法,原生的winsock只受到内存的限制
发送方是一个程序,没有变过。我发现丢包的同时,一个CPU占用率非常高,看起来基本上可以确定是由于CPU处理不过来导致的丢包。但是还是没搞清楚为什么源端口变化,这么小的数据量能把CPU占满