CGroups — механизм ограничения и изолирования вычислительных ресурсов для групп процессов.
Позволяет для групп процессов:
- ограничивать использование памяти;
- устанавливать приоритеты использования процессорного ресурса и пропускной способности подсистемы ввода-вывода;
- вести статистику использования ресурсов;
- изолировать пространства имён;
- обеспечивать управление.
libvirt использует cgroups v1. VMmanager при помощи libvirt задействует два модуля cgroups: cpu и blkio, которые предназначены соответственно для управления приоритетами потребления процессорных ресурсов и пропускной способности подсистемы ввода-вывода.
Подробнее о libvirt см. в статье Управление виртуализацией с помощью libvirt.
Приоритеты задаются при создании виртуальных машин в полях вес CPU и вес использования I/O. В cgroups узла кластера создаются соответствующие директории и сохраняются указанные параметры.
Виртуальная машина получает процессорное время в соответствии со своими приоритетами от общего объёма приоритетов виртуальных машин, обращающихся к процессору. Аналогично происходит распределение пропускной способности подсистемы ввода-вывода.
Например, в случае если одновременно обращаются к ресурсам процессора три виртуальных машины:
- VM1 с весом CPU 1000;
- VM2 с весом CPU 2000;
- VM3 с весом CPU 4000.
Тогда процессорное время между виртуальными машинами будет распределено следующим образом:
- VM1: 1000/(1000+2000+4000)*100% = 14,3 %;
- VM2: 2000/(1000+2000+4000)*100% = 28,6 %;
- VM3: 4000/(1000+2000+4000)*100% = 57,1 %.
Вес CPU хранится в файле /sys/fs/cgroup/cpu/machine.slice/machine-qemu\x2dvm1.scope/cpu.shares.
Вес blkio хранится в файле /sys/fs/cgroup/blkio/machine.slice/machine-qemu\x2dvm1.scope/blkio.weight.