Load average: сколько задач ждёт процессор и диск
Среднее число задач, которые работают или ждут процессор (R) и ждут ядро (D), за 1, 5 и 15 минут.
Шпаргалка
8 команд Версия для печати-
uptimeload за 1, 5 и 15 минут -
nprocчисло процессоров для сравнения -
cat /proc/loadavgте же числа + задачи в R / всего -
topload и строка %Cpu(s) -
vmstat 1 5r — ждут CPU, b — ждут диск -
ps -eo stat,pid,pcpu,comm --sort=-pcpu | headкто ест CPU -
ps -eo stat,pid,wchan:30,cmd | awk '$1 ~ /^D/'кто в D -
cat /proc/pressure/cpuдоля времени ожидания CPU
Обзор
Load average — среднее число задач, которые хотят
работать: выполняются или ждут свободный процессор (состояние R) и ждут,
пока ядро закончит для них операцию (состояние D). uptime, top и w
печатают три числа — среднее за 1, 5 и 15 минут:
Load считается в задачах, процентов в нём нет. Сравнивай его с числом
процессоров из nproc. На одном процессоре 1.00 значит «занят всё время,
очереди нет», а 2.90 — в среднем почти три задачи хотели работать разом. На
восьми процессорах те же 2.90 — свободная машина.
Три числа
Это скользящие средние: 1-минутное быстро откликается на перемены,
15-минутное сглаживает их. По трём числам видно направление: 2.90, 1.43,
0.57 — нагрузка выросла в последние минуты, 0.30, 1.50, 2.80 — спадает.
Новое значение число догоняет постепенно. Две задачи, которые занимают процессор ровно минуту, поднимут 1-минутное число примерно до 1.3, а до 2 оно дойдёт через несколько минут. Короткий всплеск на 15-минутном числе почти не виден.
Кто входит в load: R и D
Ядро каждые 5 секунд пересчитывает задачи в двух состояниях. Задача — это каждый поток: программа с восемью занятыми потоками добавит 8.
| Состояние | Что делает задача | В load |
|---|---|---|
R |
выполняется или стоит в очереди к процессору | да |
D |
непрерывный сон: ждёт операцию ядра — диск, файловую систему, сеть NFS | да |
S |
спит до события: ввода, пакета, таймера | нет |
T, Z, I |
остановлена, зомби, простаивающий поток ядра | нет |
Состояние видно в столбце STAT у ps и S у top (см. processes).
Состояние D
Процесс в непрерывном сне ждёт, пока ядро
закончит операцию за него: чтение с диска, запись в файловую систему, ответ
сервера NFS. Сигналы он получит только после конца ожидания — даже kill -9:
Здесь файловую систему заморозили командой fsfreeze -f, и каждая запись в
неё ждёт разморозки. Столбец WCHAN — функция ядра, в которой спит процесс.
Процессор такие задачи не тратят, а load растёт на единицу за каждую.
Разморозили (fsfreeze -u) — процесс 2147 сразу завершился: отложенный
SIGKILL сработал.
Load и загрузка процессора
Load говорит, сколько задач хотят работать. Строка %Cpu(s) в top говорит,
чем занят процессор. Вместе они различают две беды на машине с одним
процессором:
| Что видно | Задачи | %Cpu(s) |
Что происходит |
|---|---|---|---|
| load растёт к 2 | две в R по 48.8 % |
100.0 us, 0.0 id |
две задачи делят один процессор |
| load 2.90 | три в D |
0.0 us, 90.9 id, 0.0 wa |
задачи ждут, процессор свободен |
Поля строки %Cpu(s) — доли времени процессора за последний интервал:
| Поле | Что значит |
|---|---|
us |
код программ |
sy |
ядро по просьбе программ: системные вызовы, ввод-вывод |
ni |
программы с пониженным приоритетом nice |
id |
простой |
wa |
простой, пока кто-то ждёт ответа диска (iowait) |
st |
steal: процессор был нужен ВМ, а гипервизор отдал его другим машинам |
Приоритет процесса понижают командами nice и renice (см.
приоритет nice), его доля и попадает в ni.
wa учитывает только ожидание устройства. В примере выше три процесса в D
ждут разморозки файловой системы и к диску не обращаются, поэтому wa —
0.0. Когда процесс ждёт сам диск, wa растёт: при записи dd … oflag=direct
на этой же машине vmstat показал wa 82. При этом wa — тоже простой:
задача, которой нужен процессор, забирает это время, и wa падает к нулю,
хотя диск занят так же.
Откуда берутся числа
uptime, top и системы мониторинга читают файл /proc/loadavg:
Первые три поля — load average. 1/125 — сколько задач в R прямо сейчас и
сколько задач всего. Последнее поле — PID последнего созданного процесса.
Давление: /proc/pressure
Load складывает ожидание процессора и ожидание ядра в одно число. Файлы
/proc/pressure/cpu, io и memory (PSI, pressure stall information)
разделяют их. Так выглядит cpu, когда две задачи stress-ng --cpu 2 делят
один процессор:
some avg10=64.78 — 64.78 % последних 10 секунд хотя бы одна задача ждала
процессор; avg60 и avg300 — то же за минуту и за 5 минут. full в io и
memory — доля времени, когда ждали все работающие задачи сразу. Для cpu
на уровне всей машины full всегда 0.
Рецепты
3Найти, на чём ждут процессы в D
Стек читается снизу вверх: системный вызов openat, просьба о записи в
точку монтирования (mnt_want_write), ожидание: процесс ждёт файловую
систему. Если в стеке функции nfs_ или rpc_, ждёт сервер NFS; какие ФС
смонтированы по сети — findmnt -t nfs,nfs4,cifs.
Следить за load в динамике
В vmstat столбец r — задачи в R (работают и ждут процессор), b —
задачи, которые ждут диск. Столбцы целиком — в system-monitoring.
Неполадки
5Load высокий, а процессор свободен
В top — 90.9 id, а load на одном процессоре 2.90. Значит, задачи в D.
Найди их (ps … | awk '$1 ~ /^D/', рецепт выше) и посмотри, чего они ждут:
waвысокий, вvmstatрастётb— ждут диск: какой диск и какой процесс, покажутiostat -xиsudo pidstat -d 1(см. pidstat-iostat);wa0,b0 — ждут что-то кроме устройства: замороженную ФС, сервер NFS, блокировку в ядре. Стек — в/proc/<pid>/stack.
Задача, которая висит в D дольше порога kernel.hung_task_timeout_secs
(120 секунд в Ubuntu), попадает в журнал ядра. Здесь порог уменьшили до 20:
Процесс в D не завершается от kill -9
Сигнал ждёт конца операции ядра. Убирай причину ожидания: верни диск или
сервер NFS, разморозь ФС (sudo fsfreeze -u <точка>). После этого процесс
сам получит отложенный сигнал. Если устройство пропало насовсем, процесс
останется в D до перезагрузки.
Load 1.00 на одном процессоре — это много?
Нет очереди: процессор занят всё время, и никто не ждёт. Тормозить начинает,
когда load долго держится выше nproc и в vmstat столбец r больше числа
процессоров. Короткий всплеск 1-минутного числа при спокойном 15-минутном —
обычная работа.
В контейнере load как у всей машины
/proc/loadavg один на всё ядро: uptime внутри контейнера показывает load
хоста со всеми его контейнерами. Нагрузку одного контейнера смотри
docker stats (см. docker).
Высокий st на виртуальной машине
st (steal) — процессор был нужен ВМ, а гипервизор отдал его другим машинам.
Load при этом растёт: задачи стоят в очереди дольше. Внутри ВМ это не
лечится — нужен свободный процессор на хосте.
Термины
2- состояние D (непрерывный сон) state D (uninterruptible sleep)
- Процесс ждёт, пока ядро закончит операцию за него: ввод-вывод диска, запись в файловую систему, ответ сервера NFS. Сигналы, даже SIGKILL, подействуют только после конца ожидания. Входит в load average. Ещё встречается в: dmesg, Процессы, Мониторинг системы: с чего начать, когда сервер тормозит, kill и ещё 6
- iowait (ожидание ввода-вывода)
- Простой процессора, пока хотя бы один процесс ждёт ответа диска: wa в top и vmstat, %iowait в iostat и mpstat. Это вид простоя: если процессору есть другая работа, wa падает до нуля, хотя диск по-прежнему занят. Ещё встречается в: Мониторинг системы: с чего начать, когда сервер тормозит
См. также
- uptime-who —
uptime,wи кто вошёл в систему. - top — load, строка
%Cpu(s)и процессы в одном окне. - processes — состояния, сигналы и приоритет
nice. - system-monitoring — порядок разбора «сервер тормозит».
- kill — сигналы, которые процесс в
Dполучит позже. - docker — лимиты CPU и памяти контейнера.
- stress-ng — нагрузка на процессор для опытов с load.
Есть неточность? Сообщить об ошибке в статье