Что означает строка load average в Linux
Что проверяют
Читаете ли вы метрику правильно и не делаете ли вывод про перегруженный процессор там, где сервис упёрся в диск. Для Go-разработчика вопрос обычно переходит в соседний: как это соотносится с числом ядер, GOMAXPROCS и лимитами контейнера.
Как отвечать
Три числа в выводе uptime, top и в файле /proc/loadavg это сглаженные средние за одну, пять и пятнадцать минут от количества задач, которым прямо сейчас нужно работать. Важная особенность Linux: в счёт идут не только задачи в очереди на процессор (состояние R), но и задачи в непрерываемом сне (состояние D), то есть ждущие диск или сетевую файловую систему. Поэтому load average здесь не загрузка процессора, а длина очереди к системе целиком.
Интерпретируется значение только в сравнении с числом ядер, которое покажет nproc. Значение около числа ядер означает плотную занятость, заметно большее значение означает, что задачи стоят в очереди. Соотношение трёх чисел показывает направление: первое сильно больше третьего, нагрузка нарастает прямо сейчас.
Дальше нужна нормальная диагностика: vmstat 1 разделит очередь на процессорную и заблокированную, top покажет долю времени в ожидании ввода-вывода, iostat и pidstat найдут виновника. Высокий load при почти простаивающем процессоре это почти всегда диск или блокирующие вызовы.
Где спотыкаются
Считают load процентом загрузки и делят его на число ядер. Это не доля и сверху ничем не ограничено, на зависшем сетевом хранилище значение уходит в десятки при бездействующем процессоре.
Читают load внутри контейнера и принимают его за нагрузку своего пода. Файл /proc/loadavg не изолирован механизмом cgroup и показывает значение всей ноды. Для сервиса в кластере смотреть надо на троттлинг процессора по cgroup, а GOMAXPROCS выставлять по лимиту, иначе рантайм видит все ядра хоста и плодит лишние потоки.
Забывают про сглаживание. Значения усреднены экспоненциально, поэтому короткий всплеск в них почти не виден, а после снятия нагрузки они спадают медленно. Судить об инциденте по одной цифре из uptime нельзя, нужен ряд во времени.