Почему ядра процессора загружаются неравномерно

Обновлено: 02.07.2024

Эти параметры можно использовать в сочетании для управления распределением рабочей нагрузки между отдельными узлами, а также между ядрами и потоками в одном узле. Это будет проиллюстрировано на нескольких примерах «Hello World» (пожалуйста, сначала прочтите Руководство по началу работы). Исходный код этих примеров можно найти по адресу:

Приведенный выше скрипт запускает 48 задач MPI на каждый узел, всего 2 узла. Результатом является оператор Hello World от каждого ядра через два узла:

Распараллеливание также можно выполнить с помощью потоков OpenMP на одном узле:

В приведенном выше примере один узел запрашивается для выполнения одной задачи, разделенной на 48 ядер. Переменная среды $SLURM_CPUS_PER_TASK соответствует запрошенным нами 48 ядрам на задачу и используется для установки переменной среды OpenMP, которая определяет количество используемых потоков. После компиляции и запуска скрипта результатом будет инструкция «Hello World» от каждого из 48 потоков, запущенных на узле:

Еще один вариант — объединить распараллеливание с MPI и OpenMP между узлами и внутри них:

Этот сценарий запустит две задачи MPI — по одной на каждый узел, а затем запустит 48 потоков OpenMP для каждой задачи. Как и прежде, мы используем переменную среды Slurm $SLURM_CPUS_PER_TASK для управления количеством потоков OpenMP. Кроме того, мы установили значение новой переменной среды $MV2_ENABLE_AFFINITY равным нулю, что отключает привязку ЦП и может предотвратить снижение производительности при выполнении более сложных задач.

В результате получается 96 приветствий от каждого потока, распределенных между двумя процессами и двумя узлами. Каждый процесс содержится в одном узле:

Продвинутые пользователи иногда могут захотеть объединить MPI и OpenMP, но ограничить процессы, чтобы они оставались в каждом из четырех физических сокетов ЦП на каждом узле. Последний пример иллюстрирует, как это сделать:

Здесь мы запросили 2 узла с 1 задачей на сокет. Мы также запросили все 4 сокета на узел. На этот раз мы установили $OMP_NUM_THREADS вручную на 12, чтобы равномерно распределить использование ядра между 4 сокетами.

Результат снова 96 "Привет", но на этот раз они распределены по 4 процессам на узел, по 12 потоков на процесс:

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

Хотя в этих примерах показано, как управлять поведением для каждого задания, пользователи также могут передать большинство одинаковых флагов в параметр "srun" в скрипте, чтобы получить дополнительный контроль над каждым заданием. Флаг srun "--cpu-binding" также позволяет детально контролировать процессоры, используемые в задачах, вызываемых srun. Дополнительные сведения и дополнительные параметры см. в этом подробном обсуждении.

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

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

Центральный процессор (ЦП) — это мозг ПК. Все основные компоненты системы, такие как видеокарта и оперативная память, зависят от инструкций ЦП. Это делает правильно функционирующий процессор важной частью каждого игрового ПК.

Когда игра зависает или вылетает, открытые приложения перестают реагировать на новые действия или программы открываются с черепашьей скоростью, причиной может быть ненормально высокая загрузка ЦП. Давайте рассмотрим, как исправить высокую загрузку ЦП в Windows* 10.

1. Перезагрузить

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

2. Завершить или перезапустить процессы

Откройте диспетчер задач (CTRL+SHIFT+ESCAPE). Если программа снова начала увеличивать загрузку ЦП даже после перезапуска, Диспетчер задач предлагает один из самых простых способов отследить это.

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

Открыв Диспетчер задач, нажмите вкладку «Процессы» вверху. Нажмите «Подробнее» внизу этой вкладки, чтобы открыть фоновые процессы Windows. Найдите столбец «ЦП» в верхней части вкладки «Процессы» и щелкните его, чтобы упорядочить по загрузке ЦП:

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

Важно помнить, что высокая загрузка ЦП при многозадачности может быть нормальным явлением. Современные процессоры справляются с многозадачными ситуациями, разделяя процессы между несколькими процессорными ядрами, которые одновременно выполняют разные наборы инструкций. Технология Intel® Hyper-Threading (технология Intel® HT) делает еще один шаг вперед, создавая несколько «потоков» выполнения в каждом ядре, каждый из которых обрабатывает разные процессы. Если ресурсоемкая программа, такая как Adobe Premiere, использует высокую загрузку ЦП, возможно, она просто эффективно использует доступные ядра ЦП.

Технология Intel® Turbo Boost также может помочь в обработке тяжелых рабочих нагрузок за счет динамического увеличения частоты ЦП. В семействе процессоров Intel® Core™ серии X есть еще один инструмент, помогающий избежать замедления работы, поскольку их технология Intel® Turbo Boost Max 3.0 автоматически назначает самые сложные задачи самым быстрым процессорным ядрам, а также повышает частоту этих ядер.

Эти процессорные технологии могут значительно повысить скорость многозадачности и использования ресурсоемких программ, но все же могут возникать ситуации с ненормальной загрузкой ЦП. Если вы видите фоновый процесс с именем, например Runtime Broker, Windows Session Manager или Cortana, в верхней части столбца ЦП, когда вы достигаете 100% загрузки ЦП, у вас возникла проблема.

Эти процессы Windows предназначены для использования очень небольшого количества вашей вычислительной мощности или памяти в обычных условиях — вы часто увидите, что они используют 0 % или 1 % в диспетчере задач. Когда ваш компьютер простаивает, все эти процессы вместе обычно используют менее 10% мощности вашего процессора. Однако ошибочное или неожиданное поведение — например, один процесс Windows пытается и повторяет попытку выполнить действие поиска, которое было отключено в другом месте — иногда может привести к тому, что процесс съест почти все ресурсы вашей системы.

После того, как вы открыли Диспетчер задач и обнаружили, что процесс неожиданно использует часть процессорного времени, выполните поиск в Интернете, чтобы идентифицировать его. Вы не хотите останавливать такие процессы, как explorer.exe (который управляет многими графическими элементами, такими как рабочий стол и меню «Пуск») или winlogon.exe (задачи запуска и экран CTRL+ALT+DEL), если у вас нет веской причины.

После того как вы определили процесс как некритичный (и, опять же, проверили, что вы сохранили все, над чем работали), нажмите на процесс, чтобы выбрать его, затем нажмите «Завершить процесс» в правом нижнем углу «Задачи». Управляющий делами. End Process приведет к завершению программы без сохранения.

Logic Pro и Logic Express 8 или более поздней версии могут использовать все ядра на 2-, 4- и 8-ядерных компьютерах Mac. Помните об этих советах, когда будете работать с Logic, чтобы сбалансировать производительность многоядерной системы.

Об основной деятельности

Логика разбивает задачи на потоки, которые можно назначить для выполнения одному ядру. Невозможно разделить один поток на несколько ядер, хотя одно ядро ​​может запускать несколько потоков одновременно. Это одна из причин, по которой иногда вы можете видеть неравномерное распределение нагрузки между доступными ядрами на вашем компьютере. Если один поток очень интенсивно использует процессор, ядро, выполняющее этот поток, может проявлять гораздо большую активность, чем ядра, выполняющие менее ресурсоемкие задачи. Это основная причина того, что вы можете получать предупреждающие сообщения "Core Audio Overload", даже если некоторые из ядер вашей системы не проявляют значительной активности.

Чтобы отслеживать, как Logic использует ядра вашей системы, дважды щелкните индикатор ЦП в области "Транспорт".


В окне отображается счетчик для каждого ядра.


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

Перераспределение основной нагрузки

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

В приведенном ниже примере имеется одна линейка каналов виртуальных инструментов с подключаемыми модулями, направленными непосредственно на выход 1–2. Полоса каналов для выходов 1–2 имеет большое количество подключаемых модулей.


В этом примере задействованы два ядра: левое ядро ​​обрабатывает программный инструмент, а следующее ядро ​​обрабатывает линейку каналов Output 1-2. Вы можете использовать возможности маршрутизации в Logic для распределения нагрузки на большее количество ядер без изменения звука, как показано на следующем изображении.


Результирующая цепочка сигналов выглядит следующим образом: Inst 1 > Aux 1 > Aux 2 > Out 1–2, как показано в этой таблице:

< td>Ввод &НоваяСтрока;&Вкладка;&Вкладка;&Вкладка;
Полоса канала Вывод
Inst 1Автобус 1
Aux 1 Автобус 1 Автобус 2
Aux 2 Автобус 2 Выход 1-2

Кроме того, первые четыре плагина перемещены с выходов 1-2 на Aux 1, а оставшиеся четыре плагина — на Aux 2.

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


На изображении выше по-прежнему очень большая нагрузка на одно ядро, даже несмотря на то, что оно использует маршрутизацию, описанную выше. Обратите внимание, что выбрана линейка каналов Inst 1. Когда в окне аранжировки выбрана дорожка виртуального инструмента, Logic переходит в «режим живого ввода». В этом режиме Logic включает каждый плагин на пути прохождения сигнала канальной линейки, чтобы канальную линейку можно было воспроизводить вживую с MIDI-контроллера. Все это должно обрабатываться одним потоком и, следовательно, только одним ядром. Рекомендуется оставить дорожку, использующую линейку аудиоканалов, выбранной в окне аранжировки, если только вы не играете или не записываете на виртуальный инструмент.

Этот форум перенесен в раздел вопросов и ответов Майкрософт. Посетите Microsoft Q&A, чтобы публиковать новые вопросы.

Отвечает:

Вопрос

После установки SQL Server Enterprise 2012 с моделью лицензии Server + Cal на компьютере с 2 процессорами по 16 ядер каждый (без использования гиперпоточности) и при очень большой нагрузке на сервер 16 ядер на первом процессоре были очень недостаточно загружены, первые 4 ядра на втором процессоре были сильно загружены, а последние 12 ядер вообще не использовались (из-за ограничения в 20 ядер для этой версии сервера sql). Общая загрузка ЦП отображалась примерно на уровне 25%. К сожалению, сервер страдал от крайне низкой производительности, хотя если бы задачи были равномерно распределены между 20 ядрами, это не было бы так плохо.

Windows Server работал на виртуальном образе VMWare под управлением ESX Server, но весь ЦП был выделен серверу Windows.

Мы попытались изменить настройки привязки (например, выделить большинство ядер для ЦП, а остальные для ввода-вывода), но это не помогло решить проблемы с производительностью.

Обновление версии продукта до SQL Server Enterprise Core 2012 не только позволило SQL Server использовать 12 ранее не использовавшихся ядер второго процессора, но и привело к гораздо более равномерному распределению задач между всеми процессорами. Чтобы справиться с отставанием запросов, загрузка ЦП подскочила примерно до 90 %, а затем снизилась примерно до 33 %, как только она была решена, но производительность значительно улучшилась, так как мы перешли на недавно обновленную версию. И проблемы с производительностью исчезли.< /p>

Мне интересно, знает ли кто-нибудь, что может привести к тому, что SQL Server неравномерно распределяет нагрузку, полагаясь почти исключительно на первые 4 ядра второго процессора, у которого простаивают 12 ядер, и распределяет только несколько задач на каждое из 16 ядер. на первом процессоре. Кроме того, можно ли как-то более равномерно распределить нагрузку между 20 ядрами, которые использовались без обновления версии продукта?

Обратной стороной этого вопроса является то, что сделало обновление продукта, из-за чего SQL Server начал равномерно распределять нагрузку между всеми распознанными ядрами?

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

Ответы

Когда я просматривал данные активного рабочего процесса, мне было интересно, возможно ли, что, поскольку 12 ядер на узле_1 полностью простаивают, когда SQL Server определяет, какой процессор направить ему задачу, определил, что узел_1 в настоящее время недостаточно загружен по сравнению с node_0, поэтому он перенаправлял больше запросов на node_1, но когда он туда попал, лицензионное ограничение заставило запрос перейти к одному из четырех доступных ядер?

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

Чак Купер

Я также должен добавить, что ваш конкретный уровень дисбаланса является результатом конфигурации виртуальной машины и способа представления vNUMA в ОС виртуальной машины. Имеющиеся на рынке 16-ядерные процессоры (AMD Interlagos) имеют несколько узлов NUMA на сокет, обычно 8 ядер на узел NUMA, поэтому дисбаланс под аппаратным обеспечением будет 8+8+4 и не такой перегруженный на 4-ядерной стороне, но по-прежнему примерно удваивает количество назначенных задач для каждого планировщика по мере масштабирования нагрузки.

  • Отредактировано Jonathan Kehayias MVP 15 ноября 2012 г., 4:33
  • Помечено в качестве ответа Chuck Cooper1, 15 ноября 2012 г., 14:08

Все ответы

Должны ли мы предположить, что параметр maxdop сервера по умолчанию равен нулю?

Вполне вероятно, что установка меньшего числа поможет лучше распределить нагрузку. К сожалению, я имею в виду, что 0 по умолчанию для всех, поэтому меньшее число может быть 8, 6 или 4. Что лучше, должно зависеть от вашей архитектуры NUMA (и, конечно, от специфики вашей нагрузки). Вы, вероятно, захотите взглянуть на клерки памяти или планировщики или что-то еще, чтобы определить, что видит и делает SQL Server в отношении вашей архитектуры NUMA. Или есть более прямой счетчик? В любом случае, когда у вас было ограничение в 20 ядер из 32 на виртуальном образе, это могло немного запутаться.

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

Я хотел бы быть более точным во всем этом, в частности, я хотел бы сам узнать, что *является* поведением SQL Server по умолчанию в отношении NUMA и выделения ядер для параллельного запроса, если вы оставляете maxdop на нуле, но я никогда не слышал об этом от Microsoft, и я определенно видел некоторые любопытные действия на своих серверах, но не мог точно определить, что происходит.

Я не знаю, о чем говорит Джош в своем ответе, но мне потребуется дополнительная информация, чтобы немного лучше понять вашу конкретную проблему. Если у вас нет виртуальной машины с ограничением в 20 ядер, у которой возникла проблема, это будет не что иное, как догадки о том, в чем была проблема, поэтому давайте начнем с определения, доступна ли эта виртуальная машина, даже если она не используется. для нагрузки больше? Если это не так, то единственный способ получить ответ — создать другую идентичную конфигурацию, чтобы мы могли получить некоторую информацию из DMV о том, как SQLOS настраивает все под виртуальной машиной. У меня есть несколько вопросов: настроили ли вы vNUMA для виртуальной машины, чтобы сопоставить ее с аппаратной архитектурой NUMA или нет? Если бы вы этого не сделали, у вас была бы конфигурация SMP, и нам пришлось бы посмотреть, какие коэффициенты загрузки вашего планировщика были в dm_os_schedulers под нагрузкой, и что выполнялось в активных планировщиках, сколько соединений было установлено/использовано и т. д. SQL Server предназначен для балансировки нагрузки соединений, когда новое соединение создается на основе load_factor планировщиков в sys.dm_os_schedulers, и новое соединение назначается циклическим способом планировщикам с наименьшим коэффициентом нагрузки. В пределах 20 планировщиков Enterprise Edition с использованием Server+CAL вы можете использовать ALTER SERVER CONFIGURATION, чтобы сбалансировать использование планировщика между физическими сокетами 10 и 10, изменив настройки привязки процессов. Однако вам также нужно будет использовать флаг трассировки, чтобы отключить привязку потоков как часть этой настройки, и у вас должны возникнуть проблемы с загрузкой, как вы описываете из моего опыта работы с экземплярами 2012 года с использованием Enterprise Server + CAL. Не зная больше о рабочей нагрузке, это может быть просто случайностью, что ваши соединения, выполняющие большую часть работы, были распределены между этими 4 планировщиками как часть балансировки нагрузки, и это не сработало идеально. Здесь слишком много неизвестных, из-за которых можно только догадываться о том, какова была настоящая первопричина, постфактум.

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


Что значит запутался?Движок не запутался в конфигурации SQL Server по умолчанию для ограничения Server+CAL Enterprise Edition в SQL Server 2012. Это одна из самых абсурдных вещей, которые вы могли здесь сказать. Он просто отключает дополнительные планировщики, что вы можете сделать самостоятельно с помощью ALTER SERVER CONFIGURATION или Soft NUMA, или в более старых версиях SQL Server с настройками Affinity Mask.

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

Я хотел бы быть более точным во всем этом, в частности, я хотел бы сам узнать, что *является* поведением SQL Server по умолчанию в отношении NUMA и выделение ядер для параллельного запроса, если вы оставите maxdop равным нулю, но я никогда не слышал об этом от Microsoft, и я определенно видел некоторые любопытные действия на своих серверах, но не мог точно определить, что происходит.

Джош

Не существует загадочного алгоритма, который SQL Server использует для определения уровня параллелизма для любой конфигурации. Как правило, он очень предсказуем, за исключением случаев, когда текущая нагрузка или доступные рабочие потоки препятствуют возможности параллелизма по умолчанию. У Адама Маханика есть отличный набор сообщений в блоге, в которых подробно рассказывается о том, как SQL Server обрабатывает параллелизм и какие факторы влияют на использование параллелизма в движке.

Если вы сомневаетесь в информации Адама, знайте, что он был одним из первых инструкторов по программе SQL Server MCM в Microsoft, поэтому он знает, о чем говорит. Если вы оставите maxdop равным нулю в системе NUMA, он может использовать все ЦП на сервере независимо от конфигурации NUMA для обработки запроса. Это идеально? Это зависит от вашей рабочей нагрузки, это может быть идеальным для DSS или больших рабочих нагрузок отчетов, которые имеют только 1 или 2 запроса, выполняемых в данный момент времени, а улучшения во времени выполнения, обеспечиваемые более высоким уровнем параллелизма, перевешивают любые затраты на операции с памятью NUMA. Для OLTP или высокопараллельной рабочей нагрузки это не сработает.

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