一百万个并发TCP会话可能是困难的:如果你依赖于标准connect(2)
套接字API来创建功能,您要使用的物理内存很多:每个环节都需要一个struct inet_sock
,其中包括struct sock
,其中包括struct sock_common
。
我很快就猜到大小:struct sock_common
需要大约58个字节。 struct sock
需要大约278个字节。 struct inet_sock
需要大约70个字节。
这是387兆字节的数据之前,你有收到和发送缓冲区。 (对于某些信息,请参阅tcp_mem
,tcp_rmem
,tcp_wmem
在tcp(7)
。)
如果你选择走这条路,我建议设定每个插槽的内存控制低,因为他们去。如果4096是您设置的最低值,我不会感到惊讶。 (SK_MEM_QUANTUM
是PAGE_SIZE
,存储到sysctl_tcp_rmem[0]
和sysctl_tcp_wmem[0]
。)
这就是内存另外八个千兆字节 - 四为接收发送缓冲区缓存,四。
这就是除了系统需要您的程序打开一百万个文件描述符。 (见/proc/sys/fs/file-max
在proc(5)
)
所有这些记忆是而非可交换 - 内核销内存 - 所以你真的只有64位计算机上处理这个问题,至少8千兆字节记忆。大概10-12会做得更好。由Paketto Keiretsu tools采取
一种方法是打开原始连接,执行所有使用单个原始套接字的TCP三次握手,并尝试计算什么是需要的,而不是储存,处理更大量的数据比平时。尝试尽可能少地存储每个连接,并且不要使用简单的列表或结构树。
的Paketto的Keiretsu工具上次在2003年左右更新,所以他们仍然可能无法扩展到上万元的好,但他们肯定是我的出发点,如果这是我的问题解决了。
百万*同时*连接? – thkala
您是否尝试过['iperf'](http://sourceforge.net/projects/iperf/)工具? –
我不知道iperf在这种情况下会有帮助吗? – nikhilelite