创建了一个脚本来测试服务器(它能够处理超过 100K 的并发 TCP 套接字)。达到 65536 后,客户端停止尝试建立连接。想知道为什么。
use AnyEvent;
use EV;
use AnyEvent::Handle;
use IO::Socket::UNIX;
use Time::HiRes qw( gettimeofday );
use Data::Dumper;
my $count = 0;
my @hds = ();
my $cv = AnyEvent->condvar;
my $ips = ["192.168.1.11", "192.168.1.12","192.168.1.13","192.168.1.14"];
my $i;
my $j = 0;
for ($i=0; $i<1000; $i++) {
kickoff();
}
$cv->recv;
sub kickoff {
my $hdl = new AnyEvent::Handle
connect => ["192.168.1.1", 80],
on_error => sub {
my ($hdl, $fatal, $msg) = @_;
print "error when count=$count, $!\n";
$hdl->destroy;
$cv->send;
},
on_connect => sub {
$count ++;
if ($count > 65000) {
print "$count\n";
} elsif (($count % 1000) == 0) {
print "$count\n";
}
if ($count >= 100000) { return; }
kickoff();
},
on_prepare => sub {
my $hdl = shift;
#print Dumper($hd); exit;
mybind($hdl->{fh}, $ips->[$j%4]);
$j ++;
},
on_read => ::handleData;
push @hds, $hdl;
}
sub getTS {
my ($seconds, $microseconds) = gettimeofday;
return $seconds + (0.0+ $microseconds)/1000000.0;
}
sub mybind {
my ($sock, $ip) = @_;
my $local_host=inet_aton($ip) or return undef;
my $local = sockaddr_in(0, $local_host);
bind($sock,$local) or print 'Couldn\'t bind to local\n';
}
作为记录,我在 Ubuntu 14.04 (linux 3.19.0) 上以 root 身份运行它并ulimit -a
显示 100000。
知道为什么吗?
更新1
根据评论进行了一些更新。多谢你们。
- 当我只使用一个 IP 时,我可以轻松达到 27000 个并发 TCP 连接。端口范围(每个主机)应允许 4 个主机上的 100,000 个连接。
- 我有
fs.nr_open = 1048576
但没有 net.ipv4.netfilter.ip_conntrack_max 的配置 - 最大数字“65536”可能意味着很多东西:1) 主机上的最大端口数 2) 2 字节短整数中的数字数。所以它可能是相关的。想知道我可以在哪里重新定义限制,或者是否可以重新定义它。
- 当我到达数字 65536 时,它停止尝试创建新连接。