LINUX.ORG.RU
решено ФорумAdmin

Лимит CPU для сервиса

 ,


1

1

Запускаю сервис в nspawn
В юните прописано

ExecStart=/sbin/systemd-nspawn --register=no -D /opt/acestream.engine/androidfs /system/bin/sh /system/bin/acestream.sh
CPUQuota=10%

Почему лимит не работает?
С другими сервисами все работает.

★★★★★

Быстро проверить, работает или нет через stress от рута

systemd-run -p CPUAccounting=yes -p CPUQuota=N stress --cpu M
где M - количество потоков, а N - M*100/2. Средняя общая загрузка должна держаться в районе 50%.

От юзера у меня не работает лимит. Почему не разбирался.

Yorween ()
Ответ на: комментарий от Yorween

Работает. Я же написал, что проблем с ограничением других сервисов нет. Проблема именно с systemd-nspawn, т.е. все, что в нем запускается, плевать хотело на ограничения.

athost ★★★★★ ()
Последнее исправление: athost (всего исправлений: 1)

Почему лимит не работает?

Потому что nspawn запускает нагрузку в отдельной cgroup, не являющейся потомком cgroup сервиса (а CPUQuota= и прочие подобные директивы настраивают именно её).

intelfx ★★★★★ ()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

Спасибо, что-то подобное я и предполагал, но пока не разобрался, как правильно вылечить именно nspawn.
В chroot этот сервис у меня запускается и квоты systemd работают, но хотелось бы именно nspawn.

athost ★★★★★ ()
Ответ на: комментарий от athost

Stress из контейнера, mpstat и квота из хоста.

systemd-nspawn -b -D ~/storage0/temp/arch-container
[root@arch ~]# stress -c 4

21:22:53     all  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
21:22:54     all   99.75    0.00    0.00    0.00    0.25    0.00    0.00    0.00    0.00    0.00
21:22:55     all  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
21:22:56     all  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
21:22:57     all  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
21:22:58     all  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
21:22:59     all  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
21:23:00     all   99.75    0.00    0.00    0.00    0.25    0.00    0.00    0.00    0.00    0.00
21:23:01     all  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
systemctl set-property machine-arch.scope CPUQuota=200%
21:23:02     all   79.31    0.00    0.25    0.00    0.25    0.00    0.00    0.00    0.00   20.20
21:23:03     all   53.09    0.00    0.99    0.00    0.74    0.00    0.00    0.00    0.00   45.19
21:23:04     all   51.84    0.00    0.00    0.00    0.25    0.00    0.00    0.00    0.00   47.91
21:23:05     all   51.96    0.00    0.25    0.00    0.00    0.25    0.00    0.00    0.00   47.55
21:23:06     all   51.60    0.00    0.25    0.00    0.00    0.00    0.00    0.00    0.00   48.16
21:23:07     all   51.35    0.00    0.74    0.00    0.25    0.00    0.00    0.00    0.00   47.67
21:23:08     all   51.83    0.00    0.24    0.00    0.24    0.00    0.00    0.00    0.00   47.68
21:23:09     all   52.07    0.00    0.73    0.00    0.49    0.00    0.00    0.00    0.00   46.72
21:23:10     all   51.71    0.00    0.24    0.00    0.24    0.49    0.00    0.00    0.00   47.32
Yorween ()
Ответ на: комментарий от athost

Есть аж три способа.

  1. Передать свойства nspawn-у через аргумент systemd-nspawn --property=, чтобы он выставил их на своей cgroup:

    /etc/systemd/system/foo.service:

    [Service]
    ExecStart=/sbin/systemd-nspawn -p CPUQuota=10% ...
    
  2. Задать свойства в кастомном slice и указать на него nspawn-у через аргумент systemd-nspawn --slice=:

    /etc/systemd/system/machine-foo.slice:

    [Slice]
    CPUQuota=10%
    

    (название слайса должно начинаться с machine-, потому что так задаётся иерархия)

    /etc/systemd/system/foo.service:

    [Service]
    ExecStart=/sbin/systemd-nspawn -S machine-foo.slice ...
    
  3. Заюзать systemd-nspawn --keep-unit, чтобы nspawn не пытался создавать отдельную cgroup:

    [Service]
    ExecStart=/sbin/systemd-nspawn --keep-unit --register=no ...
    CPUQuota=10%
    

Если у тебя есть есть --keep-unit, сделай как в (3).

intelfx ★★★★★ ()
Ответ на: комментарий от intelfx

1. Передать свойства nspawn-у через аргумент systemd-nspawn --property=

Работает

/sbin/systemd-nspawn --property=CPUQuota=12% --register=no -D /opt/acestream.engine/androidfs /system/bin/sh /system/bin/acestream.sh

3. Заюзать systemd-nspawn --keep-unit

Вроде работает, но как-то странно — нагрузка снизилась, но не до указанного значения.

Второй способ не пробовал.
Большое спасибо, проблема решена.

athost ★★★★★ ()
Ответ на: комментарий от athost

Вроде работает, но как-то странно — нагрузка снизилась, но не до указанного значения.

Только что проверил — у меня работает. Delegate=yes вписать попробуй ещё, если есть желание.

intelfx ★★★★★ ()