MAATRIX / Блог / Load average 100 — это катастрофа или норма: что число значит на самом деле

Load average 100 — это катастрофа или норма: что число значит на самом деле

MAATRIX

Видите в uptime число вроде «load average: 42.00, 38.50, 35.10» и не понимаете, паниковать или нет. Первая реакция — это же явно больше 100% CPU, сервер сейчас упадёт. На деле load average — это не проценты и вообще не про процессор напрямую, а про очередь: сколько процессов ждут своей возможности выполниться или зависли в ожидании диска. Ниже разберём, что это число реально считает, почему одно и то же значение может быть нормой на одной машине и катастрофой на другой, и как быстро найти, кто именно создаёт нагрузку.

Что на самом деле считает load average

Load average — это среднее число процессов, которые находятся в состоянии «runnable» (готовы выполняться и ждут ядро) плюс процессы в состоянии D — uninterruptible sleep, обычно ожидание диска или другого блокирующего ввода-вывода. Ядро Linux берёт этот срез каждые несколько секунд и усредняет по трём окнам — 1, 5 и 15 минут. Отсюда и три числа в выводе uptime или cat /proc/loadavg:

$ cat /proc/loadavg
42.15 38.72 35.03 12/487 28931

Первые три числа — те самые средние за 1/5/15 минут. Четвёртое поле (12/487) — сейчас выполняется/запущено всего процессов и потоков, пятое — PID последнего созданного процесса. Ключевой момент: в очередь, которую измеряет load average, попадают не только процессы, реально грузящие процессор, но и процессы, зависшие в D-состоянии — то есть ждущие диск, сеть NFS, медленное блочное устройство. Именно поэтому нельзя читать load average как «загрузка CPU в процентах» — это исторически прижившееся, но неверное толкование.

Второе отличие от привычного %CPU в top: load average — не мгновенный снимок, а скользящее среднее с экспоненциальным затуханием, похожее по духу на то, как считается средняя скорость на спидометре с инерцией. Резкий всплеск на 10 секунд почти не сдвинет 15-минутное значение, а вот 1-минутное отреагирует быстро. Если все три числа растут одновременно — нагрузка нарастает и держится. Если 1-минутное значение намного выше 15-минутного — это свежий всплеск, возможно, уже проходящий. Если наоборот, 15-минутное выше 1-минутного — пик уже прошёл, система успокаивается.

Почему это не «проценты CPU» и как с ним ошибаются

Путаница растёт из привычки к метрикам вроде CPU usage в панелях мониторинга, где 100% — это явный потолок. Load average потолка не имеет вообще: число 0 значит «очередь пуста», а число 500 значит «в очереди было в среднем 500 процессов» — и оно в принципе не ограничено сверху количеством ядер. Сравнивать load average с процентом CPU из top — то же самое, что сравнивать длину очереди в кассу с загрузкой конкретного кассира: связанные вещи, но не одна и та же метрика.

Отсюда вторая частая ошибка — судить о критичности числа без контекста. Load average 8 — это ни о чём не говорит само по себе. На сервере с одним ядром это означает, что в среднем восемь процессов ждали своей очереди на единственное ядро — почти наверняка сервер тормозит на глазах у пользователей. На сервере с 32 ядрами то же самое число 8 означает, что четверть мощности используется — совершенно спокойная ситуация, возможно, даже недогруженная машина.

Поэтому единственный корректный способ читать load average — соотносить его с числом логических ядер (nproc), а не с абсолютным порогом вроде «выше 5 — плохо». Это правило работает независимо от того, VPS у вас на пару ядер или выделенный сервер на сотни потоков — методика диагностики одна и та же, различается только масштаб цифр.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать VPS

Как соотнести число с количеством ядер

Узнать число логических ядер:

$ nproc
8

Грубое эмпирическое правило, которым пользуются многие инженеры: пока load average держится в районе числа ядер или ниже — процессор в целом справляется, очередь не копится. Когда среднее заметно превышает число ядер — значит, в среднем процессы стоят в очереди дольше, чем выполняются, и это уже повод разбираться, кто грузит систему. Это именно ориентир, а не жёсткий порог с научным обоснованием — реальная граница «нормально/ненормально» зависит от типа нагрузки, приоритетов процессов и от того, насколько чувствительны к задержке ваши сервисы.

Отсюда и ответ на вопрос из заголовка. Load average 100 на сервере с 256 логическими ядрами — это примерно 40% условной загрузки очереди, вполне рабочая ситуация под серьёзную нагрузку, особенно если число стабильно, а не растёт лавинообразно. То же самое load average 100 на сервере с 4 ядрами — это в 25 раз больше числа ядер, и это уже авария: процессы стоят в очереди в буквальном смысле десятками, отклик сервиса просядёт очень заметно, а часть запросов может уйти в таймаут.

Важный нюанс с виртуализацией и контейнерами: если у вас VPS с ограничением по vCPU внутри более крупного физического хоста, nproc покажет именно выделенные вам ядра — это и есть база для сравнения, а не физическое число ядер хоста. А в Docker-контейнере с --cpus load average вообще считается для всей хостовой системы, а не для cgroup контейнера — внутри контейнера это число может вводить в заблуждение ещё сильнее, потому что не отражает именно ваш лимит.

CPU-bound и IO-bound: почему одна и та же цифра означает разное

Здесь возвращаемся к тому, что load average считает не только процессы, реально занимающие процессор (R — running/runnable), но и процессы в D — uninterruptible sleep. Это разные по природе проблемы, и путать их — терять время на диагностике.

CPU-bound нагрузка: много процессов реально считают что-то на процессоре — рендеринг, шифрование, сборка, тяжёлые запросы к базе с полным сканированием таблиц. Тут load average растёт вместе с %CPU в top, ядра действительно заняты вычислениями, и iowait в том же top остаётся низким.

IO-bound нагрузка: процессы не считают, а ждут — медленный диск, сетевой сторедж вроде NFS, зависшая на морском дне SAN-полка, файловая система, упёршаяся в лимит IOPS. Такие процессы попадают в D-состояние: они не могут быть прерваны сигналом, потому что ядро ждёт ответа от устройства. Пока процесс висит в D, он засчитывается в load average наравне с процессом, который реально грузит ядро — хотя сам процессор в этот момент может простаивать почти полностью. Отличительный признак такой ситуации — высокий load average при низкой загрузке CPU и заметном iowait.

Это самая частая причина, почему «load average подскочил, а top показывает, что процессор свободен» — на первый взгляд парадокс, но на деле это явный сигнал: ищите не процессор, а диск, сеть или файловую систему.

Практика: кто создаёт нагрузку

Порядок действий, который экономит время — сначала понять, CPU это или IO, потом найти конкретный процесс.

Быстрый снимок общей картины:

$ top

В шапке top смотрите на строку %Cpu(s) — если высокий us (user) или sy (system) — это CPU-bound история, ищите процесс по %CPU в списке ниже. Если высокий wa (iowait) — процессор ждёт диск, дело в IO.

Топ процессов по потреблению CPU без интерактивного режима, удобно для логов и скриптов:

$ ps aux --sort=-%cpu | head -15

Аналогично по памяти, если подозреваете, что дело не в CPU, а в свопинге:

$ ps aux --sort=-%mem | head -15

Найти процессы именно в D-состоянии — это прямые кандидаты на IO-bound проблему:

$ ps -eo pid,ppid,stat,pcpu,pmem,etime,cmd | awk '$3 ~ /D/'

Если такие процессы есть и не пропадают за несколько повторных запусков команды — они реально застряли на ожидании ввода-вывода, а не просто мелькнули между снимками.

Посмотреть, что происходит на уровне очереди планировщика и памяти в динамике:

$ vmstat 1 5

Колонка r — число процессов, реально готовых выполняться (runnable queue), колонка b — число процессов, заблокированных в uninterruptible sleep. Если b заметно больше r — вы имеете дело с IO-bound ситуацией, и дальше нужно смотреть именно на диски.

Детальная картина по дисковым устройствам:

$ iostat -xz 1 5

Здесь важны колонки %util (насколько устройство занято обслуживанием запросов) и await (среднее время ожидания запроса, включая время в очереди). Устройство с %util, стабильно близким к максимуму, и растущим await — это и есть источник D-состояний, которые раздувают load average.

Если сервер под управлением systemd, полезно также свериться с systemd-cgtop — он покажет потребление ресурсов по группам служб (cgroups), что удобно, когда на машине крутится десяток сервисов и непонятно, какой именно расходится.

Когда число вводит в заблуждение

Несколько ситуаций, где голое число load average без контекста обманывает:

  • Контейнеры и cgroup-лимиты. Внутри Docker или Kubernetes load average, который видит процесс через /proc/loadavg, — это load average хоста целиком, а не вашего контейнера. Контейнер может быть жёстко ограничен по CPU через cgroup и throttled, а load average при этом покажет спокойную цифру хоста — метрика просто не про ваш лимит.
  • Гипертрединг и виртуальные ядра. nproc считает логические потоки (включая hyperthreading/SMT), а не физические ядра. Это корректная база для сравнения с load average — планировщик ОС действительно раскладывает процессы по логическим потокам, — но не путайте эту цифру с «числом настоящих ядер», если сравниваете конфигурации серверов между собой.
  • Кратковременные всплески vs устойчивая нагрузка. Одиночный скачок 1-минутного значения при спокойных 5- и 15-минутных — обычно неопасен: это могла быть разовая тяжёлая задача (бэкап, пересборка индекса), которая уже завершается. Тревожный сигнал — рост во всех трёх окнах одновременно.
  • NFS и сетевые файловые системы. Зависший NFS-монтирование способно держать процессы в D очень долго — иногда пока не восстановится сеть или не перемонтируется ресурс, — и в это время load average будет расти без какой-либо видимой нагрузки на CPU или локальный диск.
  • Планировщики задач и cron. Пачка cron-заданий, запущенных одновременно (классика — все в 00:00 или на границе часа), может кратковременно поднять 1-минутное значение просто потому, что несколько процессов стартовали разом, а не потому что что-то сломалось.

Если на сервере регулярно случаются такие всплески и разбираться в них вручную надоедает, стоит поставить постоянный сбор метрик — тогда видно не разовое число, а тренд. О том, как быстро найти конкретный процесс, съедающий ресурсы, подробнее написано в статье как узнать, кто нагружает сервер, а если подозрение падает именно на процессор — в разборе высокая нагрузка на процессор: как найти причину. Когда картина указывает на диск, а не на CPU, логично сразу проверить его отдельно — как это сделать, описано в статье медленный диск на VPS: как проверить. А если жалоба звучит просто как «сайт тормозит» и непонятно, с чего начать диагностику вообще, есть отдельный разбор сайт тормозит на VPS: диагностика.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать VPS

Нужны сами нейросети для контента?

Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.

Частые вопросы

Какой load average считается нормальным?

Универсального числа нет — ориентируйтесь на соотношение с nproc. Пока среднее держится в районе числа логических ядер или ниже, обычно всё в порядке; выше — стоит проверить, растёт ли тренд и какой процесс в очереди.

Почему load average высокий, а top показывает низкую загрузку CPU?

Почти всегда это значит, что процессы стоят не в R (runnable), а в D (uninterruptible sleep) — ждут диск, сеть или другую блокирующую операцию. Смотрите iowait в top и колонку b в vmstat.

Можно ли обнулить или сбросить load average?

Нет, это не счётчик и не флаг — это расчётная величина по текущему состоянию очереди процессов. Она сама «остынет», когда причина нагрузки исчезнет; принудительно сбросить её нельзя и не нужно.

Load average считается по физическим или логическим ядрам?

По логическим — планировщик Linux распределяет процессы между тем, что видно в nproc, включая потоки от Hyper-Threading/SMT. Именно это число и стоит использовать для сравнения.

Почему в контейнере load average не совпадает с моими ожиданиями от лимита CPU?

Потому что /proc/loadavg внутри контейнера показывает состояние хоста целиком, а не cgroup-лимит конкретного контейнера. Для диагностики именно внутри контейнера полезнее смотреть на docker stats или метрики оркестратора, а не на /proc/loadavg.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →