如何在Linux中创建大量(我指的是大量)套接字? 我尝试用不同的语言(C++,java,C++,PHP)创建一个简单的程序,连接到服务器,所有的行为都是相同的。所以我相信这个问题更多的是操作系统级别的问题
基本上,我希望程序通过TCP套接字连接到服务器,发送1个字节,然后关闭套接字。这需要每秒进行数千次,并持续一段时间。这是为了对服务器进行基准测试 到目前为止,在数千个客户端套接字之后,系统完全停止。它只能在冷却一分钟左右后开始创建套接字。我已确保在传输后关闭每个插座 现在,类似Apache这样的服务器已经很熟悉这种问题,建议实用程序(如ab/Sakee)使用keep-alive协议对Apache进行基准测试。也就是说,创建少量TCP连接,但出于基准测试目的通过它们发出多个请求。但是,在我们的情况下,这是不可能的,因为我们的专有服务器不提供HTTP服务,也不支持HTTP 1.1保持活动模式 那么如何才能做到这一点呢?我已经检查了以下限制如何在Linux中创建大量(我指的是大量)套接字? 我尝试用不同的语言(C++,java,C++,PHP)创建一个简单的程序,连接到服务器,所有的行为都是相同的。所以我相信这个问题更多的是操作系统级别的问题,linux,networking,sockets,tcp,Linux,Networking,Sockets,Tcp,基本上,我希望程序通过TCP套接字连接到服务器,发送1个字节,然后关闭套接字。这需要每秒进行数千次,并持续一段时间。这是为了对服务器进行基准测试 到目前为止,在数千个客户端套接字之后,系统完全停止。它只能在冷却一分钟左右后开始创建套接字。我已确保在传输后关闭每个插座 现在,类似Apache这样的服务器已经很熟悉这种问题,建议实用程序(如ab/Sakee)使用keep-alive协议对Apache进行基准测试。也就是说,创建少量TCP连接,但出于基准测试目的通过它们发出多个请求。但是,在我们的情况
ulimit
设置为非常高的数字/proc/sys/net/ipv4/TCP\u rw\u recycle
和/proc/sys/net/ipv4/TCP\u rw\u reuse
设置为1,可以消除TCP TIME\u WAIT
。(我确实与netstat
确认没有TIME\u WAIT
sockets)OS:Fedora 10 Linux 2.6.24-23-xen#1 SMP老笑话:男人去看医生,说“医生,我这样做很疼”,把他的手臂扭到一个奇怪的位置 医生回答说:“好吧,别那么做!” 听着,你所做的是一个非常不自然的过程。建立TCP连接需要握手,每个消息传输的字节远远超过一个字节。设置和拆卸时间将非常重要。很可能您正在做的是耗尽与握手相关的内核资源;果不其然,如果你不去管它,不再打它,它最终会追上你
那么,你到底想测量什么?你到底想干什么?如果你真的想一次发送一个字节——上帝禁止——至少考虑使用udp;没有糟糕的设置/拆卸。与开销相比,它仍然非常低效——即使是UDP数据包也需要大约20个字节的帧——但它更好。连接然后发送1个字节不是任何东西的基准,除了TCP协议本身。正如查理·马丁(Charlie Martin)在上文中所说,大部分时间都浪费在连接然后断开插座上
我知道你想做基准测试,但这真的能很好地体现你的应用程序的功能吗?您真的要设置一个连接来发送1个字节吗?端口是否可能用完了?除非您愿意在循环中调用bind()以查找下一个可用端口,否则只能获得5000-1024个端口 端口为0的bind()返回1024-5000范围内的空闲端口。具有指定端口的bind()将获取该端口(如果可用)
int bindnextport(int s, struct sockaddr sa)
{
static int nextport = 1025;
int lastport;
lastport = nextport;
do {
sa.sa_data[0] = nextport >> 8;
sa.sa_data[1] = nextport & 255;
if (!bind(s, &sa, sizeof(sa))
return 0;
++nextport;
if (nextport >= 65536) nextport = 1024;
} while (lastport != nextport);
return 1;
}
http服务器声称能够保持10000个非活动http保持活动连接。你可以看看它们是怎样的。你是否尝试过设置标志以便在插座上重新使用EADDR?看看Richard Jones的文章。这是关于在Erlang中实现Comet应用程序的,但“将其增加到100万”一节描述了他如何对服务器进行基准测试;它以语句“从一台主机创建一百万个tcp连接是不平凡的”开头。这应该让您了解您的目的。一旦无法打开任何新套接字,您在netstat中会看到什么/do/you?客户端是否拒绝创建套接字,或者连接?我觉得必须有一些sysctl旋钮才能将5000更改为不同的值,但我不知道它可能是什么…/proc/sys/net/ipv4/ip_local_port_range,参见“5000”,你的意思是“65535”,或者什么?他似乎想对连接建立时间进行基准测试——如果与其他检查吞吐量的测试结合起来,这可能是一个有效的基准。哇,这篇文章真是太棒了。谢谢