2011-04-28 59 views
3

我有一些長期運行的CLI PHP腳本通過cron定期運行。我希望他們儘快完成,但不會嚴重影響其他進程(例如Web服務器響應)。有沒有更好的方法來讓CPU在PHP中的其他進程?

目前,我與

nice -n 19 

運行腳本,也有將很短usleep()函式呼叫,例如50微秒在我的主循環試驗。儘管如此,這並不總是像單核虛擬機那樣快速產生。順便說一句,我不飽和內存,所以沒有分頁發生。

我讀過usleep()是一個系統調用,它允許調度程序在比沒有任何系統調用的情況下更快地分配其他進程的優先級。

我想知道的是,如果有更好的方法在PHP中這樣做。比如一個不睡覺但立即產生優先權的呼叫。

另外,我知道其他語言比PHP更高效,但這是用Symfony + Doctrine編寫的更大應用程序的一部分。我不想分裂成多種語言,並失去了應用程序模型的業務邏輯優勢。

+0

爲什麼不好夠好? – 2011-04-28 19:46:46

回答

2

如果nice不適合你,可以考慮爲你的內核選擇一個不同的調度器。這是您的操作系統優先化進程的問題。這不是你可以在應用程序內輕鬆解決的問題(不管它是用PHP還是其他語言編寫的)。

哦,請記住,nice級別不會真正啓動,除非您需要CPU週期。如果你的CPU大部分處於空閒狀態,那麼即使是19級的進程也被允許吃掉它想要的所有CPU週期。

編輯:事實上,請確保您在沿着這條路徑進行CPU限制之前。如果你是I/O綁定,那麼CPU優先級不會有太大影響。

+0

是的,這絕對是CPU限制的。它在這個過程中花費了99-100%的時間。我意識到好的不會踢,直到別的東西想跑,而且它確實有效,儘管比想要的慢。 – ybull 2011-04-28 22:29:09

+0

在這種情況下,我肯定會首先嚐試各種調度程序和選項。 – 2011-04-28 22:47:13

1

一般來說Linux非常保守。但你可以嘗試schedtool和libmlock。後者是在公羊鎖定php以避免交換。你也可以嘗試交換,因爲它大部分都很高。您也可以嘗試使用積極的cflags或者使用英特爾C編譯器(我有銷售許可證)來自己編譯php。國際海事組織schedtool是一樣好,但有一些更多的變數。

+0

你的主要評論是無關的(我已經指定它不是內存限制的,也沒有做任何分頁)。但是你是唯一專門提到schedtool命令的人。我已經安裝了它,發現它可以在SCHED_BATCH模式下運行。所以我給你+1的具體參考。 Thx – ybull 2011-05-14 14:14:01

+0

非常感謝您的回覆。你有沒有試過用ICC編譯php?這會非常影響性能。您可以將其作爲試用版下載進行測試。我還有我的執照。 – Bytemain 2011-05-14 14:20:00

1

「睡0次」通常是最好的,可以做到「立即控制」。其他方法通常需要在內核模式下運行(甚至內核模式可能會被硬件中斷搶佔,具體取決於)。

在「0睡眠時間」過程(或線程)將被安排爲「再次在[將來的]未來的某個點」執行 - 確切的保證是系統特定的。實際睡眠的最低分辨率取決於環境和系統配置(一般來說,它不會是真正的「0時間」)。在非實時系統(例如Linux或Windows)上,確切的時間通常不能保證 - 調度程序將執行它想要的操作。

快樂編碼。

0

也許您可以在PHP之外重寫部分應用程序以使用命令行工具(不需要您的應用程序邏輯)。

例如,假設您有一個大的XML文件要導入。您可以嘗試使用CLI工具xsltproc將您的XML文件轉換爲CSV格式,而不是使用PHP完成所有操作,這會爲您提供一個輕量級的PHP文件。

+0

感謝您的建議。如果我確定腳本的某個部分可以使用更高效的外部工具,那麼這很有意義。否則,進行系統調用和啓動新的shell進程的成本將遠遠大於usleep()。 – ybull 2011-04-28 22:31:34

+0

是的,當然,好處必須超過這種方法的缺點。我在處理這些繁重的任務方面沒有太多經驗,但我經常看到像awk或sed這樣的工具可以真正幫助PHP腳本,因爲它們經過完全設計和優化以處理他們自己的具體部分。 – dandelionmood 2011-04-29 08:02:56

相關問題