IOCP到底有多高效呢?<<Network
Programming
for
Microsoft
Windows
2nd>>有个技术统计,采用IOCP时:
Attempted/Connected:
50,000/49,997
Memory
Used
(KB):
242,272
Non-Paged
Pool:
148,192
CPU
Usage:
55–65%
Threads:
2
Throughput
(Send/Receive
Bytes
Per
Second):4,326,946/4,326,496
(The
server
was a
Pentium
4
1.7
GHz
Xeon
with
768
MB
memory)
对自己程序的测试还要注意一些windows特性:
(1)连接测试时,win2k缺省的出站连接的临时端口为1024-5000,要想使用更多的出站端口需要修改注册表,修改方式:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\项下建一个MaxUserPort(双字节值),例如:取值为10000时,大约有9000个端口可用。
(2)在intel x86上,非页面内存池仅占物理内存的1/8,windows将socket正是分配在这一区域上,根据“Busy-ness”原则,为每个socket分配的内存将随着socket的使用方式发生变化,但最少在2k以上,overlap也正是在申请非页面内存池,在NT下分块的大小是4k,接收发送共需要8k,这样一个socket大约需要10k的空间。服务器如果有1G内存,那么能支撑的socket数也在12,000左右。所以,所谓接受几万个连接完全不可能。真正这样的需求都是通过集群实现的。
(3)欲知socket的状态,一般要使用iphelper.h中GetTcpTable()实现,当然枚举属性为0x1a的handle也可以实现。