Написать данную статью мне понадобилось, чтобы в дальнейшем не проходить заново все круги ада. В отличие от Windows, в Linux нет особых переменных или чего-то простого, чтобы получить текущую загрузку процессора, именно в настоящий момент да ещё и в процентах. Рассмотрим 3 способа как это можно сделать, достоинства и недостатки каждого способа.
Первый способ используя «sys_getloadavg»
Данный способ достаточно простой и всё что нужно, это вызвать нечто подобное:
$cpu_cores = 1; //Количество ядер процессора $current_load = sys_getloadavg(); //Возвращает массив из 3 значений: средняя загрузка за минуту, 5 минут и 15 $cpu_load = ($current_load[0] / $cpu_cores) * 100;
Преимущества
- Достаточно простая реализация;
- Получаемое значение достаточно точное.
Недостатки
- Как написано в описании, функция вычисляет загрузку системы с периодичностью в минуту, 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]);
Преимущества
- Отзывчивость. Действительно похоже на процесс наблюдения загрузки процессора в реальном времени.
Недостатки
- Во время выполнения команды сверху накидывается процентов 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;
Преимущества
- Очень точное значение без тормозов и лишних надбавок сверху.
Недостатки
- Для точного расчёта необходимо сохранять предыдущие значения при опросе proc/stat, что может вызвать сложности и принести не мало бед. В принципе, если сохранять во временный файл в tmp, который смонтирован как виртуальный раздел в ОЗУ, значения (при разовом вызове) никак не искажаются, ну или искажаются минимально (разница 1-2 процента), чем можно пренебречь.
Заключение
Мы рассмотрели 3 способа получения загрузки процессора на Linux в процентах. У каждого способа есть свои преимущества и недостатки, нельзя сказать, что какой-то лучше или хуже и может использоваться в конкретном случае. Лично для моих целей был необходим третий способ, но в большинстве случаем может быть достаточно и первого способа.