我需要找到一种生成百万tcp连接的最佳方法。 (越多越好,越少越好)。尽快机器:D
为什么我需要这个?我正在测试nat,我想用尽可能多的条目加载它。
我目前的方法是在虚拟eth上生成一个子网,并从该虚拟到实际eth连接到lan到nat到host。
subnetnicfake----routeToRealEth----RealEth---cable---lan----nat---host.
|<-------------on my machine-------------------->|
答案 0 :(得分:3)
一百万个并发TCP会话可能很困难:如果您依靠标准connect(2)
套接字API来创建函数,那么您将使用物理内存的 lot :每个会话将需要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千兆字节的内存 - 四个用于接收缓冲区,四个用于发送缓冲区。
除此之外,系统还需要您的程序打开一百万个文件描述符。 (请参阅/proc/sys/fs/file-max
中的proc(5)
。)
所有这些内存都不可交换 - 内核固定其内存 - 所以你真的只在具有至少8 GB内存的64位机器上解决这个问题。可能10-12会做得更好。
Paketto Keiretsu tools采取的一种方法是打开原始连接,使用单个原始套接字执行所有TCP三向握手,并尝试计算所需的任何内容,而不是存储它,以处理更多比平常更多的数据。尝试尽可能少地存储每个连接,不要使用天真列表或结构树。
Paketto Keiretsu工具最近更新于2003年左右,因此它们仍然可能无法很好地扩展到百万范围,但如果这是我要解决的问题,它们肯定是我的起点。
答案 1 :(得分:0)
您是否尝试过使用tcpreplay?您可以使用所需的流量准备或捕获一个或多个PCAP网络捕获文件,并让一个或多个tcpreplay实例重播它们以对防火墙/ NAT进行压力测试。
答案 2 :(得分:0)
搜索了很多天后,我发现了问题。显然这个问题经过深思熟虑,应该是,因为它非常基础。问题是,我不知道应该调用什么问题。在知识分子中,它显然被称为c10k问题。我想要的是c1m问题。然而,似乎已经做了一些努力来获得C500k。或并发500k连接。
http://www.kegel.com/c10k.html AND http://urbanairship.com/blog/2010/09/29/linux-kernel-tuning-for-c500k/
@deadalnix。
阅读以上链接,并启发自己。
答案 3 :(得分:-3)
只要您在TCP中有65536端口可用,除非您有大量服务器要连接,否则无法实现此目的。
那么,那么,最好的方法是什么?只需在服务器上打开尽可能多的连接,看看会发生什么。