生成百万tcp连接的最佳方式

时间:2011-07-05 23:56:21

标签: sockets tcp connection

我需要找到一种生成百万tcp连接的最佳方法。 (越多越好,越少越好)。尽快机器:D

为什么我需要这个?我正在测试nat,我想用尽可能多的条目加载它。

我目前的方法是在虚拟eth上生成一个子网,并从该虚拟到实际eth连接到lan到nat到host。

subnetnicfake----routeToRealEth----RealEth---cable---lan----nat---host.   
|<-------------on my machine-------------------->|

4 个答案:

答案 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_rmemtcp_wmemtcp(7)。)

如果您选择这条路线,我建议将每插槽内存控制设置为尽可能低。如果4096是您设置的最低值,我不会感到惊讶。 (SK_MEM_QUANTUMPAGE_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端口可用,除非您有大量服务器要连接,否则无法实现此目的。

那么,那么,最好的方法是什么?只需在服务器上打开尽可能多的连接,看看会发生什么。