ОНОВЛЕННЯ: Зауважте, що відповідь нижче стосується RHEL 6. У RHEL 7 більшість груп керується systemd, а libcgroup - застарілою.
Після публікації цього питання я вивчив цілий посібник, з яким я посилався вище, а також більшість документації cgroups.txt та cpusets.txt . Зараз я знаю більше, ніж я коли-небудь очікував дізнатися про групи, тому я відповім на власне запитання тут.
Можна скористатися декількома підходами. Контакт нашої компанії з Red Hat (Технічний архітектор) рекомендував не обмежувати всіх процесів, віддаючи перевагу більш декларативному підходу - обмежуючи лише ті процеси, які ми спеціально хотіли. Причина цього, згідно з його твердженнями з цього приводу, полягає в тому, що можливі системні виклики залежати від кодового простору користувача (наприклад, LVM-процесів), який при обмеженні може уповільнити систему - протилежний наміченому ефекту. Тож я врешті-решт обмежив кілька конкретно названих процесів, а все інше залишив у спокої.
Додатково хочу зазначити деякі основні дані групи, які мені не вистачало, коли я розміщував запитання.
Групи не залежать від libcgroup
встановлення. Однак, це набір інструментів для автоматичної обробки конфігурації групи та присвоєння процесів групам і може бути дуже корисним.
Я виявив, що інструменти libcgroup також можуть вводити в оману, тому що пакет libcgroup побудований на власному наборі абстракцій та припущень щодо використання вами груп, які дещо відрізняються від фактичної реалізації ядра рівня груп. (Я можу навести приклади, але це потребує певної роботи; прокоментуйте, якщо вам це цікаво.)
Тому перед використанням libcgroup інструментів (таких , як /etc/cgconfig.conf
, /etc/cgrules.conf
, cgexec
, cgcreate
, cgclassify
і т.д.) , я настійно рекомендую отримати добре знайомі з /cgroup
самої віртуальної файлової системи, а також створення контрольних груп, контрольної групи ієрархії (включаючи ієрархії з декількома підсистемами прикріпленими, які libcgroup приховано і leakily анотацій вручну подалі), переназначення процесів для різних груп за допомогою запуску echo $the_pid > /cgroup/some_cgroup_hierarchy/a_cgroup_within_that_hierarchy/tasks
та інші, здавалося б, магічні завдання, які libcgroup
виконуються під кришкою.
Інший основною концепцією я пропускав в тому , що якщо /cgroup
віртуальна файлова система встановлена у вашій системі на всіх (або точніше, якщо якийсь - або з контрольної групи підсистем ака «контролери» змонтовані на всіх), то кожен процес по всій системі в а cgroup. Не існує такого поняття, як "деякі процеси в групі, а деякі - ні".
Існує те, що називається кореневою групою для даної ієрархії, яка володіє всіма ресурсами системи для доданих підсистем. Наприклад, ієрархія групових груп, у якій додані підсистеми cpuset і blkio, матиме кореневу cgroup, яка б володіла всім процесором у системі та всім blkio в системі, і могла б поділитися деякими з цих ресурсів з дочірніми групами. Ви не можете обмежувати кореневу групу, оскільки вона володіє всіма ресурсами вашої системи, тому обмежувати це навіть не має сенсу.
Ще деякі прості дані, які мені не вистачало про libcgroup:
Якщо ви користуєтесь /etc/cgconfig.conf
, ви повинні переконатися, що chkconfig --list cgconfig
показує, що cgconfig
встановлено для запуску під час завантаження системи.
Якщо ви змінилися /etc/cgconfig.conf
, вам потрібно запустити, service cgconfig restart
щоб завантажити зміни. (І проблеми з зупинкою служби або запуском cgclear
дуже часто зустрічаються при дурному тестуванні. Для налагодження я рекомендую, наприклад lsof /cgroup/cpuset
, якщо cpuset
є ім'я ієрархії групи, яку ви використовуєте.)
Якщо ви хочете скористатися /etc/cgrules.conf
, вам потрібно переконатися, що "движок демона з правилами групи" ( cgrulesengd
) працює:: service cgred start
і chkconfig cgred on
. (І ви повинні знати про можливий, але малоймовірний стан перегонів щодо цієї послуги, як описано в Посібнику з управління ресурсами Red Hat у розділі 2.8.1 внизу сторінки.)
Якщо ви хочете обдурити вручну і налаштувати свої групи за допомогою віртуальної файлової системи (яку я рекомендую для першого використання), ви можете зробити це, а потім створити cgconfig.conf
файл, який відображає налаштування, використовуючи cgsnapshot
його різні параметри.
І нарешті, ключовий фрагмент інформації, який мені не вистачало, коли я писав таке:
Однак застереження щодо цього ... здається, що діти мого імені будуть перепризначені для обмеженої групи cpu0only.
Я мав рацію, але є варіант, про який я не знав.
cgexec
це команда для запуску процесу / запуску команди та присвоєння її групі.
cgclassify
це команда призначити вже запущений процес групі.
І те й інше заважатиме cgred
( cgrulesengd
) перерозподіляти зазначений процес іншій групі на основі /etc/cgrules.conf
.
Обидва cgexec
і cgclassify
підтримують --sticky
прапор, що додатково не дозволяє cgred
перерозподілити дочірні процеси на основі /etc/cgrules.conf
.
Отже, відповідь на запитання, яке я написав (хоча це не інсталяція, яку я закінчив реалізовувати, через поради нашого технічного архітектора Red Hat):
Складіть cpu0only
і anycpu
групи, як описано в моєму запитанні. (Переконайтеся cgconfig
, що для завантаження встановлено.)
Складіть * cpuset cpu0only
правило, як описано в моєму запитанні. (І переконайтеся cgred
, що налаштування запускається під час завантаження.)
Запустіть всі процеси , я хочу необмежені з: cgexec -g cpuset:anycpu --sticky myprocessname
.
Ці процеси будуть необмеженими, і всі їхні дочірні процеси також будуть необмеженими. Все інше в системі буде обмежено CPU 0 (після перезавантаження, оскільки cgred
не застосовує crurule до вже запущених процесів, якщо вони не змінять свій EUID). Це не цілком доцільно, але це було те, що я спочатку просив, і це можна зробити з групами.