W3docs

sys_getloadavg()

В этой статье рассматривается функция PHP sys_getloadavg(): обзор, принцип работы и примеры использования.

В этой статье рассматривается функция PHP sys_getloadavg(): обзор, принцип работы и примеры использования.

Введение в функцию sys_getloadavg()

Функция sys_getloadavg() — это встроенная функция PHP, которая получает среднюю нагрузку на систему. Обратите внимание, что она доступна только на Unix-подобных системах (Linux, macOS) и не работает на Windows, где возвращает false. Её можно использовать для мониторинга производительности системы и оптимизации распределения ресурсов.

Функция не принимает аргументов и возвращает массив, содержащий три числа с плавающей точкой — средние значения нагрузки системы за 1, 5 и 15 минут:

sys_getloadavg(): array

Что на самом деле означает «средняя нагрузка»

Средняя нагрузка — это среднее количество процессов, которые либо выполняются на CPU, либо ожидают его (или дискового ввода-вывода) за заданный промежуток времени. Три значения позволяют увидеть тенденцию:

  • $load[0] — нагрузка за последнюю 1 минуту (самое актуальное, наиболее изменчивое значение).
  • $load[1] — нагрузка за последние 5 минут.
  • $load[2] — нагрузка за последние 15 минут (наиболее сглаженное значение, лучше всего подходит для анализа тенденций).

Практическое правило: разделите нагрузку на количество ядер CPU. Минутная нагрузка 4.0 на 4-ядерной машине означает, что CPU примерно полностью загружен; то же значение на 1-ядерной машине означает, что она сильно перегружена. Именно поэтому нагрузку почти всегда нормализуют относительно количества ядер, прежде чем предпринимать какие-либо действия.

Как использовать функцию sys_getloadavg()

Использовать функцию sys_getloadavg() очень просто. Она возвращает массив средних значений нагрузки, длину которого следует проверять перед обращением к конкретным индексам. Вот пример:

Как использовать функцию sys_getloadavg()

php— editable, runs on the server

В этом примере мы вызываем sys_getloadavg() и присваиваем возвращённый массив переменной $load. Перед выводом средней нагрузки за 1, 5 и 15 минут мы проверяем, что массив содержит не менее трёх элементов.

Нормализация нагрузки относительно ядер CPU

Поскольку абсолютное значение нагрузки бессмысленно без знания количества ядер машины, практическая проверка состояния системы делит нагрузку на количество ядер и сравнивает результат с пороговым значением. Количество ядер можно прочитать из /proc/cpuinfo в Linux (или с помощью nproc):

<?php
function cpuCoreCount(): int
{
    // Linux: count processor entries in /proc/cpuinfo
    if (is_readable('/proc/cpuinfo')) {
        $cpuinfo = file_get_contents('/proc/cpuinfo');
        return max(1, substr_count($cpuinfo, 'processor'));
    }
    // Fallback for other systems
    return (int) (shell_exec('nproc') ?: 1);
}

$load  = sys_getloadavg();
$cores = cpuCoreCount();

$perCore = $load[0] / $cores;

if ($perCore > 1.0) {
    echo "WARNING: system is overloaded (" . round($perCore, 2) . " per core)\n";
} else {
    echo "OK: load per core is " . round($perCore, 2) . "\n";
}
?>

Здесь $load[0] / $cores преобразует абсолютную нагрузку в значение на одно ядро: значение выше 1.0 означает, что количество выполняемых процессов превышает количество ядер, то есть задачи ставятся в очередь.

Соображения о производительности

Функция sys_getloadavg() — полезный инструмент для мониторинга производительности системы. Тем не менее она читает данные непосредственно из ядра ОС и не является вычислительно затратной. В веб-приложениях с высокой нагрузкой всё же рекомендуется избегать её вызова при каждом запросе, чтобы минимизировать лишние накладные расходы. Используйте её для периодического мониторинга или диагностических проверок, а не в плотных циклах или критических для производительности секциях.

Заключение

Подводя итог, sys_getloadavg() предоставляет быстрый способ получить средние значения нагрузки на Unix-подобных системах. Нормализуя результат относительно количества ядер CPU и проверяя возвращённый массив, вы можете эффективно отслеживать производительность системы.

Ознакомьтесь с другими диагностическими функциями и функциями работы со временем: microtime() — для высокоточного измерения времени, time() — для получения текущей метки времени Unix, syslog() — для отправки полученных предупреждений в системный журнал. Для анализа самого возвращённого массива в приведённых выше примерах используется count().

Практика

Практика
Какова цель функции sys_getloadavg() в PHP?
Какова цель функции sys_getloadavg() в PHP?
Was this page helpful?