
У меня есть несколько процессов с одинаковыми именами — они занимают 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