2012-10-20 61 views
0

我有一個系統使用sidekiq向隊列發送一些處理。這些過程包括對操縱圖像的程序進行系統調用。我對這個節目的表現非常糟糕。當我'頂部'我的系統時,幾乎所有的cpu都被ruby使用,而圖像軟件只需要幾個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

它使用'其實內部fork' – Viren

回答

1

不幸的是Resque的核心設計是問題。因爲它使用分叉工作模型,並且因爲Ruby 1.9不是CoW友好型的,所以每個子進程中的第一個GC調用將導致整個進程內存空間的完整副本。這很慢。

很多人已經搬到Sidekiq作爲替代具體是因爲這個問題。一個線程比Ruby 1.9下的分支要便宜得多,並且應該會顯着提高性能。

這就是說,一旦紅寶石2.0附帶了一頭牛友好存儲器GC模型,Resque應該是顯著更具競爭力。但是,這至少在幾個季度內不會發生。

+0

@DanielCukier Resque AINT多線程,我做了一個困惑:我已經使用sidekiq :-),還是把性能問題 –

+0

「牛」的意思是「寫入時複製」,而不是「工作站機羣「, 對? –

+0

@AndrewGrimm - 正確。 –