Sockets 生成百万tcp连接的最佳方法

Sockets 生成百万tcp连接的最佳方法,sockets,tcp,connection,Sockets,Tcp,Connection,我需要找到一种生成一百万个tcp连接的最佳方法。(多好少坏)。尽可能快地机械地:D 为什么我需要这个?我正在测试一个nat,我想用尽可能多的条目加载它 我目前的方法是在虚拟eth上生成一个子网,并从该虚拟eth到实际eth再到lan再到nat再到主机串行连接 subnetnicfake----routeToRealEth----RealEth---cable---lan----nat---host. |<-------------on my machine--------------

我需要找到一种生成一百万个tcp连接的最佳方法。(多好少坏)。尽可能快地机械地:D

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

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

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

只要您在TCP中有65536端口可用,这是不可能实现的,除非您有大量服务器要连接


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

100万个并发TCP会话可能很困难:如果您依赖标准的
connect(2)
sockets API来创建函数,您将使用大量的物理内存:每个会话都需要一个
struct inet\u sock
,其中包括一个
struct sock
,其中包括一个
struct sock\u common

我很快就猜到了大小:
structsock\u common
大约需要58字节
struct sock
大约需要278字节
struct inet_sock
大约需要70个字节

在您拥有接收和发送缓冲区之前,这是387兆字节的数据。(有关某些信息,请参见
tcp(7)
中的
tcp\u mem
tcp\u rmem
。)

如果您选择这样做,我建议将每个插槽的内存控制设置为尽可能低。如果4096是你能设定的最低值,我不会感到惊讶。(
SK_MEM_QUANTUM
PAGE_SIZE
,存储在
sysctl_tcp_rmem[0]
sysctl_tcp_wmem[0]

这是另一个8GB的内存--四个用于接收缓冲区,四个用于发送缓冲区

此外,系统还要求您的程序打开一百万个文件描述符。(参见
proc(5)
中的
/proc/sys/fs/file max

所有这些内存都是不可交换的——内核固定了它的内存——因此,您实际上只是在一台至少有8GB内存的64位机器上处理这个问题。也许10-12个会更好

所采用的一种方法是打开一个原始连接,使用单个原始套接字执行所有TCP三方握手,并尝试计算所需的数据,而不是存储数据,以处理比平常多得多的数据量。尝试为每个连接存储尽可能少的内容,不要使用简单的列表或结构树


Paketto Keiretsu工具最近一次更新是在2003年左右,因此它们可能仍然不能很好地扩展到百万范围,但如果这是我要解决的问题,它们肯定会是我的起点。

您尝试过使用吗?您可以准备或捕获一个或多个具有所需流量的PCAP网络捕获文件,并让一个或多个tcpreplay实例重播这些文件,以对防火墙/NAT进行压力测试。

在搜索了很多天后,我发现了问题。显然,这个问题经过了深思熟虑,而且应该深思熟虑,因为它非常基本。问题是,我不知道这个问题应该叫什么。在知情人士中,这显然被称为c10k问题。我想要的是c1m问题。然而,似乎已经做了一些努力来获得C500k。或并发500k连接

@死亡尼克斯


阅读以上链接,并启发自己。

100万个同时连接?您尝试过该工具吗?我不知道iperf在这种情况下会有什么帮助?@Nikhillite您尝试过EchoServerTest吗?如果我没记错的话,我最多可以获得60万个。我有两台笔记本电脑来做这个。诀窍是减少TCP协议的缓冲区大小、cwnd大小和wscale等。这些端口是每个ip的。我是说我有一个假的子网。因此,每个IP的最大值为65536(尽管它受到文件描述符限制和其他参数的严重限制)。但我的重点是提高速度,我没有时间坐在那里一个半小时让这些连接正常工作。有人有提高速度的好主意吗?@deadalnix这是不对的。他不需要一大群服务器。每个客户端的出站连接数受限制,但每个服务器的入站连接数不受端口空间的限制。它们使用与正在侦听的端口相同的端口号。服务器将为每个连接创建一个套接字。所以,限制因素是文件描述符表的大小。别忘了,您有64*1024个源端口和64*1024个目标端口,总共64*64*1024*1024==两台主机之间可能存在的40亿个连接,每个主机只有一个IP地址。@deadalnix我想您对IP协议的工作原理没有基本的了解。65536的限制是针对1个Ip,我有这样1个Ip的子网。这意味着我可以生成65536*个连接到1个服务器IP:端口的IP。限制是文件描述符和其他参数,如临时端口范围等。毫无疑问,您甚至不知道服务器可以在nat后面。从上面的链接:«误解始于每个IP只有这么多临时端口的前提。事实上,限制是基于IP对的,或者说另一种方式,客户端和服务器IP在一起。一个客户端IP可以连接到服务器IP 64000次,另一个客户端IP也可以连接64000次。由于NAT,这里的情况就是这样。