January 19

Углубляемся в load average в среде Linux

Всякий раз, когда заметно замедление работы системы, типичный первый шаг — выполнить команду top или uptime, чтобы определить причину загрузки системы. Например, как показано ниже, команда uptime быстро предоставила результат:

$ uptime
02:34:03 up 2 days, 20:14, 1 user, load average: 0.63, 0.83, 0.88

А знаете ли вы значение каждого столбца в результатах?

Подписывайтесь на канал usr_bin, где я публикую много полезного по Linux, в том числе ссылки на статьи в этом блоге.

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

02:34:03              // текущее время
up 2 days, 20:14      // uptime работы системы
1 user                // количество вошедших в систему пользователей

Последние три цифры представляют load average за последние 1 минуту, 5 минут и 15 минут соответственно.

Средняя нагрузка? Этот термин может быть одновременно знаком и незнаком многим. В этой статье мы разберемся, как отслеживать и понимать этот самый распространенный и важный системный показатель.

Можно подумать, что средняя загрузка — это просто скорость использования CPU в единицу времени. Например, средняя загрузка 0,63 означает скорость использования CPU 63%. На самом деле это не так.

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

Запущенные процессы — это те, которые либо используют процессор, либо ждут процессорного времени. Это процессы, которые вы обычно видите вы выводе команды ps в состоянии R (Running или Runnable).

Непрерываемые процессы — это те, которые находятся в критическом процессе ядра и не могут быть прерваны. Наиболее распространенным примером являются процессы, ожидающие ответов ввода-вывода от аппаратных устройств, которые отображаются в состоянии D (Uninterruptible Sleep или Disk Sleep) в выводе команды ps.

Например, когда процесс считывает или записывает данные на диск, он не может быть прерван, пока не получит ответ от диска, чтобы обеспечить согласованность данных. Если процесс будет прерван в это время, это может привести к несогласованности данных между диском и процессом.

Таким образом, состояние непрерывности фактически является механизмом защиты процессов и аппаратных устройств со стороны системы.

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

Поскольку среднее значение — это число активных процессов, идеальным сценарием было бы иметь ровно один процесс, работающий на каждом CPU, чтобы каждый CPU был полностью использован. Например, что означает, когда средняя нагрузка равна 2?

  • В системе 2 CPU это означает, что все CPU полностью заняты.
  • В системе с 4 CPU это означает, что 50% мощности CPU простаивает.
  • А в системе только с одним ЦП это означает, что половина процессов конкурируют за процессорное время.

Какова разумная средняя нагрузка?

После объяснения того, что такое средняя нагрузка, давайте вернемся к примеру, с которого мы начали. Можете ли вы судить по выходным данным команды, uptime какой диапазон значений средней нагрузки будет указывать на высокую загрузку системы или, наоборот, на очень низкую загрузку системы?

Мы знаем, что идеальная ситуация для средней нагрузки — это когда она равна количеству CPU. Поэтому при оценке средней нагрузки первое, что вам нужно знать, — это количество CPU в системе, которое можно получить из вывода команды top или прочитав файл /proc/cpuinfo, например:

$ grep 'model name' /proc/cpuinfo | wc -l
2

Зная количество CPU, мы можем определить, что когда средняя нагрузка превышает количество CPU, система перегружена.

Однако возникает другой вопрос: на какое из трех средних значений нагрузки следует ориентироваться?

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

  • Если значения за 1 минуту, 5 минут и 15 минут схожи или существенно не отличаются, это указывает на то, что загрузка системы стабильна.
  • Если значение за 1 минуту значительно ниже значения за 15 минут, это говорит о том, что нагрузка за последнюю минуту снизилась, тогда как за последние 15 минут наблюдалась значительная нагрузка.
  • И наоборот, если значение за 1 минуту намного выше значения за 15 минут, это указывает на то, что нагрузка за последнюю минуту увеличилась. Это увеличение может быть временным или может продолжать увеличиваться, поэтому необходимо постоянное наблюдение. Как только средняя нагрузка за 1 минуту приближается или превышает количество CPU, это означает, что система испытывает перегрузку. В этот момент необходимо проанализировать и оптимизировать причину проблемы.

Вот еще один пример: предположим, что мы видим средние нагрузки 1,73, 0,60 и 7,98 на системе с одним CPU. Это означает, что система была перегружена на 73% за последнюю минуту и ​​на 798% за последние 15 минут. Однако общая тенденция показывает снижение нагрузки на систему.

На какой уровень средней нагрузки следует обращать внимание в реальных боевых условиях?

Когда средняя нагрузка превышает 70% от числа CPU, следует проанализировать и исследовать проблемы высокой нагрузки. Высокая нагрузка может привести к замедлению реакции процессов, тем самым влияя на нормальное функционирование служб.

Однако цифра 70% не является абсолютной. Рекомендуемый подход — отслеживать среднюю загрузку системы и оценивать тенденцию нагрузки на основе большего количества исторических данных. Когда вы замечаете значительное увеличение нагрузки, например, удвоение нагрузки, наступает время для анализа и исследования.

Средняя нагрузка в зависимости от использования CPU

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

Вы можете задаться вопросом: поскольку средняя загрузка отражает количество активных процессов, разве высокая средняя загрузка не подразумевает высокую загрузку CPU?

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

С другой стороны, использование CPU — это статистика того, насколько CPU занят в единицу времени, и не обязательно напрямую соответствует средней нагрузке. Например:

  • Процессы, интенсивно использующие CPU, увеличат среднюю нагрузку, и в этом случае две метрики будут выравниваться.
  • Процессы, связанные с вводом-выводом и ожидающие ввода-вывода, могут увеличить среднюю нагрузку, но загрузка CPU может быть не очень высокой.
  • Большое количество процессов, ожидающих планирования CPU, также может увеличить среднюю нагрузку, и в этом случае использование CPU также будет относительно высоким.

Пример из практики: понимание средней нагрузки

Рассмотрим три примера, чтобы понять эти три ситуации, и воспользуемся такими инструментами, как iostat, mpstat, pidstat и т. д., чтобы определить основные причины увеличения средней нагрузки.

Поскольку практические примеры основаны на операциях на сервере, лучше не просто читать, но и выполнить операции на вашем окружении

Все приведенные ниже случаи основаны на Ubuntu 18.04, но также применимы к другим системам Linux. Лабораторная среда следующая:

  • Конфигурация машины: 2 CPU, 8 ГБ ОЗУ.
  • Предустановленные пакеты: stress и sysstat, установлены с помощью apt install stress sysstat.

Ниже краткая справка по stress и sysstat.

stress — это инструмент стресс-тестирования системы Linux, который используется для моделирования сценария, в котором средняя нагрузка увеличивается из-за аномальных процессов.

sysstat содержит часто используемые инструменты производительности Linux для мониторинга и анализа производительности системы. Будем использовать две команды из этого пакета: mpstat и pidstat.

  • mpstat — инструмент для анализа производительности многоядерных CPU, используемый для просмотра показателей производительности в реальном времени для каждого CPU и средних показателей для всех CPU.
  • pidstat — инструмент для анализа производительности процессов, используемый для просмотра показателей производительности CPU, памяти, ввода-вывода и переключений контекста для процессов в реальном времени.

Кроме того, для каждого сценария потребуется открыть три терминала и войти в одну и ту же машину Linux.

Сценарий первый: процесс, интенсивно использующий CPU

Сначала мы запускаем stressкоманду в первом терминале, чтобы смоделировать сценарий, в котором загрузка CPU составляет 100%:

$ stress --cpu 1 --timeout 600

Далее во втором запустим uptimeдля просмотра изменений средней нагрузки:

# параметр `-d` означает подсветку изменных значений
$ watch -d uptime
...,  load average: 1.00, 0.75, 0.39

Наконец, в третьем терминале запустим mpstat, чтобы понаблюдать за изменениями в использовании CPU:

# `-P ALL` означает мониторинг всех CPU, а `5` означает, что данные будут выводиться каждые 5 секунд.
$ mpstat -P ALL 5
Linux 4.15.0 (ubuntu) 09/22/18 _x86_64_ (2 CPU)
13:30:06     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
13:30:11     all   50.05    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00   49.95
13:30:11       0    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
13:30:11       1  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00

Из терминала два можно видеть, что средняя нагрузка медленно увеличивается до 1,00 в течение одной минуты. Из терминала три можно видеть, что один CPU действительно загружен на 100%, но его iowait равен 0. Это указывает на то, что увеличение средней нагрузки связано с тем, что CPU загружен на 100%.

Итак, какой процесс вызывает загрузку CPU на 100%? Можно использовать pidstat, чтобы узнать:

# вывод набора данных каждые 5 секунд
$ pidstat -u 5 1
13:37:07 UID PID %usr %system %guest %wait %CPU CPU Command
13:37:12 0 2962 100.00 0.00 0.00 0.00 100.00 1 stress

Отсюда видно, что процесс stress использует 100% ресурсов CPU.

Сценарий два: процесс с интенсивным вводом-выводом

Сначала так же запустим команду stress, но на этот раз имитируем повышенный ввод-вывод, непрерывно выполняя sync:

$ stress -i 1 --timeout 600

Снова во втором терминале запустим, uptime чтобы понаблюдать за изменениями средней нагрузки:

$ watch -d uptime
...,  load average: 1.06, 0.58, 0.37

Затем в третьем терминале запустим, mpstat чтобы понаблюдать за изменениями в использовании CPU:

# `-P ALL` означает мониторинг всех CPU, а `5` означает, что данные будут выводиться каждые 5 секунд.
$ mpstat -P ALL 5 1
Linux 4.15.0 (ubuntu)     09/22/18     _x86_64_    (2 CPU)
13:41:28     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
13:41:33     all    0.21    0.00   12.07   32.67    0.00    0.21    0.00    0.00    0.00   54.84
13:41:33       0    0.43    0.00   23.87   67.53    0.00    0.43    0.00    0.00    0.00    7.74
13:41:33       1    0.00    0.00    0.81    0.20    0.00    0.00    0.00    0.00

Видно, что средняя нагрузка медленно увеличивается до 1,06 за одну минуту. Использование CPU в системе из одного CPU увеличивается до 23,87%, а iowait достигает 67,53%. Это указывает на то, что увеличение средней нагрузки связано с ростом iowait.

Какой процесс вызывает такой высокий iowait? Давайте используем pidstat, чтобы узнать:

# вывод набора данных каждые 5 секунд с использованием флага `-u` для отображения показателей CPU
$ pidstat -u 5 1
Linux 4.15.0 (ubuntu) 09/22/18 _x86_64_ (2 CPU)
13:42:08 UID PID %usr %system %guest %wait %CPU CPU Command
13:42:13 0 104 0.00 3.39 0.00 0.00 3.39 1 kworker/1:1H
13:42:13 0 109 0.00 0.40 0.00 0.00 0.40 0 kworker/0:1H
13:42:13 0 2997 2.00 35.53 0.00 3.99 37.52 1 stress
13:42:13 0 3057 0.00 0.40 0.00 0.00 0.40 0 pidstat

Можно заметить, что это все еще вызвано процессом stress.

Сценарий третий: сценарий с большим количеством процессов

Когда количество запущенных процессов в системе превышает вычислительную мощность CPU, начинаются процессы, ожидающие CPU.

Теперь при помощи stress смоделируем 8 процессов:

$ stress -c 8 --timeout 600

Поскольку в системе всего 2 CPU, что значительно меньше 8 процессов, CPU системы сильно перегружены, средняя нагрузка составляет 7,97:

$ uptime
..., load average: 7.97, 5.93, 3.02

Затем запустим pidstat снова, чтобы увидеть состояние процессов:

# вывод набора данных каждые 5 секунд
$ pidstat -u 5 1
14:23:25 UID PID %usr %system %guest %wait %CPU CPU Command
14:23:30 0 3190 25.00 0.00 0.00 74.80 25.00 0 stress
14:23:30 0 3191 25.00 0.00 0.00 75.20 25.00 0 stress
14:23:30 0 3192 25.00 0.00 0.00 74.80 25.00 1 stress
14:23:30 0 3193 25.00 0.00 0.00 75.00 25.00 1 stress
14:23:30 0 3194 24.80 0.00 0.00 74.60 24.80 0 stress
14:23:30 0 3195 24.80 0.00 0.00 75.00 24.80 0 stress
14:23:30 0 3196 24.80 0.00 0.00 74.60 24.80 1 stress
14:23:30 0 3197 24.80 0.00 0.00 74.80 24.80 1 stress
14:23:30 0 3200 0.00 0.20 0.00 0.20 0.20 0 pidstat

Видно, что 8 процессов конкурируют за 2 CPU, причем каждый процесс ждет CPU до 75% времени (указано столбцом %wait в выводе). Эти процессы, превышая вычислительную мощность CPU, в конечном итоге приводят к его перегрузке.

Заключение

Проанализировав эти три кейса, подведем итог по пониманию средней нагрузки.

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

  • Высокая средняя нагрузка, вероятно, вызвана процессами, интенсивно использующими процессор.
  • Высокая средняя нагрузка не обязательно означает высокую загрузку CPU; она также может указывать на повышенную активность ввода-вывода.
  • При обнаружении высокой нагрузки вы можете использовать такие инструменты, как mpstat, pidstat и т. д., которые помогут проанализировать источник нагрузки.

На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал usr_bin, где будет еще больше полезной информации.