Использование Cgroup для ограничения ресурсов

Моя цель: предоставить пользователю возможность ограничить ресурсы, такие как ЦП, память для данного процесса (С++).

Итак, кто-то предложил мне использовать Cgroups, которая выглядит идеальной утилитой.

После некоторых исследований у меня есть опасения:

Когда мы используем memory.limit_in_bytes для ограничения использования памяти для данного процесса, есть ли способ обработать исключение нехватки памяти в процессе? Я вижу, что группы управления предоставляют параметр с именем «memory.oom_control», который при включении убивает процесс, запрашивающий больше памяти, чем разрешено. Когда он отключен, он просто приостанавливает процесс.

Я хочу, чтобы процесс знал, что он запрашивает больше памяти, чем ожидалось, и должен выдать исключение из памяти. Это делается для того, чтобы процесс изящно завершился.

Обеспечивает ли cgroups такое поведение?

Также доступна ли cgroup во всех версиях Linux? Меня в основном интересуют машины RHEL 5+, CENTOS 6+ и ubuntu 12+.

Любая помощь приветствуется.

Спасибо


person Rambo    schedule 14.04.2015    source источник


Ответы (1)


Я хочу, чтобы процесс знал, что он запрашивает больше памяти, чем ожидалось, и должен выдать исключение из памяти. Это делается для того, чтобы процесс изящно завершился.

Обеспечивает ли cgroups такое поведение?

Все процессы в последних выпусках уже выполняются внутри контрольной группы по умолчанию. Если вы создадите новую контрольную группу, а затем перенесете процесс в новую контрольную группу, все будет работать как прежде, но с использованием ограничений из новой контрольной группы. Если ваш процесс выделяет больше памяти, чем разрешено, он получает ошибку ENOSPC или malloc, как и сейчас.

person Oldest Software Guy    schedule 15.04.2015
comment
Поэтому я использую cgcreate/cgdelete/cgclassify для создания, удаления и присоединения любого существующего процесса к контрольной группе. Но похоже, что этим командам нужен root-доступ, и для моего текущего пользователя без полномочий root это не работает напрямую. Действительно ли необходимо быть пользователем root? - person Rambo; 21.04.2015
comment
Я не вижу сбоя malloc при превышении памяти cgroup. Процесс либо уничтожается, либо приостанавливается в зависимости от настройки oom_control. Какой параметр я использую, чтобы вместо этого получить отказ malloc? - person Metric Crapton; 08.06.2017
comment
@MetricCrapton, ты нашел ответ? - person user1507435; 28.09.2019
comment
@ user1507435, Нет, в итоге мы написали отдельный диспетчер блочной памяти. - person Metric Crapton; 14.10.2019