Почему мой лимит ЦП не проверяется через cgroups

/etc/cgconfig.conf

...

group memlimit {
    memory {
        memory.limit_in_bytes = 8589934592;
    }
}

group cpulimit {
    cpu {
        cpu.shares = 1024;
    }
}

/etc/cgrules.conf:

@gatewayer  memory  memlimit/
@gatewayer  cpu cpulimit/

И я перезапустил службы с помощью команд:

service cgconfig restart
service cgred restart

После того, как я выполнил свой скрипт Python от пользователя, принадлежащего к группе gatewayer, я мог видеть PID при выполнении cat /cgroup/memory/memlimit/cgroup.procs, и к запущенному процессу было применено ограничение. Однако ограничение на процессор не действует, и cat /cgroup/cpu/cpulimit/cgroup.procs не печатает PID, как ожидалось.

Я попытался проверить процесс, и результат оказался тем же, что память ограничена cgroups, а cpu - нет:

$ cat /proc/18113/cgroup 
174:blkio:/
173:net_cls:/
172:freezer:/
171:devices:/
170:memory:/memlimit
169:cpuacct:/
168:cpu:/
167:cpuset:/

Может ли кто-нибудь помочь мне? Большое спасибо.


person Judking    schedule 29.05.2015    source источник
comment
cpu.shares не является ограничением на использование ЦП, если нет конкуренции за ЦП. Если ЦП бездействует, любой процесс может использовать весь ЦП, независимо от его значения cpu.shares. Однако при конкуренции за ЦП значение cpu.shares используется для определения процента времени ЦП, отведенного процессу (этот процесс cpu.shares / сумма всех cpu.shares).   -  person twalberg    schedule 29.05.2015
comment
Основная проблема заключается в том, что мой процесс не разделяет ЦП пропорционально, как ожидалось, с другими процессами. Я запускаю два одинаковых скрипта Python для разных пользователей, один должен быть защищен cgroups, другой - root. cpu.shares — 100 и 1024 соответственно. Но процессы практически поровну делят процессор. @twalberg   -  person Judking    schedule 30.05.2015


Ответы (1)


Кажется, что настройка cgroups cpu.shares должна быть правильно применена.

Современный компьютер обычно имеет многоядерный процессор. Сценарий Python, используемый для тестирования, может использовать только 100% одного ядра. Поэтому, если все еще есть свободные ядра процессора, другой скрипт также может использовать 100% этого ядра.

Лучший способ протестировать cpu.shares — запустить количество процессов, превышающее количество ядер процессора.

cat /proc/cpuinfo для указания количества ядер процессора.

person Shuangistan    schedule 29.03.2016