Если надо ограничить аппетит какой-то программы в плане #
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/tatata/cgroup.procs
# /usr/bin/binaryname
- запустив процесс 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