5

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

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

谢谢!

4

3 回答 3

12

如果这是长时间运行的守护进程或程序,请添加sleep()/ usleep()一个小的睡眠会大大减少你的 CPU 使用率

以下代码会消耗大量cpu

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

因为你没有给 CPU 空间来做其他任务。将其更改为

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

这将大大降低您的 CPU 使用率。CPU 的 1 秒是做其他任务的大量时间

要多睡0.1一秒 ( 0.15 - 0.05),请使用 usleep()。

usleep(100000);
于 2013-01-09T22:43:13.553 回答
5

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

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

但是,这里有几个主要的警告使其在实践中不太有用:

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

如果您的虚拟主机允许,您可以尝试做的是为长时间运行的任务启动一个后台进程,以便您的网络服务器可以在它运行时恢复为请求提供服务。您甚至可以使用niceshell 命令降低后台进程的优先级,如下所示:

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

慢速脚本完成后,您可以通过下载output.txt.

于 2013-01-09T23:14:52.010 回答
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

于 2015-03-30T14:07:35.880 回答