Ограничить нагрузку на ЦП или определить степень процесса

Это не первый случай, когда я получаю слишком много сообщений о загрузке процессора с моего хостинга. Код – это всего лишь некоторый случайный php-скрипт с запросами mysql, ничего необычного. (В таблицах нет ничего экстраординарного, максимум несколько сотен строк, и я всегда ограничиваю их, если потребуется.

Я не возражаю, если он работает в течение 0,15 секунды вместо 0,05, так есть ли способ контролировать приоритет процесса или ограничивать загрузку процессора?

Благодаря!

Related of "Ограничить нагрузку на ЦП или определить степень процесса"

Если это dameon или программа, которая длится долгое время, добавьте sleep() / usleep() . Небольшой сон значительно сократит использование вашего процессора .

Следующий код будет потреблять много процессора

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

Потому что вы не уступаете место CPU для выполнения других задач здесь. измените его на

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

Это значительно снизит использование вашего процессора. 1 секунда для CPU – это много времени для выполнения другой задачи .

Чтобы спать лишние 0.1 секунды ( 0.15 - 0.05 ), используйте usleep ().

 usleep(100000); 

В принципе, в системе Unixish (Linux, BSD и т. Д.) Вы можете использовать proc_nice() для изменения приоритета процесса, например:

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

Однако здесь есть несколько серьезных препон, которые делают его менее полезным на практике:

  • Он не поддерживается в Windows.
  • Вы можете только увеличить свою привлекательность, а не уменьшать ее (даже не возвращаясь к ее первоначальному значению).
  • Хорошность сохраняется до выхода PHP-процесса, что может быть проблемой, если вы используете PHP как процесс FastCGI или, что еще хуже, как расширение веб-сервера.
  • Из-за вышеперечисленных проблем proc_nice() может быть отключен по соображениям безопасности даже в системах, которые могут технически поддерживать его.

То, что вы могли бы попытаться сделать, если ваш веб-хост позволяет это, – это запустить фоновый процесс для долговременной задачи, чтобы ваш веб-сервер мог вернуться к обслуживающим запросам во время работы. Вы даже можете использовать команду nice shell, чтобы снизить приоритет фонового процесса, например:

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

Как только медленный скрипт закончится, вы можете получить его вывод, загрузив файл output.txt .

В дополнение к ответу Илмари Каронена:

Если вы хотите увеличить или уменьшить тонкость текущего процесса, используйте renice вместе с текущим идентификатором процесса:

 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