私は分散 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
}