1

我們的應用程序有一個搜索任務,需要< 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(服務器管理員說不太可能)

任何人都有類似的經驗可以給我一些想法,所以我可以挖掘到的問題?非常感謝!

+1

而不是打開60個delayed_job工作者,打開5左右。你可以很容易地找到最佳的數字 - 計算每個工作的時間和給你最少的工人的數量是你想要的。每3分鐘10次比每30秒1次更好,但每26分鐘差30次。 (並試圖找出爲什麼你需要這麼多CPU時間。) – 2012-01-16 03:17:40

+0

我想添加到David的建議,你應該[配置你的應用程序](http://oprofile.sourceforge.net/examples/)發現_why_你的搜索是如此密集。 OProfile只是一個建議 - 你可能會通過詢問你的SQL系統來「EXPLAIN」它的查詢並添加索引,去掉鎖定,增加事務,做小事務等等,找到更多啓發性的數據。誰知道。OProfile是一個很好的機制,可以找到正在咀嚼CPU的東西,並希望能夠爲您提供所需的信息,以最小的努力做出最大的改進。 – sarnold 2012-01-16 03:41:26

+0

謝謝!我有更多的硬件信息: 〜2.4ghz,共有8個CPU(xeon x2)HT,所以虛擬機可以有16個核心 – 2012-01-16 04:47:26

回答

1

New Relic可以讓你瞭解你的工作在哪裏花費時間。您可以set it up to monitor your jobs並記錄每一個的詳細信息。有14天免費試用版,其中包含詳細的跟蹤功能(「交易跟蹤」)。

瓶頸可能出現在您提到的任何區域。如果數據庫是您的瓶頸,可以通過添加索引來調整查詢。如果您的Web請求並非真正並行執行(不知道您的代碼是什麼樣的),您可以使用類似typhoeus的東西來爲您處理所有並行業務。

Savon正在處理來自SOAP請求的XML,因此請確保您使用的是更快的XML庫,如libxml或nokogiri。

+0

系統管理員說「服務器是〜2.4ghz,共有8個CPU(xeon x2)和HT,所以虛擬機可以有16個核心」 我並不熟悉服務器硬件和虛擬機,所以不知道它是什麼意思...... 我們正在使用CentOS 6.0 64位 – 2012-01-16 05:11:02