2013-03-15 16 views
1

我有3個不同的虛擬IP地址的虛擬機創建eth3:1, eth3:2, eth3:3虛擬IP配置不工作,我仍然得到一個地址已在使用錯誤

現在我試圖創造超過65K連接運行於192.168.56.1的nginx服務器。

如VM資源是有限的,所以我通過

的sysctl net.ipv4.ip_local_port_range = 「32768 33000」

然後我嘗試創建600線程,即減少端口範圍會向每個虛擬IP地址發送一個請求(GET/HTTP/1.1)到nginx服務器(running at 192.168.56.1)200次。

但我的程序失敗somwehere! IO :: Socket告訴我address in use

所以我檢查了我的nginx日誌,它只使用了2個不同的ip地址(192.168.56.23 and 192.168.56.24)來訪問nginx服務器,並且總數只有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 [email protected]; 

     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; 
+0

要打到接近誰,有什麼不好呢?請發表評論 – daisy 2013-03-15 08:20:12

回答

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 [email protected]; 
+0

這是魔術!你是男人 – daisy 2013-03-15 08:48:26

相關問題