2

创建了一个脚本来测试服务器(它能够处理超过 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 时,它停止尝试创建新连接。
4

0 回答 0