EventMachine: Какой максимальный объем параллельных HTTP-запросов может обработать EM? - PullRequest
1 голос
/ 17 марта 2011

Я создаю распределенный веб-сканер и пытаюсь максимально использовать ресурсы каждой отдельной машины. Я запускаю функции синтаксического анализа в EventMachine через Iterator и использую em-http-request для выполнения асинхронных HTTP-запросов. На данный момент у меня есть 100 итераций, которые выполняются одновременно, и кажется, что я не могу пройти этот уровень. Если я увеличу количество итераций, это не повлияет на скорость сканирования. Тем не менее, я получаю только 10-15% загрузки процессора и 20-30% загрузки сети, так что есть много места для быстрого сканирования.

Я использую Ruby 1.9.2. Есть ли способ улучшить код для эффективного использования ресурсов или, может быть, я даже делаю это неправильно?

def start_job_crawl     
  @redis.lpop @queue do |link|
    if link.nil?                
      EventMachine::add_timer( 1 ){ start_job_crawl() }
    else   
      #parsing link, using asynchronous http request, 
      #doing something with the content                         
      parse(link)
    end          
  end        
end

#main reactor loop   

EM.run {   
 EM.kqueue   

 @redis = EM::Protocols::Redis.connect(:host => "127.0.0.1")
 @redis.errback do |code|
  puts "Redis error: #{code}"
 end

 #100 parallel 'threads'. Want to increase this     

  EM::Iterator.new(0..99, 100).each do |num, iter| 
      start_job_crawl()    
  end
}  

Ответы [ 2 ]

3 голосов
/ 17 марта 2011

, если вы используете select () (по умолчанию для EM), самое большее 1024, потому что select () ограничен 1024 дескрипторами файла.

Однако, похоже, что вы kqueue , поэтому он должен обрабатывать более 1024 файловых дескрипторов одновременно.

0 голосов
/ 18 марта 2011

какое значение у вашего EM.threadpool_size?
попробуйте увеличить его, я подозреваю, что предел не в kqueue, а в пуле, обрабатывающем запросы ...

...