cpulimit — ограничиваем использование процессом ресурсов процессора

Привет читатель!
Иногда в процессе работы возникает необходимость в ограничении «пожирания» процессом процессорного времени. Возможно, вы подумали об утилите nice / renice, но это из другой оперы — это приложения для установки приоритета процесса для планировщика процессорного времени Linux.

Недостаток данного метода заключается в том, что когда планировщик «свободен», он допускает выполнение данного процесса на 100% времени ЦП. Как следствие — значение LA не опускалось ниже 1.00 (очередь планировщика забита на 100%) Задача, которую мне необходимо было преследовать — ограничить потребление процессом процессорного времени без оглядки на загруженность планировщика, тобишь привести значения load average (LA) к значениям, примерно 0.50 (к примеру; разумно использовать 70% процессорного времени, тобишь la 0.70 для 1-ядерной машины или, к примеру, 3,70 для 4-ядерной). Нам на помощь приходит приложение cpulimit.
Суть работы этого приложения проста — послание UNIX сигналов SIGSTOP для приостановки выполнения приложения и SIGCONT для продолжения выполнения приложения. Соответственно, когда приложение использует много процессорного времени, cpulimit посылает SIGSTOP приложению, а после определенного промежутка времени cpulimit посылает сигнал SIGCONT для продолжения выполения.
Установка занимает одну строку — cpulimit есть в main репозитории Debian GNU/Linux / Ubuntu. Насчет RHEL / Centos не уверен, наверное есть в EPEL. Для Debian GNU/Linux установка производится посредством пакетного менеджера apt:

root@get:# apt-get install cpulimit

Вывод справки cpulimit --help с переводом на русский:

root@srv:~# cpulimit --help
CPUlimit version 2.1
Usage: cpulimit TARGET [OPTIONS...] [-- PROGRAM]
   TARGET must be exactly one of these:
      -p, --pid=N        pid of the process - pid процесса
      -e, --exe=FILE     name of the executable program file - имя исполняемого файла
                         The -e option only works when - опция -e работает только если
                         cpulimit is run with admin rights. - cpulimit работает от root
      -P, --path=PATH    absolute path name of the - абсолютный путь к исполняемому файлу
                         executable program file
   OPTIONS
      -b  --background   run in background - работать в фоновом режиме
      -c  --cpu=N        override the detection of CPUs on the machine. - установка кол-ва ЦП на машине
      -l, --limit=N      percentage of cpu allowed from 1 up. - требуемый процент загрузки ЦП в процентах
                         Usually 1 - 100, but can be higher - обычно 1-100, но может быть больше
                         on multi-core CPUs (mandatory) - на многоядерных машинах
      -q, --quiet        run in quiet mode (only print errors). - тихий режим (выводит только ошибки)
      -k, --kill         kill processes going over their limit - "убивать" процесс если превышен лимит
                         instead of just throttling them. - вместо ограничения процессорного времени
      -r, --restore      Restore processes after they have - восстанавливать процесс после того, как
                         been killed. Works with the -k flag. - он был убит. Работает с ключем '-k'
      -s, --signal=SIG   Send this signal to the watched process when cpulimit exits. - послать сигнал когда cpulimit
                         Signal should be specificed as a number or - завершит выполнение. Задается кодом сигнала
                         SIGTERM, SIGCONT, SIGSTOP, etc. SIGCONT is the default. - или названием сигнала.
      -v, --verbose      show control statistics - показывать статистику по таймингам работы / приостановки (в нс)
      -z, --lazy         exit if there is no suitable target process, - "ленивый режим". cpulimit не будет работать
                         or if it dies - если процесс не найден или процесс выгрузился из памяти.
          --             This is the final CPUlimit option. All following - последняя опция для cpulimit.
                         options are for another program we will launch. - следующие ключи относятся к программе, которая запускается
      -h, --help         display this help and exit - эта инструкция

Пример ограничения загрузки процессора ffmpeg’ом:

sh -c 'sleep 5 && cpulimit -e ffmpeg -bqzl 85 &' &
nice -n 19 ffmpeg -i "$input"\
"ffmpeg params"

Как видно из скрипта, я использую следующую конструкцию:
— Запускаю новый шелл с sleep’ом 5 и выполнением cpulimit’а в режиме background+quiet+lazy+limit 85;
— Запускаю процесс ffmpeg с самым низким приоритетом nice 19.

Обращаю Ваше внимание на знак амперсанда после первой строчки — вторая строчка с ffmpeg’ом запускается без ожидания выполнения первой (запуск шелла с командой на cpulimit). Сделано это было для того, чтобы cpulimit точно подцепил ffmpeg. Были прецеденты, когда cpulimit успевал не найти процесс ffmpeg’а, и, не найдя его, говорил «пока», а ffmpeg молотил во всю мощь, из-за чего были проблемы нарваться на грубость со стороны хостера.
Есть способ запуска легче, через pid последнего выполненного процесса (переменная $! шелла), но в случае с ffmpeg она не подходит (невозможно наблюдать процесс кодирования).

Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s