原文地址:http://blog.chinaunix.net/u2/61062/showart_2194214.html
今天上午测试了一下这段时间写的服务器的程序,主要测试的是服务器的最大的并发的连接数.
服务器端使用的是ACE的前摄式(Proactor)模式,该模式在Windows平台下也就是大名鼎鼎的IOCP模型。(内存4G、CPU4核)
模拟客户端测试程序的编写,采用多线程,一个线程对应一个连接,一个线程分配16K的线程空间,这样可以生成1万个线程(进程的地址空间2G / 16 * 1024)。客户端的工作:连接服务器,连接成功后,每隔1秒向服务器发送数据。
测试结果如下:
I/O模型 尝试数/连接成功数
IOCP 10000/10000
注意事项:
在模拟客户端程序对应的机器上,需要修改注册表:
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services下
如果不改注册表的话,相应的连接成功数<4000如下图:
![](http://blogimg.chinaunix.net/blog/upfile2/100311140703.png)
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)错误:因为队列满或者系统
缺乏足够的缓冲空间。
如下图所示:
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)错误:因为队列满或者系统
缺乏足够的缓冲空间。
如下图所示:
![](http://blogimg.chinaunix.net/blog/upfile2/100311140208.png)
测试效果截图:
模拟客户端![](http://blogimg.chinaunix.net/blog/upfile2/100311140935.png)
蓝色的框中表示因为线程生成太多导致的栈溢出!
10-3-16加上面这句话不对,原因是cSendData对应的栈空间空间分配的太小,只有20字节,超出了其范围, 导致的栈溢出。而不是 线程生成太多导致的
今天晚上再测试一下,网上说IOCP的并发的连接数可以到5W-6W,我改一下程序,把线程的栈空间改小一下,多生成些线程,将测试结果写入文件,让它跑一晚上吧,试试看,行不行。
Good Luck!!