Linux

Какой правильный способ интерпретации системной нагрузки на 4-ядерный 8-поточный процессор

Как мы все знаем, нагрузка 1.00 на одноядерный процессор означает, что нагрузка составляет 100%. Аналогично, нагрузка 4.00 на четырехъядерном процессоре будет равна также 100%.

Как следует интерпретировать нагрузку на 4-ядерный 8-поточный процессор? Когда достигается максимальная загрузка процессора? В 4.00 или в 8.00?

Ответ 1

Не уверен, но думаю, что рассчитывается по формуле 1.00*n_cpu.

Нагрузка означает следующее: если на однопроцессорной системе есть несколько процессов, то они выполняются как бы параллельно. Но это не так. На самом деле происходит следующее: ядро дает 1/100 секунды процессу, а затем прерывает его работу прерыванием. И дает следующую 1/100 секунды другому процессу.

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

Что сообщает load: сколько процессов в настоящее время ожидают своего следующего 1/100-секундного интервала времени. Конечно, это среднее значение. Поэтому в cat /proc/loadavg вы можете увидеть несколько чисел. Ситуация в многопроцессорной системе немного сложнее. Имеется несколько процессоров, временные рамки которых могут быть отданы нескольким процессам. Это делает планирование задач немного – но не слишком – сложнее. Но ситуация остается той же. Ядро аккуратно пытается разделить системные ресурсы для оптимальной эффективности (есть незначительные оптимизационные вещи, например, лучше, если процесс будет выполняться как можно дольше на одном процессоре из-за соображений кэширования, но они не имеют значения). Поэтому, если у нас есть нагрузка на 8 потоков, это означает: есть фактически 8 процессов, ожидающих своего следующего временного «окна». Если у нас 8 процессоров, мы можем раздать эти временные «окна» процессорам один к одному, и таким образом наша система будет использоваться оптимально.

Если вы посмотрите на уровне пользователя, то увидите, что количество реально запущенных процессов удивительно мало: это процессы, отмеченные там буквой R. Даже на не очень хардкорной системе оно часто меньше 5. Отчасти это объясняется тем, что процессы, ожидающие данные с дисков или из сети, также приостановлены (отмечены S в топе). Нагрузка показывает только использование ЦП.

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

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

Ответ 2

Я провел несколько экспериментов на нашей 24-ядерной системе Xeon (2 сокета x 12 ядер). Максимальная нагрузка в этом случае составляет 48.0 из-за того, как Linux настраивает гиперпоточность. Однако вы не получите эквивалент пропускной способности на 48 ядер. По моим наблюдениям, вы получаете около 90% пропускной способности первых 24 логических процессоров, т. е. если нагрузка достигает 24.0. Затем вы получаете дополнительную пропускную способность около 10% для оставшихся 24 логических процессоров (нагрузка достигает 48.0). Если вы запустите 48 потоков на 24 ядрах, вы получите прирост около 10-20%, если включите гиперпоточность или нет. Это не 100% прирост, как утверждают маркетологи. Например, один из способов проверить это наблюдение – запустить процесс, выполняющий 48 потоков (скажем, с использованием TBB или модели ручной обработки потоков), а затем выполнить следующие действия:

time numactl --physcpubind=0-23 ./myprocess

 И затем запустите:

time numactl --physcpubind=0-47 ./myprocess

Последний должен выполняться примерно на 10-20% меньше времени. Если ваш процесс сильно блокирует ввод-вывод, то результат может быть другим. Первый способ отключает гиперпоточность, позволяя потокам работать только на одном логическом процессоре (на каждом ядре), а второй включает гиперпоточность, позволяя потокам работать на двух логических процессорах (на каждом ядре). Нагрузка в обоих случаях должна быть представлена как 48.0, что, как вы видите, вводит в заблуждение.

Ответ 3

Средняя нагрузка означает не то, что вы думаете. Речь идет не о мгновенном использовании ЦП, а о том, сколько процессов ожидают запуска. Обычно это происходит из-за множества вещей, требующих ЦП, но не всегда. Частым виновником является процесс, ожидающий ввода-вывода – дисковый или сетевой. Попробуйте запустить ps -e v и посмотреть флаги состояния процесса.

  1. state – Состояние задается последовательностью символов, например «RWNA». Первый символ указывает на состояние выполнения процесса.

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

  3. I – Отмечает процесс, который простаивает (спит более 20 секунд).  

  4. L – Помечает процесс, который ожидает получения блокировки.

  5. R – Обозначает выполняемый процесс.

  6. S – Помечает процесс, который находится в состоянии сна менее 20 секунд.

  7. T – Помечает остановленный процесс.

  8. W – Помечает неработающий поток прерывания.

  9. Z – Помечает мертвый процесс («зомби»).

Это из руководства «ps», поэтому вы можете найти там больше деталей – процессы R и D, вероятно, представляют особый интерес.

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

Ответ 4

Поскольку гиперпоточность на самом деле не является вторым ядром, она никогда не разгонит ядро до 200%, но она разгонит его выше 100% при определенных нагрузках.

Таким образом, ваша максимальная нагрузка находится примерно где-то между 4 и 6.

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

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

Linux

Как записать stderr в файл при использовании «tee» с пайпом

Linux

Как объединить две статические библиотеки «ar» в одну

Что такое блокнот для Линукс. Подробный обзор и пошаговая установка
Linux

Что такое блокнот для Линукс. Подробный обзор и пошаговая установка

Linux

Безопасно ли устанавливать make на производственном сервере?

×