Во время технического собеседования в крупную компанию мне задали простой вопрос: что такое Load Average?
Формально ответить несложно — это «средняя загрузка системы за 1, 5 и 15 минут». Но если копнуть глубже, возникает ряд неудобных вопросов:
Что именно усредняется?
С какой частотой происходит измерение?
Какие процессы считаются «ожидающими ресурсы»?
Почему при кратковременных пиках мы не видим резких скачков?
Почему Load Average = 1 соответствует 100% загрузке одноядерной системы?
Если вас интересует не бытовое, а точное техническое понимание, разберёмся детально — с опорой на исходный код ядра Linux.
Что такое Load Average (LA)
В системах Linux и UNIX Load Average — это показатель среднего количества процессов:
находящихся в состоянии RUNNING (исполняются или готовы к выполнению),
находящихся в состоянии UNINTERRUPTIBLE (обычно ожидание I/O).
Три значения, которые показывает команда uptime, соответствуют окнам:
1 минута
5 минут
15 минут
Важно: Load Average — это не процент загрузки CPU.
Это среднее количество активных (или ожидающих) задач.
Для одноядерной системы:
LA = 1 → процессор полностью занят
LA < 1 → процессор простаивает часть времени
LA > 1 → есть очередь процессов
Где «подвох» в стандартном объяснении
1. Это не арифметическое среднее
Если бы LA считался как обычное среднее арифметическое, возникал бы вопрос о частоте дискретизации:
считаем каждую секунду?
каждые 10 мс?
раз в минуту?
Чем выше частота измерения — тем меньше получилось бы среднее значение.
Но в Linux используется экспоненциальное сглаживание, а не классическое среднее.
2. Кто такие «ожидающие ресурсы»?
Согласно исходному коду ядра Linux, учитываются процессы в состояниях:
TASK_RUNNING
TASK_UNINTERRUPTIBLEТо есть:
задачи, выполняющиеся на CPU;
задачи, ожидающие завершения операций ввода-вывода (например, медленный диск или NFS).
Именно поэтому высокий Load Average может быть при низкой загрузке CPU — если система «застряла» на I/O.
Как именно считается Load Average в Linux
Реализация находится в ядре Linux (например, в версии 2.4 — timer.c и sched.h).
Ключевые факты:
Измерение происходит каждые 5 секунд
Используется фиксированная точка (fixed-point arithmetic)
Применяется формула экспоненциального затухания
Константы:
#define LOAD_FREQ (5*HZ) /* интервал 5 секунд */
#define EXP_1 1884 /* коэффициент для 1 минуты */
#define EXP_5 2014
#define EXP_15 2037Формула расчёта
В упрощённом виде:
Lnew=Lold⋅e−Δt/T+n⋅(1−e−Δt/T)L_{new} = L_{old} \cdot e^{-Δt/T} + n \cdot (1 - e^{-Δt/T})Lnew=Lold⋅e−Δt/T+n⋅(1−e−Δt/T)
где:
LLL — текущее значение Load Average
nnn — число активных задач
TTT — окно усреднения (1, 5, 15 минут)
Δt=5Δt = 5Δt=5 секунд
Это дискретная форма экспоненциального сглаживания.
Почему используется экспонента
Формула основана на законе экспоненциального распада:
dLdt=−1T(L−n)\frac{dL}{dt} = -\frac{1}{T}(L - n)dtdL=−T1(L−n)
Смысл:
если процессов больше текущего LA → показатель растёт
если меньше → показатель экспоненциально уменьшается
чем больше окно (15 минут), тем медленнее реакция
Это обеспечивает:
сглаживание кратковременных пиков
устойчивость к «шуму»
предсказуемую динамику
Почему не видно резких скачков?
Представим, что вы запустили 100 коротких процессов.
Логично ожидать, что LA резко взлетит.
Но этого не происходит, потому что:
измерение идёт раз в 5 секунд
используется экспоненциальное сглаживание
старые значения затухают постепенно
Экспонента выполняет роль фильтра низких частот.
Почему LA = 1 означает 100% загрузку одноядерной системы
При постоянном числе процессов nnn:
если n>Ln > Ln>L → LA растёт к n
если n<Ln < Ln<L → LA уменьшается к n
Если на одноядерной системе:
в каждый момент времени активен ровно 1 процесс,
очереди нет,
то система полностью загружена — и LA стабилизируется на 1.
Если LA > 1 — появляется очередь.
Важные нюансы
1. Load Average учитывает I/O
Если процессы ждут диск или NFS, LA растёт, даже если CPU простаивает.
2. На многоядерных системах
Если у вас 8 ядер:
LA = 8 → система полностью загружена
LA > 8 → есть очередь
3. Это не мгновенная метрика
LA показывает тренд, а не текущую загрузку.
Ограничения модели
Экспоненциальная модель предполагает:
плавное изменение нагрузки
отсутствие «жёстких» ограничений пропускной способности
В реальности же:
CPU имеет конечную пропускную способность
I/O может быть узким местом
высокие значения LA не всегда означают CPU-bound систему
Поэтому интерпретировать Load Average нужно вместе с:
tophtopiostatvmstat
Выводы
Load Average — это экспоненциально сглаженное среднее количества активных процессов.
Измерение происходит каждые 5 секунд.
Учитываются процессы в состояниях RUNNING и UNINTERRUPTIBLE.
Это не процент загрузки CPU.
Значение > числа ядер означает наличие очереди.
Главное:
Load Average — это математическая модель сглаживания нагрузки, а не прямой счётчик занятости процессора.
Create an account or sign in to leave a review
There are no reviews to display.