Использование только одного ядра процессора


9

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

Итак, у меня есть два вопроса:

  1. Лучшее решение - Как подписать и зарезервировать только одно ядро ​​процессора только для моей программы (чтобы ОС не использовала это ядро ​​процессора). Я думаю, что это невозможно, но, возможно, я ошибаюсь ...

  2. Как настроить linux (Fedora 24) на использование только одного ядра процессора?



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

Вы должны иметь возможность деактивировать ядра ЦП из BIOS, возможно, это более надежно для ваших тестов, так как @liori заявил выше, что ОС может изменять скорость ядра.
Marcs

Как насчет создания виртуальной машины и назначения ей только одного ядра? О, я только что прочитал «не использовать это ядро ​​процессора», так что не берите в голову ...
sakisk

Ответы:


26

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

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

taskset -c 1 ./myprogram

(установите любой номер процессора в качестве аргумента для -cкоммутатора.)

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

Это, я не знаю, как это сделать правильно. Вам нужно будет установить привязку к процессору в initсамом начале процесса загрузки, чтобы убедиться, что он наследуется всем процессам в системе. В качестве обходного пути вы можете использовать taskset -c -p 0 $PIDвсе остальные процессы, чтобы заставить их работать только на CPU # 0.

Systemd такжеCPUAffinity= контролировать сродство в единичных файлах и есть несколько из вопросов по настройке сродства по умолчанию здесь на unix.SE, но я не нашел ни с хорошим решением.

Хотя, как @Kamil Maciorowski прокомментировал и ответил на другой вопрос на superuser.com , настройка isolcpus=1 в командной строке ядра должна «изолировать этот ЦП от общих алгоритмов планирования», что вам может понадобиться.


Это не совсем отвечает на вопрос. Хотя набор задач (или другие методы настройки соответствия задач) будут гарантировать, что процесс выполняется только на указанном наборе ядер, он не гарантирует, что только этот процесс будет выполняться на этих ядрах. То есть операционная система может планировать другие процессы в ядре, к которому вы установили привязку процессов. На практике это наиболее полезный ответ, но следует помнить об ограничениях и, в частности, помнить, что он не дает того, о чем вы просите в 1): «зарезервируйте только одно ядро ​​ЦП только для моей программы (чтобы заставить ОС не использовать это ядро ​​процессора) "
Джеймс Гринхалг

@JamesGreenhalgh, но, найдя способ установить привязку к ЦП для каждого процесса, можно ответить на этот вопрос. Можно ли установить привязку к процессору по умолчанию для новых процессов в качестве опции ядра (строка cmd)? Это вступит в силу на ранней стадии процесса загрузки и повлияет на все процессы.
jpaugh

Я фактически пропустил предложение в скобках о запрете запуска других процессов на этом процессоре. Или, возможно, я подумал, что самой большой проблемой было бы убедиться, что рассматриваемая программа будет работать только на одном ядре, а не, скажем, на четырех, и что другие процессы могут рассматриваться как своего рода неприятность, которая не будет иметь большого значения по сравнению с этим. Но я признаю, у меня не было правильного ответа на эту часть вопроса, кроме того, что Камиль прокомментировал сейчас.
ilkkachu

@jpaugh, я думаю, что даже тогда вы не сможете полностью изолировать себя от возможности выполнения другого процесса на «вашем» ядре. Например, тот, который сбрасывает свою собственную привязку, или даже сам код ядра, отнимающий время, не связанное с управлением вашим процессом. Опять же, я полностью согласен с тем, что на практике этот ответ - то, что большинство сделает для решения основной проблемы, но мне было бы действительно интересно прочитать ответ на эту последнюю часть в скобках!
Джеймс Гринхалг
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.