Я действительно не вижу, почему Вы хотите ограничить процессорное время... необходимо ограничить общую нагрузку на той машине, и загрузка определяется операциями IO главным образом. Исключая: если я создам некоторое время (1) {} цикл, то это получит общую нагрузку к 1,0, но если этот цикл делает некоторые записи на диск переходы загрузки к 2,0... 4.0. И это что, уничтожая Вашу машину, не использование ЦП. Использование ЦП может быть легко обработано nice/renice.
Так или иначе, Вы могли сделать сценарий, который делает, 'уничтожают-SIGSTOP PID' для определенного PID, когда загрузка становится слишком высокой, и уничтожьте-SIGCONT, когда все возвращается к нормальному... PID может быть определен при помощи 'пкс aux' команда, потому что я вижу, что это отображает использование ЦП, и необходимо смочь отсортировать список с помощью того столбца. Я думаю это, все это могло быть сделано в ударе...
Вы могли уменьшить масштаб частоты ЦП. Затем Вы не должны волноваться об отдельных процессах. Когда Вы нуждаетесь в большем количестве CPU, сокращаете частоту.
Бросок некоторых вызовов сна там должен вызвать процесс от ЦП в течение определенного времени. Если Вы спите 30 секунд однажды минута, Ваш процесс не должен составлять в среднем больше чем 50%-е использование ЦП в течение той минуты.
Это может быть сделано с помощью setrlimit (2) (конкретно параметром установки RLIMIT_CPU).
Почему ограничивают процент ЦП, когда можно просто скорректировать приоритет процесса с помощью renice? Используя renice и установку низкого приоритета позволяет процессу все еще использовать 100% процессора, если это доступно, но любой другой процесс с более высоким приоритетом получит процесс, когда этому будет нужен он почти ни с какой значимой задержкой.
Я не помню и не думаю, что в планировщике Unix было что-то вроде этого. Вам нужно немного программы, которая управляет другим процессом и делает следующее:
loop
wait for some time tR
send SIGSTOP to the process you want to be scheduled
wait for some time tP
send SIGCONT to the process.
loopEnd
отношение tR/tP управляет загрузкой ЦП.
<час>Вот немного подтверждения концепции. "занятый" программа, которая израсходовала Ваше процессорное время и которая Вы хотите быть вниз замедленными "замедлением":
> cat > busy.c:
main() { while (1) {}; }
> cc -o busy busy.c
> busy &
> top
Tasks: 192 total, 3 running, 189 sleeping, 0 stopped, 0 zombie
Cpu(s): 76.9% us, 6.6% sy, 0.0% ni, 11.9% id, 4.5% wa, 0.0% hi, 0.0% si
Mem: 6139696k total, 6114488k used, 25208k free, 115760k buffers
Swap: 9765368k total, 1606096k used, 8159272k free, 2620712k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
26539 cg 25 0 2416 292 220 R 90.0 0.0 3:25.79 busy
...
> cat > slowDown
while true; do
kill -s SIGSTOP $1
sleep 0.1
kill -s SIGCONT $1
sleep 0.1
done
> chmod +x slowDown
> slowDown 26539 &
> top
Tasks: 200 total, 4 running, 192 sleeping, 4 stopped, 0 zombie
Cpu(s): 48.5% us, 19.4% sy, 0.0% ni, 20.2% id, 9.8% wa, 0.2% hi, 2.0% si
Mem: 6139696k total, 6115376k used, 24320k free, 96676k buffers
Swap: 9765368k total, 1606096k used, 8159272k free, 2639796k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
26539 cg 16 0 2416 292 220 T 49.7 0.0 6:00.98 busy
...
<час> хорошо, для того сценария нужна еще некоторая работа (например, чтобы заботиться о том, чтобы быть INTR-upted и позволить управляемому процессу продолжиться в случае, если это было остановлено в тот момент), но Вы понимаете. Я также записал бы, что мало сценария в C или подобный и вычисляет отношение CPU из аргумента строки команды....
отношения
Я вижу по крайней мере две опции: