Linux

Почему происходит высокая загрузка ЦП при низкой средней нагрузке?

Мы столкнулись со странным поведением, когда мы видим высокую загрузку процессора, но довольно низкую среднюю нагрузку. Это поведение лучше всего иллюстрируют следующие графики из нашей системы мониторинга.

CPU usage and load

Примерно в 11:57 загрузка процессора увеличивается с 25% до 75%. Средняя нагрузка существенно не меняется. Мы используем серверы с 12 ядрами с 2 гиперпотоками на каждом. ОС воспринимает это как 24 процессора.

Данные об использовании ЦП собираются путем выполнения /usr/bin/mpstat 60 1 каждую минуту. Данные для строки all и столбца %usr показаны на графике выше. Я уверен, что здесь показаны средние данные по каждому процессору, а не «суммарная» загрузка. Хотя мы видим 75% использования на графике, мы видим процесс, который использует около 2000% «стекированного» CPU сверху.

Средний показатель нагрузки берется из /proc/loadavg каждую минуту.

uname -a дает:

Linux ab04 2.6.32-279.el6.x86_64 #1 SMP Wed Jun 13 18:24:36 EDT 2018 x86_64 x86_64 x86_64 GNU/Linux

 Linux dist - Red Hat Enterprise Linux Server release 6.3 (Santiago).

 Мы запускаем пару веб-приложений Java при довольно высокой нагрузке на машины, примерно 100 запросов/с на машину.

Если я правильно интерпретирую данные о загрузке процессора, когда мы имеем 75% загрузки процессора, это означает, что наши процессоры выполняют процесс в среднем 75% времени. Однако, если наши процессоры заняты 75% времени, не должны ли мы видеть более высокую среднюю нагрузку? Как процессоры могут быть заняты на 75%, в то время как у нас всего 2-4 задания в очереди на выполнение?

Правильно ли мы интерпретируем наши данные? Что может вызвать такое поведение?

Ответ 1

По крайней мере, в Linux среднее значение нагрузки и загрузка процессора это две разные вещи. Средняя нагрузка это измерение того, сколько задач ожидает своей очереди на выполнение в ядре (не только процессорное время, но и дисковая активность) в течение определенного периода времени. Использование процессора это мера того, насколько занят процессор в данный момент. Наибольшая нагрузка, которую может «внести» один поток ЦП, работающий на 100% в течение одной минуты, равна 1. 4-ядерный ЦП с гиперпоточностью (8 виртуальных ядер), работающий на 100% в течение 1 минуты, внесет 8 вкладов в среднюю нагрузку за 1 минуту.

Часто эти два числа коррелируют друг с другом, но нельзя считать их одним и тем же. Вы можете иметь высокую нагрузку с почти 0% использования процессора (например, когда у вас много данных ввода-вывода, находящихся в состоянии ожидания), и вы можете иметь нагрузку 1 и 100% CPU, когда у вас есть однопоточный процесс, работающий на полную мощность. Также в течение коротких периодов времени вы можете видеть процессор на уровне, близком к 100%, но нагрузка все еще ниже 1, потому что средние метрики еще не «догнали».

Я видел сервер с нагрузкой более 15 000 (да, это не опечатка) и % CPU почти 0%. Это произошло из-за проблем с общим ресурсом Samba, и многие клиенты ожидали своей очереди в состоянии ожидания ввода-вывода. Если вы регулярно наблюдаете высокие показатели нагрузки без соответствующей активности процессора, скорее всего, у вас есть какие-то проблемы с хранилищем. Для виртуальных машин это также может означать, что другие виртуальные машины сильно конкурируют за ресурсы хранения на одном и том же узле.

Высокая нагрузка также необязательно является чем-то плохим, чаще всего это означает, что система используется на полную мощность или, возможно, не в состоянии справиться с нагрузкой (если число нагрузки превышает число ядер процессора). В одном месте, где я работал сисадмином, у них был человек, который следил за средней нагрузкой на их основную систему ближе, чем Nagios. После проверки я обычно отвечал, что система просто выполняет свою работу. Конечно, это было то же самое место, где нагрузка превышала 15 000 (хотя это был не тот же самый сервер), так что иногда это действительно означает, что что-то не так. Вы должны учитывать назначение вашей системы. Если это рабочая площадка, то ожидайте, что нагрузка будет естественно высокой.

Ответ 2

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

Точная формула расчета средней нагрузки такова: loadvg = выполняющиеся задачи + ожидающие задачи (для ядер) + заблокированные задачи.

Вы можете определенно иметь хорошую пропускную способность и приблизиться к среднему значению нагрузки 24, но без штрафа на время обработки задач. С другой стороны, вы также можете иметь 2-4 периодические задачи, которые не завершаются достаточно быстро, тогда вы увидите, что количество ожидающих задач (для циклов процессора) растет, и в конечном итоге вы достигнете высокой средней нагрузки. Еще одна вещь, которая может произойти, задачи, выполняющие синхронные операции ввода-вывода, блокируют ядро, снижая пропускную способность и увеличивая очередь ожидающих задач (в этом случае вы можете увидеть изменение метрики iowait).

Ответ 3

Сценарий здесь не особенно неожиданный, хотя и немного необычный. Хотя Linux (по умолчанию) и большинство разновидностей Unix реализуют вытесняющую многозадачность, на правильно настроенной машине задачи редко вытесняются. Каждой задаче отводится определенное время на доступ к процессору; задача вытесняется, только если превышает это время и есть другие задачи, ожидающие выполнения (обратите внимание, что load сообщает о среднем количестве процессов в процессоре и ожидающих выполнения). В большинстве случаев процесс скорее завершится, чем будет прерван.

(В общем случае вам нужно беспокоиться о нагрузке только тогда, когда она приближается к количеству CPU, т. е. когда планировщик начинает вытеснять задачи).

Если наши процессоры заняты 75% времени, не должны ли мы видеть более высокую среднюю нагрузку?

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

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

Ответ 4

Сначала короткий ответ на вопрос: очевидно, что с 12 до 12:05 процессы, которые обрабатывались CPU, занимали больше времени, чем раньше.

С 11 до 11:55 каждый процесс ОС занимал 25 мс (например) процессорного времени.

С 12 до 12:05 каждый процесс ОС занял 75 мс.

Вот почему средняя нагрузка не изменилась.

Полный ответ: использование процессора и средняя нагрузка описывают состояние двух совершенно разных сущностей.

  1. Использование процессора описывает состояние процессора.

  2. Среднее значение нагрузки не имеет ничего общего с процессором.

  3. Поэтому совершенно неуместно, когда среднее значение нагрузки используется для определения загруженности или простоя процессора.

  4. Это все равно, что пытаться узнать, сколько денег получит человек через прогноз погоды.

  5. Средняя нагрузка описывает процессы в ОС Linux, а не состояние процессора.

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

  7. Если использование процессора = 85%, это означает, что 85 мс процессор был занят, а 15 мс простаивал. Вот и все.

  8. Использование процессора очень похоже на характеристику % занятости жесткого диска.

  9. Средняя нагрузка = 125 за 1 секунду означает, что 125 процессов было обработано процессором или ожидало обработки, или ожидало дисковую подсистему.

  10. Дело в том, что мы не знаем, сколько времени каждый процесс работал на CPU. Мы просто знаем, что они работали в течение некоторого времени.

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

Схожие статьи

Linux

Как предотвратить случайное использование rm -rf ?

Linux

Можно ли отключить доступ к интерактивной оболочке при туннелировании веб-трафика через SSH

Linux

Цикл по содержимому файла в Bash

Linux

Несколько библиотек glibc на одном хосте