2011-12-26 4 views
0

EventMachineのテストコードを実行すると、「TIME_WAIT」接続が多すぎることがわかりました。それって問題ですか?EventMachineを使用しているときになぜ「TIME_WAIT」接続がたくさんあるのですか?

 
run netstat -anp | grep 8080 

    tcp  0  0 0.0.0.0:8080   0.0.0.0:*    LISTEN  13012/ruby  
    tcp  0  0 127.0.0.1:38701   127.0.0.1:8080   TIME_WAIT -    
    tcp  0  0 127.0.0.1:38706   127.0.0.1:8080   TIME_WAIT -    
    tcp  0  0 127.0.0.1:38709   127.0.0.1:8080   TIME_WAIT -    
    tcp  0  0 127.0.0.1:38708   127.0.0.1:8080   TIME_WAIT -    
    tcp  0  0 127.0.0.1:38699   127.0.0.1:8080   TIME_WAIT -    
    tcp  0  0 127.0.0.1:38700   127.0.0.1:8080   TIME_WAIT -    
    tcp  0  0 127.0.0.1:38707   127.0.0.1:8080   TIME_WAIT -    
    tcp  0  0 127.0.0.1:38705   127.0.0.1:8080   TIME_WAIT -    
    tcp  0  0 127.0.0.1:38702   127.0.0.1:8080   TIME_WAIT -    
    tcp  0  0 127.0.0.1:38703   127.0.0.1:8080   TIME_WAIT -    
    tcp  0  0 127.0.0.1:38704   127.0.0.1:8080   TIME_WAIT - 

私のテストクライアントコードは次のとおりです。

require 'rubygems' 
require 'benchmark' 
require 'socket' 
require 'logger' 
Benchmark.bm do |x| 
    logger = Logger.new('test.log', 10, 1024000) 
    logger.datetime_format = "%Y-%m-%d %H:%M:%S" 
    logger.info "----------------------------------" 
    x.report("times:") do 
    for i in 0..20 
     sleep 0.1 
     Thread.new do 
     TCPSocket.open "127.0.0.1", 8080 do |s| 
        s.send "#{i}", 0 
      if result = s.recv(100) 
      logger.info result 
      end 
     end 
     end 
    end 
    end 
end 

私のテストサーバーのコードは次のとおりです。

require 'rubygems' 
require 'benchmark' 
require 'eventmachine' 
class Handler < EventMachine::Connection 
    def initialize(*args) 
    super 
    end 

    def receive_data(data) 
    puts "------------------------" 
    @reply = data 
    @state = :processing 
    EventMachine.defer(method(:do_something), method(:callback)) 
    rescue Exception => ex 
    LOGGER.error "#{ex.class}: #{ex.message}\n#{ex.backtrace.join("\n")}" 
    end 

    def do_something 
    #simulate a long running request 
    a = [] 
    for i in 1..3000 
     a << rand(3000) 
     a.sort! 
    end 
    return @reply 
    end 

    def callback(msg) 
    self.send_data msg 
    @state = :closing 
    end 

    def unbind 
    close_connection_after_writing #unless @state == :processing 
    end 

end 

EventMachine::run { 
    EventMachine.epoll 
    EventMachine::start_server("0.0.0.0", 8080, Handler) 
    puts "Listening..." 
} 
+0

「あまりにも多く」を定義します。 – EJP

答えて

1

TIME_WAIT状態が2分間続くと、TCPに非常に重要な接続のセキュリティを提供します。それは問題ではなく、解決策です。

+0

非常にビジーで過負荷のマシンでは問題になる可能性がありますが、ロードバランサとインテリジェントなホスティングデザインのために、ほとんどの人がその状況に遭遇することはありません。 –

+0

@theTinManどのように問題がありますか? netstatの行が多すぎますか? – EJP

関連する問題