home.social

#libcgroup — Public Fediverse posts

Live and recent posts from across the Fediverse tagged #libcgroup, aggregated by home.social.

  1. Если надо ограничить аппетит какой-то программы в плане #CPU или же по памяти, то в случае #linux для этого прекрасно подходит #cgroups. Вот только в системах на #systemd нет смысла:
    • руками создавать в /sys/fs/cgroup/
    • пользоваться #libcgroup (cgreate/cgset/cgexec).

    У некоторых дистрибутивов последнее это вообще deprecated — у RHEL и у SLES.

    Легко и просто

    Вся операция умещается в запуск через:
    systemd-run --scope -p CPUQuota=15% /usr/bin/binaryname
    Или же чуть более продвинуто:
    systemd-run -u username -p CPUQuota=50% -p MemoryMax=100M /usr/bin/binaryname

    А если руками?
    Это когда:
    # mkdir /sys/fs/cgroup/lalala
    # echo "50000 100000" > /sys/fs/cgroup/lalala/cpu.max
    # echo "100M" > /sys/fs/cgroup/lalala/memory.max
    # echo $$ >> /sys/fs/cgroup/lalala/cgroup.procs
    # /usr/bin/binaryname
    # rmdir /sys/fs/cgroup/lalala

    При этом ещё и помнить, что если два ядра на #ЦПУ, то возможно и «200000 100000», а потому echo "50000 100000" будет давать 25%, а не 50% как на компе с одним ядром.

    А используя #libcgroup ?
    Это когда:
    # cgexec -g cpu,memory:tatata /usr/bin/binaryname
    # cgdelete -g cpu,memory:/tatata

    Или же долго-нудно, почти в ручном режиме:
    # cgcreate -g cpu,memory:/tatata
    # cgset -r cpu.max="50000 100000" tatata
    # cgset -r memory.max="100M" tatata
    Далее, два варианта действий, как и при «ручном»:
    • текущий shell перевести в tatata и выполнить из под него binaryname:
      # echo $$ >> /sys/fs/cgroup/lalala/cgroup.procs
      # /usr/bin/binaryname
      # rmdir /sys/fs/cgroup/lalala
    • запустив процесс binaryname и переместить его по PID в tatata:
      # BIN_PID=$(pgrep -xo hog)
      # cgclassify -g cpu,memory:tatata ${BIN_PID}
      # cgdelete -g cpu,memory:/tatata


    На фоне всего этого использование systemd-run не только соблюдает принцип одного менеджера файловой системы #cgroupfs в системе, но и ощутимо проще для пользователя.

    Кстати, ограничение игр проще делать через «Frame limit» — задав максимальное количество кадров в секунду. Например, поставив 60fps или 90fps, 120fps, в зависимости от того, с какой частотой монитор работает. Перестают жрать ЦПУ высчитывая несколько тысяч fps.

    #lang_ru