Для передмови я використовую 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?