我們的應用程序有一個搜索任務,需要< 30秒運行。我們使用delayed_job將任務移動到了後臺,它工作得很好。爲了處理更多的搜索請求,我們打開了60個delayed_job工作者,問題出現在同時工作的更多工作人員。delayed_job運行緩慢時,許多工人
如果我向服務器發送一個請求,大約需要30秒才能完成作業;然後,我嘗試向服務器發送10個請求,每個作業需要> 3分鐘才能完成...如果我嘗試同時向服務器發送30個請求,每個作業需要26分鐘才能完成..... .....我的天......
我們的搜索任務可以分成2部分。首先,使用線程向第三方服務器發送10-20個API請求(等待響應),完成大約需要15秒。其次,我們處理響應數據,搜索本地mySQL數據庫,做一些循環和計算,最後將結果保存到文件系統中(文件位置是使用NFS的共享空間),完成大約需要10秒。
我使用Linux'top'命令,發現1個作業運行時,有時需要100%的cpu能力。當我在同一時間運行30個工作,每個工作採取< 10%cpu力量,我想這就是爲什麼它需要26分鐘的每個工作...
目前我不知道如何提高速度,使它支持更多的用戶和速度是~30秒...
我們使用的是Rails 3.0.x,Ruby 1.9.2p290(真正的線程?),一個運行4個虛擬機(DB,Ngnix,Ruby/Unicorn,Ruby/delayed_job)。
現在在我心中是什麼: - 真正的線程(?如何測試如果我們) - JRuby的(?它有助於在這種情況下) - 網絡IO(服務器管理員說不可能) - 文件系統/ NFS IO(服務器管理員說不太可能)
任何人都有類似的經驗可以給我一些想法,所以我可以挖掘到的問題?非常感謝!
而不是打開60個delayed_job工作者,打開5左右。你可以很容易地找到最佳的數字 - 計算每個工作的時間和給你最少的工人的數量是你想要的。每3分鐘10次比每30秒1次更好,但每26分鐘差30次。 (並試圖找出爲什麼你需要這麼多CPU時間。) – 2012-01-16 03:17:40
我想添加到David的建議,你應該[配置你的應用程序](http://oprofile.sourceforge.net/examples/)發現_why_你的搜索是如此密集。 OProfile只是一個建議 - 你可能會通過詢問你的SQL系統來「EXPLAIN」它的查詢並添加索引,去掉鎖定,增加事務,做小事務等等,找到更多啓發性的數據。誰知道。OProfile是一個很好的機制,可以找到正在咀嚼CPU的東西,並希望能夠爲您提供所需的信息,以最小的努力做出最大的改進。 – sarnold 2012-01-16 03:41:26
謝謝!我有更多的硬件信息: 〜2.4ghz,共有8個CPU(xeon x2)HT,所以虛擬機可以有16個核心 – 2012-01-16 04:47:26