网络socket sokcet并行连接最大连接数限制的问题
现在做模拟网络客户端和服务器端的时候遇到一个问题, 在window系统下测试sokcet并行最大连接数的问题,发现当socket连接数达到3700-4000的时候sokcet就connect不上了,打出错误链接 提示10055错误 ,是由于底层缓存不够导致 , 这个问题瓶颈在哪里一直没找到,请有相关网络方面经验的高手多多探讨, 现在已经测试过加大系统缓冲的做法, 效果不是很明显。
[解决办法]
ICOP
[解决办法]
应该减少系统缓冲,这个错误就是系统的未分页内存池不够了.......
http://www.acejoy.com/bbs/archiver/?tid-89.html
[解决办法]
socket连接数是有限制的,服务器再牛也没办法,所以就有了服务器的分布式架构,通过它来分压,多台服务器,要是你想要连接数量很大的话只能这样了.要不你就让长久不通信的断开,释放资源,或者采用UDP协议.
[解决办法]
IOCP是正解
你看下The WSAENOBUFS error problem
http://www.codeproject.com/KB/IP/iocp_server_client.aspx
[解决办法]
[解决办法]
IOCP在普通双核,1G内存下,我测试过2000个连接(简单业务流程,Echo服务器),此时CPU负载为1%,内存消耗大约为50M
[解决办法]
一个进程的socket连接数是有限滴
[解决办法]
[解决办法]
感觉你的代码设计存在问题
我的垃圾电脑 CII700 384M内存
执行DOS压力测试,能达到的连接数量都比你多
你不会是光连接,服务器端不accept?
[解决办法]
应该是缓存溢满了吧!
连接数太多了,很可能是内存分配问题
试着从这些方面解决吧
[解决办法]
使用IOCP吧。
可以参考以下:
http://blog.pfan.cn/xman/45130.html
http://blog.pfan.cn/xman/45129.html
[解决办法]
应该来说,windows server下开发的socket server,连接的并发数,可以达到6000应该没问题。一般连接不上,还在于accept之后,程序如何处理和接受。当然响应客户端连接请求和并发接受客户端的传输请求,承载能力不是一个概念。大量的连接请求要及时响应,然后传输分派到其他空闲的cluster server上。
你们的服务器3000多就不行了,可能性在于,你们在同一个服务器上同时处理大量并发连接,和并发传输。
最好的做法,就是使用小规模集群设计。一个服务器作为连接服务器,接受连接之后,响应客户端,通知客户端,并分配给这个链接一个空闲的接收服务进程,或者空闲的服务器,作为数据处理。
接收服务器只管响应连接和load balance的协调,这样的设计足以响应上万的请求。
你们的需求规模达到这个瓶颈,就必须考虑集群和load balance的问题
[解决办法]
IOCP
[解决办法]
用空连接或IO负载很低的连接来测试并发性能根本没有意义
微软自己都承认,使用Winsock的网络应用,有效并发大于250左右操作系统性能就会开始急剧下降
所以才搞出了IOCP机制
IOCP承载10000以上长连接并保持20000次IO/秒,一般没啥问题
[解决办法]
linux下有类似IOCP的机制:epoll
[解决办法]
用IOCP吧,我P4 1.7 512内存,两机进行测试的时候,服务端最大可以同时并发3W多的连接(客户端每秒发送数据一次)
我记得一开始的时候用的xp 测试的,最多也只是4K左右的连接,后面就再也连接不上了,后来换了server2003测试才得到3W左右的同时并发数。
[解决办法]
你的IOCP例程逻辑有点问题:
每个客户端连接进来,你都投递了个WSARecv
然后每次WSARecv完成后都继续投递WSARecv
假如你的客户端没有一直向服务端发送数据的话
IOCP队列中未决IO会越来越多
——这已经不是连接瓶颈的问题,而是内存页资源的问题了
[解决办法]
IOCP是不是windows自己封装的一个网络的API ?
如果要移植到linux上能用吗?linux上有自己的“IOCP”吗?
IOCP没有用过不是很理解 求教
epoll,是一种内核消息回调的IO模型
------解决方案--------------------
[解决办法]
你的服务端 监听端口是多少,改成5000以下的端口试试看,感觉这个问题不仅仅是代码上的问题
[解决办法]
修改一个注册表的值,重启后就能解决这种问题。
[解决办法]
修改(添加)注册表,并重新启动系统:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services 下面:
TcpNumConnections
Key: Tcpip\Parameters
取值类型:REG_DWORD - Number
取值范围:0 - 0xfffffe
缺省值:0xfffffe
描述:本参数限制可以同时打开的TCP连接的数量
MaxUserPort
key: Tcpip\Parameters
取值类型:REG_DWORD - Number
取值范围:5000-65534 (十进制)
缺省值:0x1388 (5000 十进制)
描述:控制一个应用程序可以打开的最多端口数量。通常,短命的端口在1024-5000之间分配。
当试图发起5000以上端口的连接,系统将出现WSAENOBUFS(10055)错误:因为队列满或者系统
缺乏足够的缓冲空间。
[解决办法]
lz不妨试试用多个客户机去连服务器,估计每个客户端机器都能建立3900多个链。
因为默认情况下,只会使用1024-5000之间的端口号,所以极限也不到4000个。