Блог ИТ склеротика. CPULimit: чуть помедленнее, кони!

Страницы

Расширенный поиск в статьях блога

28 февраля 2012 г.

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


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


Решение было принято практически мгновенно: «резать» количество отведённых аппаратных ресурсов системы для важного, но прожорливого процесса. Кстати, уверен, редко у кого «прожорливый процесс» живёт в одном-единственном экземпляре.
Из всех известных мне методов ограничения «прожорливости» процесса имелись только niceи renice, позволяющие управлять приоритетом запущенных процессов. Однако, в какой-то момент в памяти всплыла утилита, упомянутая как-то в конференции Ubuntu-Ru, до которой всё никак не доходили ноги попробовать её в работе.
Речь идёт об утилите cpulimit авторства Angelo Marletta. Эта простая программа позволяет ограничивать процент использования процессорного времени запущенным процессом или группой процессов. Принцип её работы заключается в отслеживании потребляемого процессорного времени указанными процессами путём анализа информации из файловой системы procfs и отправке процессам сигналов SIGSTOP и SIGCONT в определённые моменты времени.

Установка

Получить исходные коды программы можно на странице загрузок проекта по адресуhttp://sourceforge.net/projects/cpulimit/files/ и собрать утилиту традиционным способом:
tar -zxf cpulimit-xxx.tar.gz
cd cpulimit-xxx
make
После того, как make закончит свою работу, вы получите исполняемый файл с именемcpulimit, который можно будет разместить в каталоге /usr/local/bin при необходимости.
Если же вы являетесь пользователем Ubuntu или любой другой ОС, в которой cpulimit включена в репозитарии, можно установить сразу бинарный вариант, не прибегая к компиляции исходных кодов. В моей Ubuntu 10.04 установка cpulimit была успешно выполнена командой
sudo apt-get install cpulimit

Работа

При помощи cpulimit можно ограничивать процессы по следующим параметрам:
  1. по идентификатору (опция --pid);
  2. по имени (опция --exe);
  3. по абсолютному пути к исполняемому файлу (опция --path).
Для примера запустим архивирование большого количества файлов командой:
tar -czf ./files.tgz /path/to/files &
И посмотрим, как cpulimit будет выполнять свою работу.

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

Сначала, естественно, необходимо выяснить идентификатор запущенного процесса. Если вы запускаете команду в фоновом режиме, как показано в примере, то в bash идентификатор процесса запущенной в фоне программы можно узнать, обратившись к содержимому переменной окружения $!. Таким образом, «натравить» cpulimit на запущенный накануне фоновый процесс можно так:
tar -czf ./files.tgz /path/to/files &
cpulimit --pid=$! --limit=50
После запуска cpulimit увидим примерно следующее:
Warning: cannot renice.
To work better you should run this program as root, or adjust RLIMIT_NICE.
For example in /etc/security/limits.conf add a line with: * - nice -10
Process 12612 detected
Как видим, после короткой рекомендации по улучшению производительности, cpulimit сообщила о том, что запрошенный нами процесс обнаружен. Теперь cpulimit будет постоянно наблюдать за деятельностью указанного процесса, не давая ему сильно
нагружать процессор.

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

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

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

Если вам необходимо, чтобы cpulimit отслеживала деятельность какого-либо процесса, основываясь на его местоположении в файловой системе, вы можете использовать подобную конструкцию:
cpulimit --path=/bin/tar --limit=50
Вот так, «простенько и со вкусом» можно ограничивать используемый процент процессорного времени процессами, не прибегая к изменению их приоритета. И потом, изменяя приоритет процесса, ведь, невозможно точно узнать долю процессорного времени, «пожираемого» процессом. Так что, уверен, cpulimit может занять достойное место среди ваших повседневных инструментов.

.

Счетчик тИЦ и PR Яндекс.Метрика Msn bot last visit powered by MyPagerank.NetYahoo bot last visit powered by MyPagerank.Net ping fast  my blog, website, or RSS feed for Free