Хочется немного коснуться такой полезной штуки как LA — Load Average. Это среднее значение нагрузки на систему в Linux.
Очень важная метрика, на основе которой (и не только) в современных облаках происходит автоматическое масштабирование виртуальных машин-инстансов. А это — деньги.
Один из частых вопросов на собеседованиях по Linux или DevOps: "Что такое Load Average?" Вопрос с подвохом, почти такой же как: "Как работает DHCP?" или "Как загружается операционная система?" И чем больше вы знаете о теме, тем глубже можете дать ответ.
Один из вариантов определения LA:
Load Average — это среднее количество потоков за единицу времени, ожидающие выполнения.
Можно ещё сказать:
Load Average — это среднее значение нагрузки системы.
Или можно сказать так:
Load Average — это потребность в исполняемых потоках в виде усреднённого количества исполняемых и ожидающих потоков.
Или:
Load Average — это число, показывающее, сколько задач в среднем хотели бы прямо сейчас работать, даже если они вынуждены ждать.
Большинство утилит и инструментов отображает не одно, а три средних значения: для 1, 5 и 15 минут.
- За 1 минуту — мгновенный снимок
- За 5 минут — среднесрочная тенденция
- За 15 минут — долгосрочная нагрузка
uptime
top
htop
cat /proc/loadavg
w
Из пакета systat:
sar -q 1 3
Минутка занудства
Вопреки распространённому мнению, никаких прямых замеров за 1, 5 или 15 минут в ядре Linux не производится. Три числа — это даже не классические средние арифметические значения за указанные промежутки времени.
В основе расчёта лежит экспоненциально взвешенное скользящее среднее (Exponentially Weighted Moving Average) от суммы двух очередей ядра:
- nr_running() — потоки, готовые к выполнению (те, что сейчас работают на CPU, и те, что ждут очереди на CPU)
- nr_uninterruptible() — потоки в состоянии TASK_UNINTERRUPTIBLE (обычно это ожидание дискового I/O, реже — блокировки, проблемы с NFS или ожидание устройств)
Итоговое значение показывает средневзвешенное количество потоков, которые хотят выполняться (нуждаются в CPU) или вынуждены ждать диск.
Что касается значений для 1, 5 и 15 минут — это тоже упрощение. На самом деле числа 1, 5 и 15 — это константы, используемые в уравнении для вычисления экспоненциально затухающих скользящих сумм пятисекундного среднего значения. Таким образом, классические "средние нагрузки для 1, 5 и 15 минут" не совсем точно отражают нагрузку именно за эти временные интервалы в привычном понимании.
Минутка занудства закончена
По одному скриншоту с тремя значениями LA вы можете не только посмотреть текущую нагрузку на систему. Дополнительно можно оценить динамику нагрузки.
- 0 (все нули) — простой
- 1 мин > 15 мин — нагрузка растёт
- 1 мин < 15 мин — нагрузка спадает
- LA > Количества ядер — не хватает ресурсов, задач больше, чем исполнителей
На практике алерт часто ставят не на превышение количества ядер N, а на N × 0.7 или N × 1.5 в зависимости от сценария:
- Веб-сервер / API: LA > 0.7 × N — уже смотрим. Время отклика начинает расти нелинейно.
- Пакетная обработка / CI/CD: LA до 1.5 × N — нормально, задачи готовы подождать очереди.
- БД (PostgreSQL, MySQL): LA > N — почти всегда плохо, там каждый ждущий поток — это клиент с таймаутом.
В облаках метрика CPUUtilization тоже есть, но автоскейлинг по LA работает надёжнее, так как LA лучше отражает реальный спрос. Порог срабатывания обычно: LA >= 80% от N в течение 5 минут.
Хороший инженер смотрит не только LA. Если значение LA большое, то смотрим ещё и процессоры, дисковую подсистему, сетевые прерывания. Если CPU сильно утилизируется, нужны дополнительные процессоры. Если нехватка IOPS — модернизируем хранилище. DDoS, отвалилась шара, сетевые прерывания — чиним сеть.
Важное дополнение про сеть
В Linux Load Average включает процессы, ожидающие не только ядра CPU но и дисковые операции (I/O). Высокая нагрузка может быть из-за медленного диска, а не из-за процессора.
Классический Load Average в Linux рассчитывается на основе двух состояний процессов: TASK_RUNNING (CPU) и TASK_UNINTERRUPTIBLE (I/O).
Однако, некоторые сетевые операции тоже могут переводить процессы в состояние TASK_UNINTERRUPTIBLE. При этом Load Average на вашем сервере начнет расти, хотя CPU и локальный диск будут простаивать. Так что сеть тоже влияет на LA.
