Защо има толкова много TIME_WAIT свързвания при използване на EventMachine?

Когато пусна тестовия си код за 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..."
}

person why    schedule 26.12.2011    source източник


Отговори (1)


Състоянието TIME_WAIT продължава две минути и осигурява критично важна сигурност на връзката в TCP. Това не е проблем, това е решение.

person user207421    schedule 26.12.2011
comment
Това може да е проблем на изключително натоварена и претоварена машина, но се надяваме, че повечето от нас няма да се сблъскат с тази ситуация поради балансиращите натоварването и интелигентните хостинг дизайни. - person the Tin Man; 27.12.2011
comment
@theTinMan Как може да е проблем? Твърде много редове в netstat? - person user207421; 26.06.2013