LINUX.ORG.RU
ФорумAdmin

Ограничить максимальную нагрузку на CPU

 , , ,


0

6

Задача: Нужно запускаемый процесс ограничить по времени выполнения и отдавать ему минимальное количество ресурсов процессора, к примеру 1%.

Моя команда:

timeout 15s cpulimit -l 1 -b apps/lesson/tmp/compile/30/44/main.c

Получаю сообщение: Process 19816 detected

Проблема в том, что в такой команде срабатывает только cpulimit, таймаут не убивает процесс по истечению 15 сек.

Если же просто запускать команду без cpulimit, таймаут срабатывает:

timeout 15s apps/lesson/tmp/compile/30/44/main.c

Но процесс грузит процессор на 100%, этого быть не должно. Все что я хочу сделать, это чтобы запускаемый процесс потреблял около 1% CPU и через 15 выключался по таймауту, если не завершится ранее.

Помогите объединить эти две команды.


Ответ на: комментарий от anc

не работает с кавычками

timeout: не удалось выполнить команду «cpulimit -l 3 -b apps/lesson/tmp/compile/30/44/main.c»: Нет такого файла или каталога

ckcnik
() автор топика
Ответ на: комментарий от anc

Так команда работает, но таймаут не убивает процесс

То есть, отрабатывает так как и в случае запуска без кавычек: timeout 15s cpulimit -l 1 -b apps/lesson/tmp/compile/30/44/main.c

Получается, cpulimit применился, а таймаут - нет. В этом и проблема.

ckcnik
() автор топика
Ответ на: комментарий от anc

Мысль возникла, возможно процесс не хочет киляться (на TERM не реагирует), попробуйте timeout -s 9 15s

anc ★★★★★
()
Ответ на: комментарий от anc

Процесс не дропается

Процесс не дропается, кроме того, он как бы не в фоне запускается, вот скрин - http://joxi.ru/krD9q50u0Ee1vm Ждет нажатия клавиши, не знаю насколько это критично. В любом случае процесс остается работать.

ckcnik
() автор топика
Ответ на: комментарий от yacuken

Не здесь про другое, timeout-у команда в качестве аргумента нужна, а вы написали вывод результата выполнения команды.

anc ★★★★★
()
Ответ на: Процесс не дропается от ckcnik

Ну или если не заморачиваться с выводом на экран, то типа такого

cmd='cpulimit -l 1 -b apps/lesson/tmp/compile/30/44/main.c';
$cmd &
sleep 15
pkill -9 -f $cmd 
не проверял, написал как придумалось
или
cpulimit -l 1 -b apps/lesson/tmp/compile/30/44/main.c&
pid=$!
sleep 15
kill -9 $pid

anc ★★★★★
()
Последнее исправление: anc (всего исправлений: 3)
Ответ на: комментарий от yacuken

Так тоже не дропается

И запускается не в фоне. Дописал амперсанд в конец команды, но процесс все равно не дропнулся.

ckcnik
() автор топика
Ответ на: комментарий от anc

Флаг -s 9 никак не повлиял на команду

Выполнил с флагом -s 9: timeout -s 9 15s cpulimit -l 1 /home/denis/PycharmProjects/contest.cppstudio.com/undercpp/apps/lesson/tmp/compile/30/44/main.c

Команда отработала точно так, как и без него работала. Процесс не дропнулся.

ckcnik
() автор топика
Ответ на: комментарий от anc

Команда sleep не подходит.

Такой вариант работает, и процесс дропается и cpulimit срабатывает, НО sleep - всегда процесс завершает после 15 сек. А в моем случае, процессы обычно завершаются после 1 - 2 сек. А таймаут на 15 сек я ставлю для критических случаев, чтобы, если вдруг процесс зависнет - его автоматом дропнуло.

ckcnik
() автор топика
Ответ на: комментарий от anc

Сокет будет ждать 15 сек

Проблема в том, что со слипом у меня сокет (который принимате запросы из веба) будет висеть всегда 15 сек, не зависимо от ситуации. То есть и пользователь будет ждать 15 сек всегда. Думаю, всем понятно, что это не хорошо.

ckcnik
() автор топика
Ответ на: Сокет будет ждать 15 сек от ckcnik

С чего бы это? Если ваша софтина нормально отработала положенные 1-2 секунды и завершилась, то причем здесь sleep -то? Он к ней вообще никакого отношения не имеет.

anc ★★★★★
()

По идее, можно организовать в виде юнита systemd.
Там как раз есть директивы CPUQuota и JobTimeoutSec.

ArcFi
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.