
В прошлой статье Кирилл Казарин, Senior DevOps и SRE менеджер, автор телеграм-канала Kazarin.online и спикер курса «Администрирование Linux», рассмотрел общую утилизацию CPU, но в мире Linux есть еще один популярный способ отслеживания нагрузки на систему, который также связан с потреблением CPU, однако работает иначе, показывает не только утилизацию процессора, а, скорее, общую нагрузку, и позволяет нам оценить не состояние системы в момент, а некоторую динамику во времени. Имя ему — Load average.
Статья 2. Load Average
Итак, Load Average — это ключевой показатель, который используется в Linux для оценки общей нагрузки на систему. Он представляет собой среднее количество процессов, которые либо выполняются на процессоре, либо ожидают своей очереди на выполнение в течение определенных временных интервалов: 1, 5 и 15 минут. Этот показатель предоставляет администраторам систем более полное и детализированное представление о текущей нагрузке, чем простой процент загрузки CPU.
Таким крутым и универсальным этот показатель был не всегда — примерно до 1993 года, он, как и аналоги из других Unix систем, показывал только CPU load average, не учитывая прочие потребности в ресурсах. Все изменил патч от Fri, 29 Oct 1993, в котором автор написал:
The kernel only counts "runnable" processes when computing the load average. I don't like that; the problem is that processes which are swapping or waiting on "fast", i.e. noninterruptible, I/O, also consume resources.
It seems somewhat nonintuitive that the load average goes down when you replace your fast swap disk with a slow swap disk...
Anyway, the following patch seems to make the load average much more consistent WRT the subjective speed of the system. And, most important, the load is still zero when nobody is doing anything.
Как код развивался дальше я уже не стал смотреть, но суть в том, что с этого момента люди стали думать об этой метрике не как о CPU load, а как о System Load.
Как рассчитывается Load Average
По фразе выше или по некоторым статьям в интернете может показаться, что «среднее» в контексте LA — это что-то типа среднеарфметического значения по точкам за интервал времени. Но, в отличие от простого среднего арифметического, Load Average в Linux рассчитывается с использованием экспоненциального скользящего среднего (exponential moving average).
Эта методика позволяет учитывать последние изменения в нагрузке на систему, придавая им больший вес по сравнению с более старыми данными. Это обеспечивает более оперативное и стабильное значение, что особенно полезно для мониторинга системной производительности.
Формула расчета Load Average:

Здесь
LA(t) — новое значение Load Average.
LAprev — предыдущее значение Load Average.
n — текущее число процессов в очереди выполнения (running + waiting).
t — время с момента последнего обновления.
𝛕 — временная константа (разная для 1, 5 и 15 минут):
-
1 минута: 𝛕 = 60 сек.
-
5 минут: 𝛕 = 300 сек.
-
15 минут: 𝛕 = 900 сек.
Каждую секунду ядро Linux обновляет Load Average, используя формулу сглаживания. Для каждой из трёх метрик (1, 5, 15 минут) используются разные коэффициенты затухания:
-
Коэффициент затухания (Decay Factor) для обновления:

Формула позволяет сглаживать резкие изменения в системе. Например, если запустить тяжёлую нагрузку, Load Average сразу не вырастет до максимума, а будет увеличиваться постепенно.
Пример расчёта
Допустим, текущее LA(1 мин) = 0.5, и в момент времени t появилось 4 процесса в очереди.
Расчет нового Load Average произойдет следующим образом:
LA(1)=0.5×0.983+4×(1−0.983) =0.5×0.983+4×0.017 = 0.4915+0.068=0.5595
LA(1)=0.5595×0.983+4×(1−0.983) =0,6179
LA(1)=0,6179×0.983+4×(1−0.983) =0,6755
… и так далее …
Таким образом, новое Load Average не сразу становится 4, а постепенно увеличивается.
Такой подход помогает более точно отражать текущее состояние системы.
Выражаясь математическим языком, все три значения всегда усредняют всю нагрузку системы с момента запуска системы. Все они затухают экспоненциально, но затухают с разной скоростью: они затухают экспоненциально по e через 1, 5 и 15 минут соответственно. Следовательно, средняя нагрузка за 1 минуту состоит из 63% (точнее: 1 - 1/ e ) нагрузки за последнюю минуту и 37% (1/ e ) средней нагрузки с момента запуска, исключая последнюю минуту. Для средних нагрузок за 5 и 15 минут то же самое соотношение 63% / 37% вычисляется за 5 и 15 минут соответственно.
Поэтому технически неточно, что средняя нагрузка за 1 минуту включает только последние 60 секунд активности, поскольку она включает 37% активности из прошлого, но правильно утверждать, что она включает в основном последнюю минуту.
Практическое применение
-
Если Load Average < Количество ядер → система работает нормально.
-
Если Load Average ≈ Количество ядер → CPU загружен на 100%.
-
Если Load Average > Количество ядер → процессы ожидают выполнения, возможны проблемы.
Например, на 8-ядерном сервере:
-
LA(5) = 4 → CPU нагружен на 50%.
-
LA(5) = 12 → CPU перегружен, есть задержки.
Почему Load Average предпочтительнее процента загрузки CPU?
-
Учет процессов в очереди. Load Average учитывает не только активные процессы, работающие на CPU, но и те, которые ждут своей очереди. Это позволяет получить более полное представление о загруженности системы. Процент загрузки CPU, напротив, показывает только текущую активность процессора, не учитывая процессы в очереди, что может привести к недооценке реальной нагрузки.
-
Интегральный показатель нагрузки. Load Average охватывает все ядра процессора. В системах с множеством процессоров или гипертредингом он лучше отражает реальную загруженность системы, чем процент загрузки CPU, который может не показывать накопление процессов в очереди на выполнение.
-
Учет ввода-вывода. Load Average учитывает процессы, которые находятся в состоянии "uninterruptible sleep", ожидая завершения операций ввода-вывода. Эти процессы могут значительно влиять на производительность системы, даже если они не занимают CPU напрямую, что, опять же, не будет видно при использовании только процента загрузки CPU.
-
Анализ тенденций. Load Average предоставляет данные за три временных интервала (1, 5 и 15 минут), что позволяет отслеживать изменения в нагрузке на систему и прогнозировать потенциальные проблемы. Процент загрузки CPU дает лишь мгновенное представление, без возможности анализа динамики.
Так, так — а что там было упомянуто про гипертрединг?
В системах с гипертредингом каждый физический процессор обрабатывает два потока инструкций, что создает логические ядра. Linux рассматривает эти потоки как отдельные ядра. Поэтому в системе с 4 физическими ядрами и гипертредингом будет 8 логических ядер. Load Average 8.0 в такой системе будет означать полное использование всех логических ядер, но это не обязательно указывает на удвоение вычислительной мощности. Гипертрединг может быстрее привести к снижению производительности при высоких значениях Load Average, чем в системах без него. Подробнее про явление гипертрединга, его плюсы и минусы и особенности влияния мы поговорим в одной из следующих статей.
Подводя итог
Load Average — это более сложный и информативный показатель для оценки системной нагрузки по сравнению с простым процентом загрузки CPU. Он учитывает не только текущую активность CPU, но и процессы, ожидающие выполнения, а также другие важные аспекты, такие как операции ввода-вывода. Это делает его незаменимым инструментом для мониторинга и управления производительностью Linux-систем, особенно в условиях высокой нагрузки или на серверах с множеством ядер и гипертредингом.
Если вы хотите почитать по больше про историю этой метрики — советую статью от бесподобного Брендона Грега (или ее перевод, уже публиковавшийся на хабре)
Для тех, кому хочется покопаться в коде ядра и посмотреть как работает эта метрика — велком!
Изучить больше продвинутых аспектов конфигурирования, автоматизации, безопасности и оптимизации систем можно на курсе «Администрирование Linux».
Автор: Hedgehog_art