Sockets 增加CentOS上的最大出站连接数

Sockets 增加CentOS上的最大出站连接数,sockets,centos,Sockets,Centos,我从这篇文章中了解到:从一个具有多个IP的客户端可以建立超过64K的连接 现在我有一台AWS ec2机器,它有10个IP用于测试。/etc/sysctl.conf中的配置是 fs.nr_open = 2000000 fs.file-max = 2000000 而/etc/security/limits.d/def.conf中的配置是 * soft nofile 2000000 * hard nofile 2000000 我启动一个进程(用C编写)并从第

我从这篇文章中了解到:从一个具有多个IP的客户端可以建立超过64K的连接

现在我有一台AWS ec2机器,它有10个IP用于测试。/etc/sysctl.conf中的配置是

fs.nr_open = 2000000
fs.file-max = 2000000
而/etc/security/limits.d/def.conf中的配置是

*       soft    nofile  2000000
*       hard    nofile  2000000
我启动一个进程(用C编写)并从第一个IP地址创建60000个连接。一切正常。 然后,我启动了另一个进程,尝试从第二个IP地址创建60000个连接,但当连接数达到7500个(总数:67500)时,它会出错。错误消息是连接超时

问题似乎不是文件描述符的限制,因为我仍然可以在客户机中打开/读取/写入文件。但是任何与远程服务器的连接都会超时

问题不在服务器端,因为服务器可以接受来自不同客户机的更多连接


似乎有某种设置而不是打开的文件数量限制了传出连接的数量。有人能帮忙吗?

为了能够从您的客户机打开超过65536个TCP套接字连接,您必须使用更多的IP地址

然后,对于每个TCP套接字连接,您应该告诉内核使用哪个IP地址和哪个临时端口

因此,在TCP客户端创建套接字之后,在连接到远程地址之前,TCP客户端应该将客户端计算机上可用的一个本地IP地址显式绑定到套接字

MigratoryData基准测试工具是用Java编写的,因此我无法提供用于在客户端打开任意数量TCP连接的确切代码。但是,这里是一个用C++编写的快速例子。p> 假设您的TCP服务器侦听192.168.1.1:8800,并且假设192.168.1.10是客户端计算机的一个IP地址,那么您可以使用以下方法创建从本地IP地址192.168.1.10和临时本地端口(比如12345)到远程IP地址192.168.1.1和远程端口8800的套接字连接:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include<sys/socket.h> 
#include <arpa/inet.h>

int main(int argc, char *argv[])
{
    int n, sockfd;
    char buffer[1024];
    struct sockaddr_in localaddr, remoteaddr;


    sockfd = socket(AF_INET, SOCK_STREAM, 0);

    localaddr.sin_family = AF_INET;
    localaddr.sin_addr.s_addr = inet_addr("192.168.1.10");
    localaddr.sin_port = htons(12345); 
    bind(sockfd, (struct sockaddr *) &localaddr, sizeof(localaddr));

    remoteaddr.sin_family = AF_INET;
    remoteaddr.sin_addr.s_addr = inet_addr("192.168.1.1");
    remoteaddr.sin_port = htons(80);
    connect(sockfd, (struct sockaddr *) &remoteaddr, sizeof(remoteaddr));

    n = read(sockfd, buffer, 512);

    // ...

    close(sockfd);

    return 0;
}
#包括
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
int n,sockfd;
字符缓冲区[1024];
localaddr、remoteaddr中的结构sockaddr\u;
sockfd=套接字(AF_INET,SOCK_STREAM,0);
localaddr.sin_family=AF_INET;
localaddr.sin_addr.s_addr=inet_addr(“192.168.1.10”);
localaddr.sinu port=htons(12345);
绑定(sockfd,(struct sockaddr*)&localaddr,sizeof(localaddr));
remoteaddr.sin_family=AF_INET;
remoteaddr.sin_addr.s_addr=inet_addr(“192.168.1.1”);
remoteaddr.sinu端口=htons(80);
连接(sockfd,(struct sockaddr*)&remoteaddr,sizeof(remoteaddr));
n=读取(sockfd,缓冲区,512);
// ...
关闭(sockfd);
返回0;
}

这正是我所做的。因此,出站连接的总数是67500,而不仅仅是65535。我的问题是为什么连接数停止在67500个左右,而不是65535个。@avhacker在最近的一次C10M测试中,我们用MigratoryData Benchsub工具打开了250万个TCP传出连接,如下所示:使用RHEL 7;将TCP堆栈内存增加到3M页:
sysctl-w net.ipv4.TCP_mem=“764535 1019382 3058140”
;文件处理程序和端口:
echo 20000500>/proc/sys/fs/nr_open
sysctl-w fs.file max=20000500
<代码>ulimit-n 20000000
sysctl-w net.ipv4.ip_local_port_range=“500 65535”
;禁用防火墙(防火墙和iptables)。如果使用这些建议,您的客户端仍然无法工作,我建议您在AWS EC2之外进行测试,看看问题是否仍然存在。您使用的EC2实例类型是什么?我遇到了t2.micro、t2.small和t2.medium的问题,一旦建立了51300个传出TCP连接,我就无法再建立连接、ping或接收连接(本地主机除外)。问题不会发生在t2.large实例上,但我在t2.large上尝试的次数没有超过62000次;我会试试看。我怀疑AWS正在丢弃数据包,但我希望这只是一个配置问题。在t2.large实例上,我们观察到,在无法建立或接收新连接之前,能够建立82441个并发出站连接。