CGroups
Last updated
Вивчайте та практикуйте взлом AWS: Школа взлому AWS для Червоної Команди (ARTE) Вивчайте та практикуйте взлом GCP: Школа взлому GCP для Червоної Команди (GRTE)
Керуючі групи Linux, або cgroups, є функцією ядра Linux, яка дозволяє розподіляти, обмежувати та пріоритизувати ресурси системи, такі як процесор, пам'ять та введення/виведення диска серед груп процесів. Вони пропонують механізм для керування та ізоляції використання ресурсів колекцій процесів, корисний для таких цілей, як обмеження ресурсів, ізоляція навантаження та пріоритизація ресурсів серед різних груп процесів.
Існують дві версії cgroups: версія 1 та версія 2. Обидві можуть використовуватися одночасно на системі. Основна відмінність полягає в тому, що cgroups версії 2 вводить ієрархічну структуру, схожу на дерево, що дозволяє більш детально розподіляти ресурси серед груп процесів. Крім того, версія 2 вносить різні покращення, включаючи:
Крім нової ієрархічної організації, cgroups версії 2 також ввів кілька інших змін та покращень, таких як підтримка нових контролерів ресурсів, краща підтримка для застарілих додатків та покращена продуктивність.
У цілому, cgroups версії 2 пропонує більше можливостей та кращу продуктивність порівняно з версією 1, але останню все ще можна використовувати в певних сценаріях, де важлива сумісність зі старішими системами.
Ви можете переглянути cgroups v1 та v2 для будь-якого процесу, подивившись на його файл cgroup у /proc/<pid>. Ви можете почати з перегляду cgroups вашої оболонки за допомогою цієї команди:
Номери 2–12: cgroups v1, кожен рядок представляє різний cgroup. Контролери для них вказані поруч з номером.
Номер 1: Також cgroups v1, але використовується лише для управління (встановлено, наприклад, systemd) і не має контролера.
Номер 0: Представляє cgroups v2. Контролери не вказані, і цей рядок є ексклюзивним для систем, які працюють лише з cgroups v2.
Назви ієрархічні, нагадують шляхи до файлів, вказуючи на структуру та взаємозв'язок між різними cgroups.
Назви, такі як /user.slice або /system.slice, вказують на категоризацію cgroups, де user.slice зазвичай використовується для сеансів входу, керованих systemd, а system.slice - для системних служб.
Зазвичай для доступу до cgroups використовується файлова система, відхиляючись від інтерфейсу викликів системи Unix, який традиційно використовується для взаємодії з ядром. Для дослідження конфігурації cgroup оболонки слід переглянути файл /proc/self/cgroup, який показує cgroup оболонки. Потім, перейшовши до каталогу /sys/fs/cgroup (або /sys/fs/cgroup/unified
), і знаходячи каталог з ім'ям cgroup, можна спостерігати різні налаштування та інформацію про використання ресурсів, які стосуються cgroup.
Ключові файли інтерфейсу для cgroups починаються з cgroup. Файл cgroup.procs, який можна переглянути за допомогою стандартних команд, таких як cat, містить перелік процесів у cgroup. Інший файл, cgroup.threads, містить інформацію про потоки.
Cgroups, які керують оболонками, зазвичай включають два контролера, які регулюють використання пам'яті та кількість процесів. Для взаємодії з контролером слід переглянути файли, які мають префікс контролера. Наприклад, pids.current слід перевірити, щоб визначити кількість потоків у cgroup.
Позначення max у значенні вказує на відсутність конкретного обмеження для cgroup. Однак через ієрархічний характер cgroups, обмеження можуть бути накладені cgroup на нижчому рівні в ієрархії каталогів.
Процеси призначаються cgroups шляхом запису їх ідентифікатора процесу (PID) у файл cgroup.procs
. Це вимагає привілеїв root. Наприклад, щоб додати процес:
Аналогічно, зміна атрибутів cgroup, таких як встановлення обмеження PID, виконується шляхом запису бажаного значення у відповідний файл. Щоб встановити максимум 3 000 PID для cgroup:
Створення нових cgroups передбачає створення нової піддиректорії у ієрархії cgroup, що спонукає ядро автоматично генерувати необхідні інтерфейсні файли. Хоча cgroups без активних процесів можна видалити за допомогою rmdir
, слід пам'ятати про певні обмеження:
Процеси можуть бути розміщені лише в листових cgroups (тобто найбільш вкладених у ієрархії).
Cgroup не може мати контролера, відсутнього у його батька.
Контролери для дочірніх cgroups повинні бути явно вказані у файлі cgroup.subtree_control
. Наприклад, щоб увімкнути контролери CPU та PID у дочірньому cgroup:
Коренева cgroup є винятком з цих правил, що дозволяє пряме розміщення процесів. Це можна використовувати для видалення процесів з управління systemd.
Моніторинг використання ЦП в межах cgroup можливий через файл cpu.stat
, який відображає загальний час ЦП, витрачений на процес, корисний для відстеження використання усередині підпроцесів служби:
Книга: Як працює Linux, 3-є видання: Що кожен суперкористувач повинен знати Браяна Ворда