Набір завдань не працює над діапазоном ядер в ізольпсі


13

Для передмови я використовую Debian Wheezy з ядром 3.2 на чіпсеті AMD64. Моя машина має два ядра Xeon E5-2690. Я налаштував параметри завантаження так, щоб усі ядра в одному процесорі були присвячені одному процесу. Для цього я встановив isolcpus = 8,9,10,11,12,13,14,15 в грубі.

Все йде нормально. Тепер скажімо, що я хочу використовувати ізольовані процесори для даної команди, щоб бути простою, я просто використовую простий нескінченний цикл:

$ taskset -c 8-15 bash -c 'у той час як true; виконувати привіт> / dev / null; зробив '&

На сьогоднішній день добре, топ показує, що сердечник 8 обертається до майже 100% використання. Скажімо, я запускаю цю команду ще раз:

$ taskset -c 8-15 bash -c 'у той час як true; виконувати привіт> / dev / null; зробив '&

Тепер зверху показано, що ядра 9-15 залишаються в режимі очікування, і два процеси діляться ядром 8. Якщо замість цього я роблю це:

$ taskset -c 8 bash -c 'у той час як true; виконувати привіт> / dev / null; зробив '&

$ taskset -c 9 bash -c 'у той час як true; виконувати привіт> / dev / null; зробив '&

Сердечники 8 і 9 отримують 100% використання як слід. Це стосується лише ізольп, оскільки той самий набір завдань з ядрами 1-7 належним чином поширює процеси на відповідні ядра. Крім того, "taskset -p" показує, що маска спорідненості для 8-15 процесів встановлена ​​правильно. Здається, планувальник ядра відмовляється використовувати що-небудь, крім найнижчого ядра, зазначеного в масці спорідненості isolcpus.

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

Хтось має ідею, як змусити планувальника дати мені більше одного ядра з набору isolcpu?


ви можете спробувати використовувати багатопоточну програму? bash is not multithread
c4f4t0r

1
Так, саме спочатку мене це помітило (моя багатопотокова програма не використовувала більше одного ядра). Простий скрипт python, який створює багато потоків, не може використовувати більше, ніж одне ядро ​​під час роботи на наборі isolcpus. (При запуску на неізольованих ядрах він використовує всі доступні 8 ядер).
користувач79126

прочитайте цей linuxtopia.org/online_books/linux_kernel/kernel_configuration/… , це виключить cpus з планувальника ядра, але після виключення cpus потрібно запустити процес на виключеному cpus?
c4f4t0r

1
Ядро не планує потік або процес на isolcpu, якщо маска афінності процесора не вкаже, що його слід використовувати. Інакше isolcpus буде таким самим, як відключення ядра, коли мета - резервувати ядро ​​з вказаної користувачем причини та переконатися, що жоден небажаний процес не використовує його. Набір завдань встановлює маску спорідненості для використання всіх ядер у діапазоні 8-15 (що встановлено правильно при включенні / обробці), тому ядро ​​повинно планувати процес на ядрах в режимі очікування.
користувач79126

Відповіді:


10

Після дня розчарування я визначив рішення. Така поведінка є артефактом алгоритму планування ядра за замовчуванням (SCHED_OTHER для цього дистрибутива / ядра). Зміна процесу на інший алгоритм усуває проблему, ізольпус адекватно використовується в процесах / потоках.

Я в кінцевому підсумку використовував SCHED_RR, але також перевіряв SCHED_FIFO та SCHED_IDLE, які, здається, працюють. Процес можна запустити за допомогою альтернативного алгоритму за допомогою утиліти chrt:

$ sudo chrt -r 1 [команда]

(Якщо ви хочете запустити як некоренне, ви можете скористатися утилітою setcap, щоб увімкнути CAP_SYS_NICE у бінарному файлі, пов'язаному з командою)


1
Незважаючи на те, що задати спорідненість до ядер 0,1, моя програма Java використовувала лише перше ядро. 'sudo chrt -r 1 [команда]' вирішив і мою проблему.
Barry NL
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.