2013-06-03 256 views
13

我在Laravel爲我的處理腳本設置了隊列。 我正在使用beanstalkd和supervisord。 有6種不同類型的加工管。Laravel Artisan隊列 - 高CPU使用率

問題在於,對於每個管子,工匠每秒都在不斷產生工人。 工人代碼似乎睡了1秒,然後工作線程使用7-15%cpu,乘以6管......我想每管有多個工人..我的CPU正在被吃掉。

我試着將1秒的睡眠時間改爲10秒。 這會有所幫助,但是當員工喚醒時,每10秒仍會有一個巨大的CPU峯值。 我現在甚至沒有處理任何東西,因爲隊列完全是空的,只是工作人員在尋找要做的事情。

我也測試過,看到laravel的cpu使用情況,當我刷新瀏覽器中的頁面,並且徘徊在10%左右..我現在處於低端rackspace實例,以便能夠解釋它,但仍然..看起來工人們每次起牀時都會捲起一個拉拉維的例子。

有沒有辦法解決這個問題?爲了能夠聽清楚工作是否準備就緒,我只需要將大量資金投入到更昂貴的服務器上?

編輯:

找到了解決辦法...這是不使用工匠隊列:監聽器或隊列:工作 我看着隊列代碼,並似乎沒有成爲解決這個問題的方式,每次工人檢查要做更多工作時,都需要加載。

相反,我用pheanstalk寫了自己的聽衆。 我仍然使用laravel將事物推入隊列,然後我的自定義偵聽器正在解析隊列數據,然後觸發一個artisan命令來運行。

現在,我的偵聽器的CPU使用率低於%0,我現在唯一一次啓動cpu的時候是實際發現要做的工作,然後觸發命令,我對此很滿意。

+9

你介意將自己的代碼分享給自定義偵聽器嗎?我有同樣的問題。 – greatwitenorth

+0

我也有興趣看到您的自定義聽衆! –

+0

我想看看你的解決方案 –

回答

5

我有同樣的問題。

但我找到了另一種解決方案。我原樣使用了工匠,但是我修改了'手錶'時間。默認情況下(從laravel)這次硬編碼爲零,我已經將此值更改爲600(秒)。請參閱文件: 「供應商/ laravel /框架/ src目錄/照亮/隊列/ BeanstalkdQueue.php」 和功能 「公共職能流行($隊列= null)的

所以,現在的工作也聽排隊等待10分鐘。當它沒有工作時,它退出,監督員重新啓動它。當它接收到一個作業時,它在它存在之後執行它,並且主管正在重新啓動它。

==>沒有輪詢了!

筆記:

  • 它不iron.io隊列或其他公司工作。
  • 當您希望1位工作人員接受來自多個隊列的作業時,它可能無法工作。
+1

我發佈到第一個發佈的解決方案迄今爲止一直在爲我工作。我想過修改你所說的文件,但我寧願不修改供應商/核心文件,特別是因爲我沒有提交這些目錄,這是我在生成服務器上動態生成這些目錄的構建過程的一部分。 雖然感謝您的幫助! – bsparacino

+1

我發現這是關於性能的最佳解決方案。 Laravel中的新提交增加了一個睡眠參數,它有點問題,因爲在進程休眠時它不會尋找任何新的工作。另外我注意到它仍然有一些CPU使用率的問題。上述解決方案將我的cpu降低到1%,並且它不斷檢查作業。 – greatwitenorth

+1

@ greatwitenorth,你可以在這裏改善我的聲譽嗎?謝謝。 – karelv

2

根據這一commit,現在你可以設置一個新的選擇queue:listen "--sleep={int}"這將讓你微調多少時間輪詢新的工作之前要等待。
另外,默認設置爲3而不是1.

+0

文檔甚至沒有對這個「睡眠」實際上做些什麼略微清楚。它一開始睡覺,廣告然後開始投票(迅速)?它應該在每次調查之間休息很長時間?只有在輪詢時沒有找到消息,它纔會睡覺嗎?在我的5.1試驗中,我可以告訴你這些都不是,所以它的目的是完全逃脫我。 – Jason

+0

你回答了你自己的問題:它在每次投票之間休息,並且只有在http://laravel.com/docs/5.1/queues中沒有發現任何消息。這對我來說很清楚:)你在試驗中使用了同步作爲隊列模式嗎? – younes0

+0

「輪詢新工作之前要等待的秒數」 - 也許這是對我來說含糊不清的措辭。在輪詢*時每次檢查之間等待的秒數*會更清楚。 「在輪詢之前」是開始進程和開始輪詢循環之間的時間,並且*出現*是已經實現的內容。無論如何,我還沒有看到在L5.1上運行的睡眠選項 - 輪詢全速運行,沒有應用睡眠週期。 – Jason

11

高CPU的問題是由於工作人員每次在隊列中檢查作業時加載完整框架而造成的。在laravel 4.2中,您可以使用php artisan queue:work --daemon。這將加載框架一次,並且檢查/處理作業發生在while循環內,這可以讓CPU輕鬆地呼吸。您可以在官方文檔中找到更多關於守護進程工作者的信息:http://laravel.com/docs/queues#daemon-queue-worker

但是,這種優點帶來了一個缺點 - 部署代碼時需要特別小心,並且必須處理數據庫連接。通常,長時間運行的數據庫連接斷開連接

+1

感謝您的更新。很高興知道他們終於支持這一點。 我一直在使用beanstalkd已經有一年多的時間了,這很棒,我必須照顧數據庫連接。 – bsparacino

+0

是的,他們正式推薦在處理每個作業之前運行'DB :: reconnect()',以確保連接可用。 'reconnect()'方法斷開已經建立的連接並重新連接。 – MohitMamoria

+0

是的,這就是我已經做的,很好的工作 – bsparacino