Як афінність процесора взаємодіє з групами в Linux?


10

Я намагаюся запустити багатопотокові орієнтири на наборі ізольованих процесорів. Щоб скоротити довгу історію, я спочатку намагався isolcpusі taskset, але потрапив у проблеми . Зараз я граю з cgroups / csets.

Я думаю, що "простий" cset shieldвипадок використання повинен добре працювати. У мене є 4 ядра, тому я хотів би використовувати ядра 1-3 для тестування (я також налаштував ці ядра в режимі адаптивного кліща), тоді ядро ​​0 можна використовувати для всього іншого.

Після навчального посібника тут він повинен бути таким же простим, як:

$ sudo cset shield -c 1-3
cset: --> shielding modified with:
cset: "system" cpuset of CPUSPEC(0) with 105 tasks running
cset: "user" cpuset of CPUSPEC(1-3) with 0 tasks running

Отже, тепер у нас є "щит", який є ізольованим (користувацький cset), а core 0 - для всього іншого (системний комплект).

Добре, поки добре виглядає. Тепер давайте розглянемо htop. Усі процеси повинні бути перенесені на процесор 0:

csets

Так? Деякі процеси показані як запущені на екранованих ядрах. Щоб виключити випадок помилки у htop, я також спробував використати tasksetдля перевірки маски спорідненості процес, показаний як на екрані.

Можливо, ці завдання були непорушними? Давайте вирвемо довільний процес, показаний як запущений на CPU3 (який повинен знаходитись в щиті), htopі подивимося, чи відображається він у системній групі відповідно до cset:

$ cset shield -u -v | grep 864
   root       864     1 Soth [gmain]
   vext01    2412  2274 Soth grep 864 

Так, це працює в системній групі відповідно до cset. Так htopі csetне згоден.

То що тут відбувається? Кому я довіряю: CPU афіні ( htop/ taskset) або cset?

Я підозрюю, що ви не повинні використовувати csetта спорідненість разом. Можливо, щит працює чудово, і я повинен ігнорувати маски спорідненості та htopвихід. Так чи інакше, я вважаю це заплутаним. Може хтось пролити трохи світла?


Який розподіл ви використовуєте? Запитую, оскільки інструменти та робочі процеси різні, залежно від ОС та версії.
ewwhite

Це система debian 8.
Едд Барретт

О, гаразд. У Redhat світі, у нас є numactlі cgconfigта cgrules/ cgredраціоналізувати , що ви робите. Вони можуть бути доступні для Debian з деякими роботами.
ewwhite

Відповіді:


5

З документації на cpusets :

Виклики до sched_setaffinity фільтруються лише до тих процесорів, дозволених у наборі задач цього завдання.

Це означає, що маски афінності CPU перетинаються з cpus у групі, учасником якої є процес.

Наприклад, якщо маска спорідненості процесу включає ядра {0, 1, 3} і процес працює в системній групі, яка обмежена ядрами {1, 2}, то процес буде змушений запускатись на ядрі 1.

Я на 99% впевнений, що htopвисновок "неправильний" у тому, що процеси не прокинулися з моменту створення груп, і на дисплеї відображається останнє ядро, на якому запускався процес.

Якщо я запускаю vim перед тим, як зробити свій щит, vim вилки двічі (чомусь), і найглибша дитина працює на ядрі 2. Якщо я потім зробив щит, тоді сплю vim (ctrl + z) і розбуджую його, обидва процеси мають перейшов до ядра 0. Я думаю, що це підтверджує гіпотезу, що htopвідображає несвіжу інформацію.

Ви також можете оглянути /proc/<pid>/statusта подивитися cpus_allowed_*поля.

Наприклад, у мене тут console-kit-daemonпроцес (pid 857), показуючи в htop як запущений на ядрі 3, але в /proc/857/status:

Cpus_allowed:   1
Cpus_allowed_list:      0

Я думаю, це говорить про те, що маска спорідненості дорівнює 0x1, що дозволяє працювати лише на ядрі 1 за рахунок груп: тобто перетинаються ({0,1,2,3}, {0}) = {0}.

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

Дякуємо @davmac за допомогу в цьому (на irc).


1
Ви маєте рацію, інформація, що відображається в HTOP, не є основним ядром цього процесу, а останнім ядром, на якому він був запланований (те саме стосується всього, що використовує той самий інтерфейс для збору інформації).
Остін Хеммельгарн
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.