【问题标题】:Limit CPU load or set process prority限制 CPU 负载或设置进程优先级
【发布时间】:2013-01-09 22:41:14
【问题描述】:

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

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

谢谢!

【问题讨论】:

    标签: php cpu


    【解决方案1】:

    如果这是一个长时间运行的守护进程或程序,请添加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);
    

    【讨论】:

    • 非常感谢,这是完美的答案!
    • 实际上,它不会减少使用量,因为它会保持不变。但是会阻止进程在脚本的整个持续时间内从峰值增加到 100% CPU 使用率。这不会阻止应该更快执行的其他任务。
    • 如此聪明,如此有用。非常感谢你。正是我需要的
    【解决方案2】:

    原则上,在 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() 可能会被禁用,即使在技术上支持它的系统上也是如此。

    如果您的虚拟主机允许,您可以尝试将长时间运行的任务发送至start a background process,以便您的网络服务器可以在运行时恢复为请求提供服务。你甚至可以使用nice shell 命令来降低后台进程的优先级,像这样:

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

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

    【讨论】:

    • 感谢您的友好回答!我会将此标记为有用,但我还没有足够的代表:)
    • 实际上,正如我所指出的,我的第一个建议并没有那么有用,但我只是添加了一个可能更有用的建议——见上文。 :)
    • 再次感谢!我不想为此烦恼,因为我主要在家里工作,我必须运行 Windows。另一方面,我已经保存了这些 sn-ps。我不知道 PHP 有这个能力,我每天都在学习新东西 :)
    • @Ilmari Karonen 请参阅文档中的 custom_proc_nice() 函数来处理警告 2 和 3。
    • proc_nice 仅适用于 Windows。见:php.net/manual/en/function.proc-nice.php
    【解决方案3】:

    除了 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

    【讨论】:

    猜你喜欢
    • 2012-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    相关资源
    最近更新 更多