Как ограничить потребление ресурсов ЦП группой процессов с помощью стандартных инструментов GNU/Linux?

Как ограничить потребление ресурсов ЦП группой процессов с помощью стандартных инструментов GNU/Linux?

У меня есть несколько процессов с одинаковыми именами — они занимают 100% процессорного времени, я хочу, чтобы оно составляло не более 50%.

Как это сделать без установки дополнительного программного обеспечения?

решение1

Для получения информации о механизме на уровне ядра вам необходимо прочитать о Linux.Контрольные группы. Эта область все еще находится в активной разработке, поэтому вам нужно убедиться, что прочитанное вами соответствует ядру, которое у вас есть (или которое вы хотите установить).

Хотя вы сказали не устанавливать ничего дополнительного, вы можете рассмотреть установку cgredдля автоматизации процессов перемещения с соответствующими именами для вашей cgroup CPU. В Debian это в cgroup-binпакете.

решение2

Это можно сделать с помощью команд оболочки bash, sleep, pgrep и pkill, используя сигналы STOP и CONT.

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

while [ True ]; do pkill -STOP processname; sleep 0.1s; pkill -CONT processname; sleep 0.1s; done

Вот тот же код, разделенный на несколько строк для удобства чтения:

while [ True ]
     do pkill -STOP processname
     sleep 0.1s
     pkill -CONT processname
     sleep 0.1s
done

Независимо от того, сколько процессов существует, соответствующих шаблону имени процесса, они не могут превышать 50% использования ЦП, поскольку все они останавливаются и продолжаются одновременно - это означает, что им нужно делить доступное время ЦП между собой, когда они активны. Это гарантирует соблюдение лимита.

Есть программа cpulimit, которая делает примерно то же самое.

решение3

Без установки дополнительного программного обеспечения у вас есть nice. Диапазон значений от-20к19.

nice -20 some_command

даетsome_commandнаивысший приоритет, и

nice 19 some_command

даетsome_commandсамый низкий приоритет.

решение4

как написано выше, может быть использован в качестве скрипта для помощи OOM-killer или предотвращения его использования.

скажем, когда общая загрузка процессора достигнет 75% в течение x минут, запустите pkill.sh

 ../scripts/boottime/OOMkiller.sh

while [ true] ; 
    do  inxi -tcm5 > ~/cpu.log 
    sleep 0.5s 
    inxi -tcm5 >> ~/cpu/log | diff -m > ~/offender.log
done

for i in offender.log ;
    do ./scripts/pkill.sh
done

 ../scripts/pkill.sh
while [true] 
    do pgrep $(i) -STOP $PID
    pkill -STOP $PID
    sleep 0.5s 
    pkill -CONT $PID
done

Связанный контент