1

eth3:1, eth3:2, eth3:3仮想マシンで 3 つの異なる仮想 IP アドレスを使用して作成しましたが、

現在、で実行されているnginxサーバーへの65,000を超える接続を作成しようとしています192.168.56.1

VM のリソースは限られているため、ポート範囲を

sysctl net.ipv4.ip_local_port_range="32768 33000"

次に、仮想 IP アドレスごとにリクエスト ( ) を nginx サーバー ( ) に 200 回600送信するスレッドの作成を試みます。GET / HTTP/1.1running at 192.168.56.1

しかし、私のプログラムはどこかで失敗します! IO::Socket が教えてくれaddress in useます。

nginx ログを確認したところ192.168.56.23 and 192.168.56.24、nginx サーバーへのアクセスに 2 つの異なる IP アドレス ( ) しか使用されておらず、合計数はわずか 233 ( expected 200 x 3 = 600 access logs) でした。

何が問題なのか知っている人はいますか?

#!/usr/bin/perl
use warnings;
use strict;
use threads;
use IO::Socket::INET;

$| = 1;

sub run
{
        my ($ip, $id) = @_;
        print ">> Sendto .. $ip ($id)\n";

        my $socket = new IO::Socket::INET (
                PeerHost  => '192.168.56.1',
                LocalHost => $ip,
                PeerPort  => '80',
                Proto     => 'tcp',
        ) or die $@;

        print $socket "GET / HTTP/1.1\r\n\r\n";
        sleep (100); # hold connection
        $socket->close();
}

my @threads = ();
my @ips = qw/192.168.56.23 192.168.56.24 192.168.56.25/;

foreach my $ip (@ips)
{
        for (1..200)
        {
                push @threads, threads->create (\&run, $ip, $_);
        }
}

$_->join for @threads;
4

1 に答える 1

2

Linuxが空きローカルポートを見つけるために使用するアルゴリズムはローカルIPアドレスを気にしないため、ポートの範囲はすべてのIP間で共有されます。このブログ投稿では、問題についてさらに詳しく説明しています:http: //aleccolocco.blogspot.com/2008/11/ephemeral-ports-problem-and-solution.html

考えられる解決策は、ローカルポートを手動で設定することです。

    my $socket = new IO::Socket::INET (
            PeerHost  => '192.168.56.1',
            LocalHost => $ip,
            LocalPort => 32768 + $id,
            PeerPort  => '80',
            Proto     => 'tcp',
    ) or die $@;
于 2013-03-15T08:31:32.007 に答える