Використання лише одного ядра процесора


9

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

Тож у мене є два питання:

  1. Найкраще рішення - Як підписати та зарезервувати лише одне ядро ​​CPU лише для моєї програми (змусити ОС не використовувати це ядро ​​CPU). Я думаю, це не можливо, але, можливо, я помиляюся ...

  2. Як встановити linux (Fedora 24), щоб використовувати лише одне ядро ​​CPU?



1
Зауважте, що сучасні процесори можуть змінювати свою швидкість залежно від того, скільки ядер використовується загалом. Навіть якщо ви переконаєтесь, що ваш процес використовує лише одне ядро, і жоден інший процес не використовує його, швидкість цього ядра буде відрізнятися залежно від того, як операційна система буде використовувати інші ядра. Враховуйте це під час запуску тестів.
liori

Ви повинні мати можливість відключити ядра процесора з BIOS, можливо, це більш надійно для ваших тестів, як @liori вказано вище, що ОС може змінювати швидкість ядра.
Маркс

А як же створити VM та призначити йому лише одне ядро? О, я просто прочитав "не використовувати це ядро ​​процесора", так що не забувайте ...
sakisk

Відповіді:


26

У Linux працює системний виклик для встановлення спорідненості процесора до процесу sched_setaffinity. Тоді є tasksetінструмент зробити це в командному рядку.

Щоб ця єдина програма працювала лише на одному процесорі, я думаю, ви хочете щось подібне

taskset -c 1 ./myprogram

(встановіть будь-який номер CPU як аргумент для -cкомутатора.)

Це повинно бути досить близьким до однопроцесорної системи, якщо ваші інші процеси не працюють надто багато в порівнянні з тим, який ви хочете виміряти, або вони плануються до інших процесорів. Якщо ви хочете , щоб виділити один процесор для цього єдиного процесу тільки , і запобігти інші процеси від роботи на цьому процесорі, ви повинні встановити їх спорідненість теж.

Що, я не знаю, як правильно це зробити. Вам потрібно буде встановити спорідненість процесора initдуже рано в процесі завантаження, щоб переконатися, що він успадковується всім процесам у системі. Як вирішення, ви можете використовувати taskset -c -p 0 $PIDдля всіх інших процесів, щоб змусити їх працювати лише на процесорі № 0.

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

Хоча як @Kamil Maciorowski прокоментував і відповів на інше запитання на superuser.com , налаштування isolcpus=1 в командному рядку ядра повинно "ізолювати цей процесор від загальних алгоритмів планування", що вам може знадобитися.


Це не зовсім відповідає на питання. Хоча набір завдань (або інші методи встановлення спорідненості задачі) гарантуватиме, що процес запускається лише на заданому наборі ядер, це не гарантує, що тільки цей процес буде працювати на цих ядрах. Тобто, операційна система може запланувати інші процеси на ядро, до якого ви встановили спорідненість свого процесу. На практиці це найкорисніша відповідь, але пам’ятайте про обмеження, і, особливо, пам’ятайте, що він не дає того, про що ви просите в 1) «зарезервуйте лише одне ядро ​​процесора лише для моєї програми (змусити ОС не використовувати це ядро ​​процесора) "
James Greenhalgh

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

Я фактично пропустив положення в дужках про запобігання запуску інших процесів на цьому процесорі. А може, я подумав, що найбільшою проблемою буде переконатися, що розглядаема програма буде працювати лише на одному ядрі, а не на чотирьох, і що інші процеси можна вважати своєрідною неприємністю, яка не має великого значення. порівняно з цим. Але визнаю, я не мав належної відповіді на цю частину питання, окрім того, що зараз прокоментував Каміль.
ilkkachu

@jpaugh, я думаю, що навіть тоді ви не зможете повністю ізолювати себе від можливості іншого процесу, що виконується на "вашому" ядрі. Наприклад, той, який скидає власну спорідненість, або навіть сам код ядра, вимагає часу, не пов'язаного з управлінням вашим процесом. Знову ж таки, я повністю згоден, що на практиці ця відповідь - це те, що більшість зробить для вирішення основної маси проблеми, але мені було б дуже цікаво прочитати відповідь на цю заключну частину в дужках!
Джеймс Грінхаль
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.