我需要找到生成一百万个tcp连接的最佳方法。 (多是好,少是坏)。尽快地:D
我为什么需要这个?我正在测试nat,并且希望将其加载到尽可能多的条目中。
我当前的方法是在虚拟eth上生成一个子网,并从该虚拟eth到实际eth依次连接到lan到nat到主机。
subnetnicfake----routeToRealEth----RealEth---cable---lan----nat---host.
|<-------------on my machine-------------------->|
最佳答案
一百万个同时进行的TCP session 可能很困难:如果您依靠标准的connect(2)
套接字API创建函数,那么您将使用大量的物理内存:每个 session 都需要一个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]
中。)
那是另外8 GB的内存-四个用于接收缓冲区,四个用于发送缓冲区。
除此之外,系统还要求您的程序打开一百万个文件描述符。 (请参阅/proc/sys/fs/file-max
中的proc(5)
。)
所有这些内存都不可交换-内核固定其内存-因此,您实际上仅在内存至少为8 GB的64位计算机上解决此问题。大概10-12会更好。
Paketto Keiretsu tools采取的一种方法是打开一个原始连接,使用一个原始套接字执行所有TCP三向握手,并尝试计算所需的任何内容,而不是存储它们,以处理比平时大得多的数据。尝试为每个连接尽可能少地存储,并且不要使用幼稚的列表或结构树。
Paketto Keiretsu工具最近一次更新是在2003年左右,因此它们可能仍无法很好地扩展到百万级范围,但是如果这是我要解决的问题,那么它们绝对是我的出发点。
关于sockets - 生成百万TCP连接的最佳方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6590181/