Написать данную статью мне понадобилось, чтобы в дальнейшем не проходить заново все круги ада. В отличие от Windows, в Linux нет особых переменных или чего-то простого, чтобы получить текущую загрузку процессора, именно в настоящий момент да ещё и в процентах. Рассмотрим 3 способа как это можно сделать, достоинства и недостатки каждого способа.

Первый способ используя «sys_getloadavg»

Данный способ достаточно простой и всё что нужно, это вызвать нечто подобное:

$cpu_cores = 1; //Количество ядер процессора
$current_load = sys_getloadavg(); //Возвращает массив из 3 значений: средняя загрузка за минуту, 5 минут и 15
$cpu_load = ($current_load[0] / $cpu_cores) * 100;

Преимущества

  1. Достаточно простая реализация;
  2. Получаемое значение достаточно точное.

Недостатки

  1. Как написано в описании, функция вычисляет загрузку системы с периодичностью в минуту, 5 и 15, плюс ключевое слово — среднюю. Получаемое значение, даже если мы будем использовать первое значение, опаздывает на минуту, а в реальности и на пару. То есть если есть какой-то процесс, который на пару секунд может загружать процессор и на 100%, он никак не отобразится.

Второй способ используя «top»

php позволяет выполнять системные команды и получать их результат. В принципе, это был второй способ, который я пытался использовать.

$try_top = shell_exec('top -b -n 1 |grep -i "^cpu\|^%cpu"');
preg_match('/\s(\S+)\sid/i', $try_top, $matches);
$cpu_load = 100 - str_replace('%', '', $matches[1]);

Преимущества

  1. Отзывчивость. Действительно похоже на процесс наблюдения загрузки процессора в реальном времени.

Недостатки

  1. Во время выполнения команды сверху накидывается процентов 10 лишних, особенно на малых нагрузках на систему. То есть если в консоли top показывает загрузку процессора в районе 4-6 процентов, то ответ получается в районе 14-17 процентов.

Третий способ используя «/proc/stat»

Наверное, это финальный способ, который меня устроил практически всем. Ключевое слово — «практически».

$procd = shell_exec("cat /proc/stat | grep '^cpu '");
$cpu_arr = explode(' ', trim(str_replace('cpu ', '', $procd)));
$idle = $cpu_arr[3];
 
if (is_file('/tmp/cpu_proc')) {
	$prev_procd = explode(' ', file_get_contents('/tmp/cpu_proc'));
	$prev_idle = $prev_procd[0];
	$prev_total = $prev_procd[1];
} else {
	$prev_idle = 0;
	$prev_total = 0;
}
 
$total = array_sum($cpu_arr);
$diff_idle = $idle - $prev_idle;
$diff_total = $total - $prev_total;
$diff_usage = (1000 * ($diff_total - $diff_idle) / $diff_total + 5) / 10;
 
file_put_contents('/tmp/cpu_proc', $idle.' '.$total);
 
return $diff_usage;

Преимущества

  1. Очень точное значение без тормозов и лишних надбавок сверху.

Недостатки

  1. Для точного расчёта необходимо сохранять предыдущие значения при опросе proc/stat, что может вызвать сложности и принести не мало бед. В принципе, если сохранять во временный файл в tmp, который смонтирован как виртуальный раздел в ОЗУ,  значения (при разовом вызове) никак не искажаются, ну или искажаются минимально (разница 1-2 процента), чем можно пренебречь.

Заключение

Мы рассмотрели 3 способа получения загрузки процессора на Linux в процентах. У каждого способа есть свои преимущества и недостатки, нельзя сказать, что какой-то лучше или хуже и может использоваться в конкретном случае. Лично для моих целей был необходим третий способ, но в большинстве случаем может быть достаточно и первого способа.

Добавить комментарий

Включите изображения, чтобы увидеть вопрос *