1

私は分散 Web クローラーを構築しており、各マシンのリソースを最大限に活用しようとしています。EventMachine で Iterator を介して解析関数を実行し、em-http-request を使用して非同期 HTTP 要求を作成します。今のところ、同時に実行する反復が 100 ありますが、このレベルを超えることはできないようです。反復回数を増やしても、クロールの速度には影響しません。ただし、CPU 負荷は 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
}  
4

2 に答える 2

3

select() (EMのデフォルト)を使用している場合、select()は1024のファイル記述子に制限されているため、ほとんどは1024です。

ただし、 kqueueを使用しているように見えるため、一度に1024を超えるファイル記述子を処理できるはずです。

于 2011-03-17T01:12:09.933 に答える
0

EM.threadpool_sizeの値はどれですか?
拡大してみてください。制限はkqueueではなく、リクエストを処理するプールにあると思われます...

于 2011-03-18T20:01:15.143 に答える