10

Как я могу получить истинное использование многоядерного процессора с поддержкой гиперпоточности?

Например, давайте рассмотрим 2-ядерный процессор, выражающий 4 виртуальных ядра.

Однопоточная рабочая нагрузка теперь будет отображаться как 100% в top , так как одно ядро виртуальных ядер полностью используется. Процессор и top работают как положено, словно будет 4 реальных ядра.

С двумя потоками, однако, дела обстоят неуклюже: если все работает хорошо, они сбалансированы с двумя реальными ядрами, поэтому мы получили 200% использования: два раза по 100% и два неактивных виртуальных ядра и используют всю доступную мощность ЦП. , Кажется, хорошо для меня.

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

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

Мне также интересно, как гиперпоточность балансирует два виртуальных на реальном ядре. Если два потока занимают разное количество циклов, будут ли виртуальные ядра «адаптироваться», так что оба будут показывать 100% -ную нагрузку, даже если реальная нагрузка будет отличаться?

3 ответа3

5

Мартин Тегтмайер из Oracle написал интересный пост в блоге об этом в прошлом году:https://blogs.oracle.com/solaris/cpu-utilization-of-multi-threaded-architectures-explained-v2

Краткий ответ; Гиперпоточность действительно портит способность топа сообщать об общем проценте использования ЦП / простоя ЦП.

В худшем случае 2-ядерный 4-виртуальный процессор с двумя потоками при 100% -ной загрузке на ядро может почти насыщать процессор. (В зависимости от использования порта выполнения; только потоки, которые используют совершенно разные вычислительные ресурсы на процессоре, могут по-прежнему работать, не влияя на производительность текущего потока.) Тем не менее, top в этом случае будет сообщать о 50% простоя.

3

Загрузка ядра сильно отличается от нагрузки на систему. Использование ядра показывает только то, сколько ядро что-то вычисляет или ждет инструкций. Это может быть 100%, что соответствует любому заданному времени, когда процессор вычисляет что-то.
Но нагрузка - это другое, нагрузка обычно измеряется, чтобы определить, должен ли какой-либо процесс ждать какого-либо ресурса или нет. Если процессы не ждут каких-либо ресурсов, вы увидите очень производительную систему. Но иногда вы увидите медленные системы, но низкую загрузку процессора. Обычно это означает, что некоторые процессы ожидают ресурс и не освобождают процессор. При таком сценарии вы не увидите высокой загрузки ЦП, но система может быть перегружена. В системе linux Load avarage - это вычисленное значение для измерения общей производительности системы. Значение среднего значения нагрузки следует сравнивать с вычислительными ресурсами paralell, особенно для ядер. Поэтому, если система с 4 физическими ядрами имеет среднюю загрузку 4 или более, мы можем с уверенностью сказать, что некоторые процессы будут ожидать ресурс. Это не важно, если загрузка процессора составляет 100 или 10 процентов. Средняя нагрузка может достигать 200 или 300, в этом случае система будет реагировать слабо. В нормальных условиях работы средняя нагрузка на сервер не должна превышать количество ядер в течение длительного времени. Короткие шипы не важны на мой взгляд. 3 числа, которые вы увидите в выводе w - это загрузка av. на 1/3/15 минут.

0

На мой взгляд, ни один из приведенных выше ответов не является удовлетворительным.

Я думаю, что статья, на которую я ссылаюсь по следующей ссылке, хорошо предназначена для ответа на этот вопрос:http://perfdynamics.blogspot.ch/2014/01/monitoring-cpu-utilization-under-hyper.html

QUOTE:

Идея, лежащая в основе HT, состоит в том, чтобы позволить другому потоку приложения работать, когда текущее приложение останавливается; из-за неправильного прогнозирования веток, пузырей в конвейере и т. д. Чтобы это стало возможным, должен быть другой порт или регистр AS. Этот регистр становится видимым для ОС, когда HT включен. Тем не менее, ОС (и весь путь к пищевой цепочке, независимо от того, какие инструменты для перфорирования вы используете) теперь думает, что доступна в два раза больше процессорной мощности, т. Е. 100% ЦП на каждом порту AS.

Но под капотом все еще есть только один исполнительный блок: одно физическое ядро, с которым вы работали до включения HT. Разница в том, что он каким-то образом распределяется между двумя портами AS. Как одно ядро переключается между двумя портами, очень сложно, но легче всего понять с точки зрения опрошенных очередей. Я вхожу в этот уровень детализации в моих классах GCaP.

Тестовые измерения в лучшем случае, которые я имею, показывают, что каждый порт HT не может быть занят более чем на 75%, в среднем, или на 150% от общей ожидаемой емкости 200% в зависимости от ОС. "Недостающая" пропускная способность в 50%, о которой я говорил ранее, является иллюзией. Intel утверждает, что для общих приложений можно ожидать что-то в диапазоне от 120% до 130%.

На самом деле, я уверен, что операционная система может достигать 100% на каждом виртуальном ядре, без сомнения об этом. Я только что сделал:

mvn clean install -DskipTests -T 5

И я могу заверить вас, что мои 8 виртуальных ядер и 4 физических ядра были загружены на 100%. И у меня точно нет 8 ядер на моей машине.

Короче говоря, вы можете предположить следующее, если общая загрузка ЦП превышает 100%, как вы, и, скорее всего, довольно точно, используя ровно 100% физического ядра. Это меню, если у вас есть физический CORE 1, разделенный на операционную систему CPU 1 и CPU 2. И на ЦП 1 у вас общее использование составляет 50%, а на ЦП 2 - 50%, наиболее вероятно, что в реальной жизни вы оказываете давление 100% на этот ЦП. Вы максимизировали это.

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

Спасибо

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .