2013-01-09 31 views
5

這不是我第一次從我的主機得到太多的CPU負載警告。該代碼只是一些隨機的PHP腳本與MySQL查詢,沒有什麼奇特的。 (表格是沒有什麼特別的,最多有幾百行,我總是限制他們,如果要求。限制CPU負載或設置進程prority

我不介意如果它運行0.15秒而不是0.05,那麼有沒有辦法我可以控制進程優先級或極限CPU負載?

謝謝!

回答

11

如果這是長時間運行的dameon或程序添加sleep()/usleep()一個小的睡眠會降低CPU的使用率大幅

下面的代碼將消耗大量的c pu

while(...){ 
//do stuff 
} 

因爲您沒有給CPU空間來做其他任務。將其更改爲

while(...){ 
    //do stuff 
    sleep(1); 
} 

這將大大降低您的CPU使用率。 對於CPU 1秒是很多時間做其他任務

要睡多一些0.1秒(0.15 - 0.05)請使用usleep()。

usleep(100000); 
+0

非常感謝你,這是完美的答案! – molbal

+0

一般來說,它不會減少使用量,因爲它會保持不變。但是,在腳本的整個持續時間內,將會實現從尖峯到100%CPU使用率的過程。它不會阻止應該更快執行的其他任務。 – Grzegorz

6

原則,對Unixish系統(Linux操作系統,BSD等),你可以使用proc_nice()功能改變進程的優先級,這樣的:

proc_nice(20); // now this process has very low priority 

不過,也有一對夫婦這裏的主要注意事項使它在實踐中不那麼有用:

  • 它在Windows上不受支持。
  • 你只能增加漂亮度,而不能減少它(甚至不能回到原來的值)。
  • 在PHP進程退出之前,它的好處一直存在,如果您將PHP作爲FastCGI進程運行,或者甚至更糟糕的是作爲Web服務器擴展,則可能會出現問題。
  • 由於上述問題,因安全原因可能會禁用​​,即使在技術上可以支持它的系統上也是如此。

什麼,你可以嘗試這樣做,如果你的虛擬主機提供商允許的話,是start a background process對於長時間運行的任務,讓你的網絡服務器可以回去,而它的運行服務請求。你甚至可以使用nice shell命令降低後臺進程的優先級,這樣的:

exec("nice nohup php -f slow_script.php </dev/null> output.txt 2>&1 &"); 

一旦慢劇本完成後,您可以通過下載output.txt得到它的輸出。

+0

謝謝你的親切回答!我認爲這很有用,但我沒有足夠的代表:) – molbal

+0

其實,我的第一個建議並不是很有用,正如我注意到的,但我只是增加了一個可能更有用的建議 - 參見上文。 :) –

+0

再次感謝!我不想爲此煩惱,因爲我主要從家裏工作,在那裏我必須運行Windows。另一方面,我保存了這些片段。我不知道PHP是否有這個能力,我每天都會學到新的東西:) – molbal

0

除了ILMARI Karonen的回答是:

如果你想增加或減少當前進程的nice值連同當前進程ID使用renice:如果你想防止

function custom_proc_nice($priority) { 

    exec("renice +$priority ".getmypid()); 

} 

美好的事物堅持PHP進程退出後,你將需要一個關機功能:

function exit_func(){ 

    // Restore priority 
    proc_nice(0); 
} 

register_shutdown_function('exit_func'); 

雷索urces

http://php.net/manual/en/function.proc-nice.php

+0

唉,除非您以PHP身份運行root用戶(這是非常不安全的,所以你真的不應該這樣做),[renice'也不能減少進程的好處。](http://linux.die.net/man/8/renice) –

+0

很高興知道。感謝信息和反應Ilmari!是否將php進程的默認值設置爲0? – RafaSashi