Средняя загрузка (load average, la)

В вычислениях UNIX загрузка системы (system load) является мерой объема вычислительной работы, которую выполняет компьютерная система. Средняя загрузка (load average) представляет собой среднюю загрузку системы за период времени. Обычно она представлена в виде трех чисел, которые представляют нагрузку на систему в течение последних одно-, пяти- и пятнадцатиминутных периодов.

Расчет нагрузки в стиле Unix

Все Unix и Unix-подобные системы генерируют безразмерную метрику из трех load average чисел в ядре. Пользователи могут легко запросить текущий результат из оболочки Unix, выполнив команду uptime:

$ uptime
 14:34:03 up 10:43,  4 users,  load average: 0.06, 0.11, 0.09

Команды w и top показывают те же три числа средней нагрузки, что и ряд утилит с графическим пользовательским интерфейсом. В Linux к ним также можно получить доступ, прочитав файл /proc/loadavg.

Неактивный компьютер имеет число загрузки 0 (бездействующий процесс не учитывается). Каждый процесс, использующий ЦП или ожидающий его (очередь готовности или очередь выполнения) увеличивает номер загрузки на 1. Каждый завершающийся процесс уменьшает его на 1. Большинство систем UNIX учитывают только процессы в запущенном (на ЦП) или исполняемом (ожидающем ЦП) состоянии. Однако в Linux также есть процессы, находящиеся в непрерывном спящем режиме (обычно ожидающие активности диска), что может привести к заметно разным результатам, если многие процессы остаются заблокированными при вводе-выводе из-за загруженной или остановленной системы ввода-вывода. Это, например, включает блокировку процессов из-за сбоя сервера NFS или слишком медленного носителя (например, запоминающих устройств USB 1.x). Такие обстоятельства могут привести к повышенной средней нагрузке, которая не отражает фактического увеличения использования ЦП (но все же дает представление о том, как долго пользователям придется ждать).

Системы рассчитывают среднюю нагрузку как экспоненциально затухающее взвешенное скользящее среднее числа нагрузки. Три значения средней нагрузки относятся к последней, пяти и пятнадцати минутам работы системы.

С математической точки зрения, все три значения всегда усредняют всю загрузку системы с момента ее запуска. Все они распадаются экспоненциально, но распадаются с разной скоростью: экспоненциально затухают на е через 1, 5 и 15 минут соответственно. Следовательно, 1-минутная средняя нагрузка состоит из 63% (точнее: 1 - 1/е) нагрузки с последней минуты и 37% (1/е) средней нагрузки с момента запуска, исключая последнюю минуту. Для 5- и 15-минутных средних нагрузок такое же соотношение 63%/37% рассчитывается для 5 и 15 минут соответственно. Следовательно, технически неточно, что средняя нагрузка за 1 минуту включает только последние 60 секунд активности, так как она включает 37% активности из прошлого, но правильно сказать, что она включает в себя в основном последнюю минуту.

Интерпретация

Для однопроцессорных систем с ограниченным ЦП можно рассматривать среднюю нагрузку как меру использования системы в течение соответствующего периода времени. Для систем с несколькими процессорами необходимо разделить нагрузку на количество процессоров, чтобы получить сопоставимый показатель.

Например, можно интерпретировать среднюю нагрузку "1.73 0.60 7.98" в однопроцессорной системе как:

  • в течение последней минуты система была перегружена в среднем на 73% (1,73 рабочих процесса, так что 0,73 процесса должны были ждать своей очереди для системы с одним ЦП в среднем)
  • в течение последних 5 минут ЦП простаивал в среднем 40% времени
  • в течение последних 15 минут система была перегружена в среднем на 698% (7,98 рабочих процессов, так что 6,98 процессов должны были ждать своей очереди для одной системы ЦП в среднем)

Это означает, что эта система (ЦП, диск, память и т. д.) могла бы выполнить всю работу, запланированную на последнюю минуту, если бы она была в 1,73 раза быстрее.

В системе с четырьмя процессорами средняя загрузка 3,73 означает, что в среднем 3,73 процесса готовы к запуску, и каждый из них может быть запланирован для ЦП.

В современных системах UNIX обработка потоков по отношению к средней нагрузке различается. Некоторые системы рассматривают потоки как процессы для целей расчета средней нагрузки: каждый поток, ожидающий запуска, добавляет 1 к нагрузке. Однако другие системы, особенно системы, реализующие так называемую многопоточность M:N (M:N threading), используют разные стратегии, такие как подсчет процесса ровно один раз для загрузки (независимо от количества потоков) или подсчет только потоков, открытых в данный момент пользовательским планировщиком потоков к ядру, который может зависеть от уровня конкурентности, установленного для процесса. Linux, похоже, считает каждый поток отдельно как добавление 1 к нагрузке.

Загрузка ЦП против утилизации ЦП

Сравнительное исследование различных показателей нагрузки показало, что информация о загрузке ЦП, основанная на длине очереди ЦП, намного лучше справляется с балансировкой нагрузки по сравнению с утилизацией ЦП. Причина, по которой длина очереди ЦП лучше, вероятно, состоит в том, что, когда хост сильно загружен, его утилизация ЦП, вероятно, будет близка к 100%, и она не может отражать точный уровень загрузки. Напротив, длина очереди ЦП может напрямую отражать величину нагрузки на ЦП. Например, две системы, одна с 3, а другая с 6 процессами в очереди, с большой вероятностью будут иметь коэффициент использования, близкий к 100%, хотя они, очевидно, различаются.

Расчет загрузки процессора

В системах Linux средняя загрузка не рассчитывается для каждого такта, а определяется значением переменной, которое основано на настройке частоты HZ и проверяется на каждом такте. Этот параметр определяет тактовую частоту ядра в герцах (раз в секунду) и по умолчанию равен 100 для тактов 10 мс. Действия ядра используют это количество тактов для определения времени. В частности, функция timer.c::calc_load(), которая вычисляет среднюю нагрузку, запускается каждые LOAD_FREQ = (5*HZ+1) тактов или примерно каждые пять секунд:

unsigned long avenrun[3];

static inline void calc_load(unsigned long ticks)
{
   unsigned long active_tasks; /* fixed-point */
   static int count = LOAD_FREQ;

   count -= ticks;
   if (count < 0) {
      count += LOAD_FREQ;
      active_tasks = count_active_tasks();
      CALC_LOAD(avenrun[0], EXP_1, active_tasks);
      CALC_LOAD(avenrun[1], EXP_5, active_tasks);
      CALC_LOAD(avenrun[2], EXP_15, active_tasks);
   }
}

Массив avenrun содержит 1-минутное, 5-минутное и 15-минутное среднее значение. Макрос CALC_LOAD и связанные с ним значения определены в sched.h:

#define FSHIFT   11		/* nr of bits of precision */
#define FIXED_1  (1<<FSHIFT)	/* 1.0 as fixed-point */
#define LOAD_FREQ (5*HZ+1)	/* 5 sec intervals */
#define EXP_1  1884		/* 1/exp(5sec/1min) as fixed-point */
#define EXP_5  2014		/* 1/exp(5sec/5min) */
#define EXP_15 2037		/* 1/exp(5sec/15min) */

#define CALC_LOAD(load,exp,n) \
   load *= exp; \
   load += n*(FIXED_1-exp); \
   load >>= FSHIFT;

"Выборочное" вычисление средних значений нагрузки - довольно распространенное поведение; FreeBSD тоже обновляет значение каждые пять секунд. Интервал обычно не является точным, чтобы они не собирали процессы, запуск которых запланирован на определенный момент.

Другие команды производительности системы

Другие команды для оценки производительности системы включают:

  • uptime - надежность системы и средняя нагрузка
  • top - для общего обзора системы
  • vmstat - vmstat сообщает информацию о запущенных или заблокированных процессах, памяти, подкачке страниц, блочном вводе-выводе, ловушках и ЦП.
  • htop - интерактивный просмотрщик процессов
  • dstat - помогает сопоставить все существующие данные ресурсов для процессов, памяти, подкачки, блочного ввода-вывода, ловушек и активности ЦП.
  • iftop - интерактивный просмотрщик сетевого трафика для каждого интерфейса
  • nethogs - интерактивный просмотрщик сетевого трафика для каждого процесса
  • iotop - интерактивная программа просмотра ввода-вывода
  • iostat - для статистики ввода-вывода хранилища
  • netstat - для сетевой статистики
  • mpstat - для статистики процессора
  • tload - график средней нагрузки для терминала
  • xload - график средней нагрузки для X
  • /proc/loadavg - текстовый файл со средней загрузкой

Читайте также:

Комментарии

Популярные сообщения из этого блога

Язык поисковых запросов в Graylog

Хэш-таблица: разрешение коллизий

Нормальные формы, пример нормализации в базе данных