限制CPU负载或设置进程优先级

时间:2013-01-09 22:41:15

标签: php

这不是我第一次从托管中收到太多的CPU加载警告。代码只是一些带有mysql查询的随机php脚本,没什么特别的。 (表格不是特别的,最多几百行,如果要求,我总是限制它们。

我不介意它运行0.15秒而不是0.05,所以有没有办法控制进程优先级或限制CPU负载?

谢谢!

3 个答案:

答案 0 :(得分:11)

如果这是一个长时间运行的dameon或程序,请添加sleep() / usleep()小睡眠会显着降低CPU使用率

以下代码将消耗大量的cpu

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

因为您没有为CPU提供空间来执行其他任务。将其更改为

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

这将大大降低您的CPU使用率。 1秒的CPU是很多时间来完成其他任务

要睡觉额外的0.1秒(0.15 - 0.05),请使用usleep()。

usleep(100000);

答案 1 :(得分:6)

原则上,在Unixish系统(Linux,BSD等)上,您可以使用proc_nice()函数来更改进程优先级,如下所示:

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

然而,这里有一些主要的注意事项使它在实践中不那么有用:

  • Windows不支持。
  • 你只能增加好感,而不是减少它(甚至不回到它的原始值)。
  • 在PHP进程退出之前,这种友好一直存在,如果您将PHP作为FastCGI进程运行,或者更糟糕的是,作为Web服务器扩展,这可能是一个问题。
  • 由于上述问题,即使在技术上可以支持它的系统上,也可能出于安全原因禁用proc_nice()

如果您的虚拟主机允许,您可以尝试执行的操作是start a background process以执行长时间运行的任务,以便您的网络服务器可以在运行时返回到服务请求。您甚至可以使用nice shell命令来降低后台进程的优先级,如下所示:

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

慢速脚本完成后,您可以通过下载output.txt来获取其输出。

答案 2 :(得分:0)

除了Ilmari Karonen的回答:

如果您想增加或减少当前流程的优点,请使用renice和当前流程ID:

function custom_proc_nice($priority) {

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

}

如果你想在PHP进程退出后阻止好处持续存在,你将需要一个关闭函数:

function exit_func(){

  // Restore priority
  proc_nice(0);
}

register_shutdown_function('exit_func');

<强>资源

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