2012-10-20 6 views
0

sidekiq을 사용하여 대기열에 일부 처리를 보내는 시스템이 있습니다. 이러한 프로세스는 이미지를 조작하는 프로그램에 대한 시스템 호출을 수행하는 것으로 구성됩니다. 나는이 프로그램에 대해 매우 나쁜 성과를 보이고있다. 내가 '내 시스템'위에있을 때, 거의 모든 CPU가 루비에 의해 소비되고, 이미지 소프트웨어에 의해 단지 몇 개의 CPU가 소비된다.Ruby에서 멀티 스레드 시스템 호출

저는 5, 10, 20, 30 명의 근로자들과 함께 시험을 시도했습니다. 더 많은 작업자를 추가해도 처리 성능은 향상되지 않습니다 (값이 높을수록 더 나 빠집니다).

def perform(file) 
    command = "convert -strip -resize 580x580 -quality 90 -sampling-factor 4:2:0 -interlace Plane #{file} #{file}.main" 
    `#{command}` 
end 

루비에서 멀티 스레드 시스템 호출을 개선하기 위해 어떤 방법이 있나요 :

내 근로자는 다음과 같이인가?

+0

Resque가 멀티 스레드라고 생각하는 이유는 무엇입니까? –

+0

@DanielCukier Resque 멀티 스레드에서 내부적으로'fork'를 사용합니다 – Viren

답변

1

문제는 불행히도 Resque의 핵심 디자인입니다. 포크 작업자 모델을 사용하고 Ruby 1.9가 CoW에 친숙하지 않기 때문에 각 하위 프로세스에서 첫 번째 GC 호출은 전체 프로세스의 메모리 공간을 전체 복사본으로 만듭니다. 이것은 느립니다.

많은 사람들이이 문제로 인해 Sidekiq으로 특히 옮겼습니다. 스레드는 Ruby 1.9에서 포크보다 훨씬 저렴하므로 성능이 크게 향상됩니다.

즉, Ruby 2.0에 CoW에 친숙한 메모리 GC 모델이 제공되면 Resque는 훨씬 더 경쟁력이 있어야합니다. 그러나, 그것은 적어도 2/4 분기 동안은 일어나지 않을 것입니다.

+0

사실, 나는 이미 sidekiq :-)를 사용하고 있고 여전히 성능 문제가 있습니다. –

+0

"CoW"는 "워크 스테이션 클러스터"가 아니라 "쓰기 복사"를 의미합니다. ", 권리? –

+0

@AndrewGrimm - 수정하십시오. –