CPULimit: чуть помедленнее, кони!






Когда-то тактовая частота процессора моего компьютера равнялась 800 мегагерцам. И, знаете, тогда мне казалось этого более, чем достаточно. Да, бывали времена, когда сборку нового ядра или, например, GNOME, приходилось «заряжать» перед тем, как ложился спать, а утром всё ещё наблюдать усердную работу компилятора и линковщика, управляемых программой make. В остальном вычислительной мощности моего «тогдашнего» железа хватало вполне.

И кто бы мог мог подумать, что сегодня, когда моя «железка» имеет на борту двухядерный микропроцессор и 2 гигабайта памяти, мне будет этого мало. Да, времена меняются, задачи вместе с ними. И так уж стало получаться, что в разгар работы над каким-нибудь срочным и интересным заданием, в мою жизнь врывается... Внезапно стартовавший cron'ом процесс. И не надо мне говорить, что «можно бы и на ночь запланировать»! Будто бы все мы в течение всей жизни гарантированно спим каждую ночь...


Решение было принято практически мгновенно: «резать» количество отведённых аппаратных ресурсов системы для важного, но прожорливого процесса. Кстати, уверен, редко у кого «прожорливый процесс» живёт в одном-единственном экземпляре.

Из всех известных мне методов ограничения «прожорливости» процесса имелись только nice и renice, позволяющие управлять приоритетом запущенных процессов. Однако, в какой-то момент в памяти всплыла утилита, упомянутая как-то в конференции Ubuntu-Ru, до которой всё никак не доходили ноги попробовать её в работе.

Речь идёт об утилите cpulimit авторства Angelo Marletta. Эта простая программа позволяет ограничивать процент использования процессорного времени запущенным процессом или группой процессов. Принцип её работы заключается в отслеживании потребляемого процессорного времени указанными процессами путём анализа информации из файловой системы procfs и отправке процессам сигналов SIGSTOP и SIGCONT в определённые моменты времени.

Установка

Получить исходные коды программы можно на странице загрузок проекта по адресу http://sourceforge.net/projects/cpulimit/files/ и собрать утилиту традиционным способом:

После того, как make закончит свою работу, вы получите исполняемый файл с именем cpulimit, который можно будет разместить в каталоге /usr/local/bin при необходимости.

Если же вы являетесь пользователем Ubuntu или любой другой ОС, в которой cpulimit включена в репозитарии, можно установить сразу бинарный вариант, не прибегая к компиляции исходных кодов. В моей Ubuntu 10.04 установка cpulimit была успешно выполнена командой

Работа

При помощи cpulimit можно ограничивать процессы по следующим параметрам:

  1. по идентификатору (опция --pid);
  2. по имени (опция --exe);
  3. по абсолютному пути к исполняемому файлу (опция --path).

Для примера запустим архивирование большого количества файлов командой:

И посмотрим, как cpulimit будет выполнять свою работу.

Ограничение по идентификатору процесса

Сначала, естественно, необходимо выяснить идентификатор запущенного процесса. Если вы запускаете команду в фоновом режиме, как показано в примере, то в bash идентификатор процесса запущенной в фоне программы можно узнать, обратившись к содержимому переменной окружения $!. Таким образом, «натравить» cpulimit на запущенный накануне фоновый процесс можно так:

После запуска cpulimit увидим примерно следующее:

Как видим, после короткой рекомендации по улучшению производительности, cpulimit сообщила о том, что запрошенный нами процесс обнаружен. Теперь cpulimit будет постоянно наблюдать за деятельностью указанного процесса, не давая ему сильно
нагружать процессор.

Ограничение по имени процесса

Довольно часто возникает необходимость ограничить какой-либо процесс, не зная его PID или не прибегая к манипуляциям для его выяснения. В этом случае вызов cpulimit будет следующим:

Ограничение по абсолютному пути к исполняемому файлу процесса

Если вам необходимо, чтобы cpulimit отслеживала деятельность какого-либо процесса, основываясь на его местоположении в файловой системе, вы можете использовать подобную конструкцию:

Вот так, «простенько и со вкусом» можно ограничивать используемый процент процессорного времени процессами, не прибегая к изменению их приоритета. И потом, изменяя приоритет процесса, ведь, невозможно точно узнать долю процессорного времени, «пожираемого» процессом. Так что, уверен, cpulimit может занять достойное место среди ваших повседневных инструментов.




CPULimit: чуть помедленнее, кони!: 6 комментариев

  1. Вопрос, а если запущено 2 процесса с одинаковым именем process_name и запущен cpulimit -e process_name -l 50, то каждому по 50% или всем процессам с таким именем только 50%?

  2. Артем, cpulimit в этом случае будет работать только с одним процессом, имеющим указанное имя и наименьший PID. Если вам необходимо управлять несколькими одноимёнными процессами, указывайте их PIDы, а не имена.

  3. Подскажите, как реализовать ограничение CPU не по процессам, а по пользователям.

    допустим User1 — 10%; User2 — 20%: User3 — 50%?

    1. MainRoot, посмотрите лучше в сторону man 5 limits.conf, разбейте ваших пользователей по группам и властвуйте! Утилитку же cpulimit лучше оставить для личных нужд каждого пользователя.

Комментарии запрещены.