1

분산 된 웹 크롤러를 만들고 각 단일 컴퓨터의 리소스를 최대한 활용하려고합니다. Iterator를 통해 EventMachine에서 구문 분석 함수를 실행하고 em-http-request를 사용하여 비동기 HTTP 요청을 만듭니다. 현재로서는 100 회 반복 실행이 있는데이 레벨을 넘을 수없는 것 같습니다. 반복 횟수를 늘리면 크롤링 속도에 영향을주지 않습니다. 그러나, 나는 단지 10-15 %의 CPU 부하와 20-30 %의 네트워크 부하를 가지므로 더 빠른 속도로 크롤링 할 수있는 충분한 공간이 있습니다.EventMachine : EM에서 처리 할 수있는 최대 병렬 HTTP 요청은 무엇입니까?

저는 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

당신이 (EM의 기본 인) 선택()를 사용하는 경우, 대부분 1024 때문에 1024 개 파일 기술자에 한함) (선택.

kqueue을 사용하고있는 것처럼 보이므로 한 번에 1024 개가 넘는 파일 설명자를 처리 할 수 ​​있어야합니다.

0

EM.threadpool_size 값은 무엇입니까?
시도해보십시오. 한계는 큐큐에 없지만 요청을 처리하는 풀에있는 것으로 의심됩니다.