4

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

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

4 ответа4

4

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

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

3

Вы можете сделать это с помощью команд bash shell, 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, которая делает примерно то же самое.

2

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

nice -20 some_command

дает some_command самый высокий приоритет, и

nice 19 some_command

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

0

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

скажем, когда процессор достигнет 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .