- Как ограничить использование центрального процессора и памяти в Linux
- Контроль использования центрального процессора и памяти в Linux
- Как установить timeout
- Опции timeout:
- Как ограничить время выполнения программы (нагрузку на процессор)
- Как ограничить потребление памяти
- Как ограничить использование процессорного времени и памяти
- Ограничение нагрузки на процессор с множеством коротких дочерних процессов
- Продвинутые опции
- Сбор информации о «тяжёлых» процессах:
- Сбор статистики о «лёгких» дочерних процессах
- Выявление зависаний в программе:
- Как ограничить использование процессора программой в Linux
- Перегрев и тормоза компьютера
- Ограничение использование центрального процессора (с помощью cpulimit)
- Контроль нагрузки на центральный процессор создаваемой группой программ
- Заключение
Как ограничить использование центрального процессора и памяти в Linux
Контроль использования центрального процессора и памяти в Linux
Скрипт timeout — это полезная программа мониторинга использования ресурсов. Она ограничивает потребление времени и памяти процессом Linux. Это позволяет вам запускать программу под контролем, указав ограничения по времени и памяти, если программа нарушит эти пределы, то она будет остановлена.
Особенностью этого скрипта является то, что он не только контролирует родительский процесс, но также учитывает его дочерние форки. Вы можете выбрать, ограничен ли объем наблюдаемых процессов группой процессов или деревом процессов.
Программа не требует установки и у неё практически нет зависимостей (только Perl 5), она запускает программу вместе с её аргументами и контролирует её потребление ресурсов, если программа выходит за пределы, то она завершается, а пользователь уведомляется сообщением.
Программа timeout работает по принципу «чёрного ящика», то есть не требует какой-либо настройки самих процессов.
Обратите внимание, что данный скрипт не является одноимённой программой timeout из coreutils — это две разные программы.
Ещё нужно обязательно упомянуть Cgroups (Control Groups), которая контролирует потребление ресурсов системы на уровне ядра. По сравнению с рассматриваемым скриптом timeout, Cgroups сложнее в использовании, но и возможностей там больше.
Как установить timeout
Для работы скрипта на вашей системе Linux нужен установленный Perl 5 и смонтированная файловая система /proc.
Для проверки версии Perl на вашей системе Linux запустите следующую команду:
Теперь нужно скачать сам скрипт — можно клонировать весь репозиторий https://github.com/pshved/timeout или скачать всего один файл:
Поскольку у меня установлена программа timeout из пакета coreutils, то чтобы не вызывать путаницу, я не стал копировать этот скрипт в системную директорию исполнимых файлов. Поэтому я буду вызывать программу по относительному пути так (когда нахожусь в директории со скриптом):
Также программу можно вызывать по абсолютному пути (независимо от вашей текущей рабочей папки) — но у вас путь до файла будет другим:
Опции timeout:
Базовыми опциями являются:
- -t T — устанавливает лимит времени CPU+SYS на T секунд
- -m M — устанавливает лимит времени виртуальной памяти на M килобайт
- TIMEOUT_IDSTR переменная_окружения — строка добавляемая к сообщению о нарушении лимитов использования ресурсов (для разграничения от строк, печатаемых самой командой). Само сообщение может быть:
- TIMEOUT — лимит времени закончился
- MEM — лимит памяти израсходован
- HANGUP — обнаружено зависание (смотрите ниже)
- SIGNAL — процесс timeout был убит сигналом
После этого сообщения печатается количество секунд, которое проработал процесс.
Как ограничить время выполнения программы (нагрузку на процессор)
Для ограничения времени выполнения используется опция -t после которой указывается количество секунд, которое должен проработать скрипт. Пример ограничения работы четыремя секундами:
В выводе показана статистика использования процессора и памяти. Обратите внимание, что имеется ввиду процессорное время, то есть нагрузка на ЦПУ. Чтобы разница была более понятной, посмотрите на следующий пример:
Он проработает не 4 секунды, а 20 секунд, поскольку нагрузка на процессор отсутствует. В выводе будет показано:
Как ограничить потребление памяти
В следующем примере программа будет работать любое количество времени, но если она её потребление ресурсов превысит 10 гигабайт памяти, то она будет остановлена:
Посмотрите на скриншот, на нём видно, как программа постепенно увеличивала количество занятой памяти, а потом была завершена из-за превышения лимита:
Как ограничить использование процессорного времени и памяти
В следующем примере количество используемой памяти ограничено 1 гигабайтом и процессорное время ограничено 9 секундами:
Как можно увидеть, было потреблено менее трёх секунд процессорного времени, а программа была завершена из-за превышения лимита памяти.
Ограничение нагрузки на процессор с множеством коротких дочерних процессов
То есть программа timeout успешно подсчитывает не только ресурсы основного процесса, но и дочерних процессов.
Продвинутые опции
- -p .*regexp1.*,ИМЯ1;.*regexp2.*,ИМЯ2 — собирает статистику для дочерних процессов с указанными командами. ИМЕНА определяют сегменты, а regexps (регулярные выражения в формате Perl) определяют совпадение дочерних процессов, которые попадают в эти сегменты.
Если шаблон начинается с CHILD:, тогда в эту категорию собирается информация о работе дочерних совпадающих процессах (поиск совпадений выполняется по остальному шаблону). Обратите внимание, что это единственный способ собрать статистику потреблённого времени дочерними процессами, которые длятся только доли секунды. - -o файл_вывода — файл для сброса статистики сегментов, собранной опцией -p
- —detect-hangups — выключить выявление зависаний. Если вы указали фрагмент опцией -p, тогда если CPU время в любом из фрагментов не увеличивается во время некоторого времени, то скрипт timeout приходит к выводу, что контролируемый процесс завис и выключает его.
- —no-info-on-success — отключает вывод статистики использования если контролируемый процесс успешно завершил работу.
- —confess, -c — при выключении контролируемого процесс возвращает его код выхода или сигнал+128. Это также приводит к тому, что timeout ожидает пока контролируемый процесс не завершиться. Без этой опции скрипт возвращает толь.
- —memlimit-rss, -s — монитор лимита памяти RSS (resident set size)
Сбор информации о «тяжёлых» процессах:
Сбор статистики о «лёгких» дочерних процессах
В этом шаблоне легковесные дочерние процессы должны отслеживаться с помощью специального префикса CHILD:, сравните предыдущую команду и эту:
Почему остальные не показаны в статистике? Все процессы запускаются из Perl, но короткоживущие не отслеживаются в полной мере, поскольку timeout не просыпается достаточно часто.
Выявление зависаний в программе:
Более простой пример для остановки процесса, если он завис:
Итак, скрипт timeout — это простая программа для мониторинга потребления ресурсов, которая ограничивает потребление процессорного времени и памяти любой программы в Linux, она умеет выявлять зависания и подсчитывать статистику, в том числе с учётом дочерних процессов, а также отдельно для дочерних процессов.
Источник
Как ограничить использование процессора программой в Linux
Перегрев и тормоза компьютера
Некоторые программы в процессе своей работы нагружают центральный процессор на 100%. Это нормально и процессоры предназначены работать на максимальных своих частотах. Тем не менее, возможно возникновение сопутствующих проблем:
- перегрев компьютера
- подвисания операционной системы, «тормоза»
Есть способы установить ограничения для конкретной программы на то, сколько она может потреблять ресурсов центрального процессора. В этой инструкции я расскажу сразу о двух таких программах, которые позволяют установить, сколько процентов процессора можно использовать определённой программой. Но начнём немного с другого.
Обычно не нужно ограничивать количество процессорного времени, которое доступно для использования программой. Если процессор из-за интенсивной работы начинает перегреваться, то система сбрасывает частоты, то есть центральный процессор просто начинает медленнее работать. Это называется троттлинг. То есть имеется встроенная защита от того, чтобы процессор не сгорел. Если вы сталкиваетесь с перегревом и троттингом, то рекомендуется выполнить:
- чистку компьютера от пыли (особенно актуально для ноутбуков после нескольких лет эксплуатации)
- проверку и замену термопасты (актуально для используемых много лет настольных компьютеров)
Это может значительно улучшить ситуацию и ваша система будет работать быстрее за счёт того, что ЦПУ не будет сбрасывать частоты.
Ещё для ноутбуков существуют охлаждающие подставки. Они представляют из себя подложку с вентиляторами, которые ставятся под ноутбук. Они усиливают конвекцию воздуха и помогают встроенной системе охлаждения. Обычно с помощью охлаждающих подставок удаётся добиться хороших результатов по снижению температуры и предотвращению троттлинга.
Если у вас система подвисает, начинает тормозить из-за слишком большой нагрузки на процессор, то можно изменить приоритет процесса. В Linux за это отвечает величина nice. Если вы понизите приоритет программы, то она всё равно будет работать на полную. Но если вы будете выполнять другие действия на компьютере, то центральный процессор сначала будет обрабатывать ваши действия в других программах и только затем, по остаточному принципу, будет предоставлять процессорные мощности «тяжёлой» программе.
Тем не менее, если вам действительно нужно ограничить мощность процессора, которую может использовать определённая программа, то об этом сказано ниже.
Ограничение использование центрального процессора (с помощью cpulimit)
Изучим как пользоваться cpulimit.
cpulimit – это простая программа, которая пытается ограничить использование ЦПУ процессом (величина выражена в процентах, а не во времени CPU). Это полезно для контроля длительных задач требующих сильной нагрузки на процессор, когда вы не хотите, чтобы они слишком сильно нагружали систему и мешали работе. Примером таких задач может быть: создание резервной копии системы или большого количества файлов, сжатие в архив большого объёма данных, брут-форс паролей и другие операции. Программа cpulimit не влияет на значение nice или другие способы планирования приоритета, она работает с настоящим использованием ЦПУ. Кроме того, эта программа может динамически и быстро адаптироваться к общей нагрузке на систему.
Если у вашей машины один процессор, вы можете ограничить процент от 0% до 100%, что означает, если вы, к примеру, установите 50%, процентов, то ваш процесс не может использовать более чем 500 миллисекунд времени центрального процессора каждую секунду. Но если на вашей машине четыре процессора, то процент можно устанавливать от 0% до 400%. Так установка лимита на 200% означает использование не более чем половины имеющейся мощности. В любом случае, процент — это то же самое, что вы видите когда запускаете программу top.
cpulimit должен быть запущен по крайней мере тем же пользователем от которого запущен контролируемый процесс. Но намного лучше, если вы запустите cpulimit от root, чтобы иметь более высокий приоритет и точный контроль.
cpulimit также ограничивает дочерние процессы указанной программы.
Установка cpulimit (в Ubuntu, Linux Mint, Kali Linux, Debian и другие его производные):
Команда запуска cpulimit имеет следующий вид:
Изучим опции cpulimit:
Примеры запуска cpulimit
Предположим, вы запустили foo —bar и вы обнаружили с помощью top или ps, что этот процесс использует всю мощность вашего ЦПУ, вы можете или:
Ограничить использование CPU процессом воздействуя на исполнимый файл программы (примечание: аргумент «—bar» пропущен):
Ограничить использование CPU процессом воздействуя на, который показывает ps:
Как и -e, но использует абсолютный путь:
Полезно для скриптов, где вы хотите троттлить последнюю запущенную команду:
Запуск веб-браузера Firefox и ограничение использование CPU 20% процентами:
Флаг -c устанавливает количество ядер ЦПУ, которые, как начинает думать программа, доступны. Обычно программа правильно определяет количество ядер, но это значение можно переписать:
Запуск программы Firefox и остановка процесса, если он будет использовать более 20% CPU.
Троттлить процесс 1234 на 20% использования CPU. Если cpulimit настроен для выхода, то он отправляет наблюдаемому процессу сигнал SIGTERM.
Примеры запуска в cpulimit программы с опциями
Запуск веб-браузера Firefox в приватном режиме и ограничение использование центрального процессора на 25%:
Запуск программы aircrack-ng с опциями для взлома пароля Wi-FI:
Ещё раз обратите внимание, как именно считается выделяемый процент. Одно ядро – это 100% Допустим, на компьютере восемь ядер, тогда максимально можно установить значение 100% * 8 = 800%, что соответствует стопроцентному использованию всех восьми ядер. Если мы хотим, чтобы использовалось только половина процессорной мощности, то нужно указать 400%, то есть -l 400.
Контроль использования количества CPU выполняется отправкой процессу сигналов SIGSTOP и SIGCONT POSIX.
cpulimit всегда отправляет сигналы SIGSTOP и SIGCONT процессу, оба они нужны для верификации, что она может контролировать его и ограничивать среднее количество потребляемого ЦПУ. Это может привести к вводящим в заблуждение (раздражающим) сообщениям управления заданиями, которые показывают, что задание было остановлено (когда на самом деле оно действительно было остановлено, но немедленно перезапущено). Это также может вызвать проблемы с интерактивными оболочками, которые обнаруживают или иным образом зависят от SIGSTOP/SIGCONT. Например, вы можете разместить задание на переднем плане, но вы только увидите, что оно немедленно остановлено и перезапущено в фоне.
При вызове с опциями -e или -P, cpulimit ищет любой процесс в /proc с именем, которое соответствует имени процессу в переданном аргументе. Более того, она использует первый экземпляр найденного процесса. Для управление определённым экземпляром используйте опцию -p и укажите PID.
Контроль нагрузки на центральный процессор создаваемой группой программ
CPUTool – это ещё одна утилита, которая управляет использованием ЦПУ и нагрузкой на систему. Она умеет ограничивать нагрузку от одной программы или группы процесса по заданному лимиту.
CPUTool работает отправляя сигналы SIGSTOP и SIGCONT.
Установка CPUTool (в производные Debian):
Использование CPUTool:
Опции CPUTool:
Как и для предыдущей программы, возможно более 100% процессорной мощности, например, для двухъядерного процессора можно указать до 200 и так далее.
Примеры запуска CPUTool
Ограничить PID 4711 на использование 75% одного ядра ЦПУ:
Запуск rsync для создания резервной копии только когда системная нагрузка не превышает 7.5:
Заключение
Итак, с помощью этих программ вы можете ограничить, насколько интенсивно ресурсоёмкие приложение и программы будут использовать центральный процессор. Если ваша проблема заключается в перегреве и троттлинге, то начните с очистки физического компьютера от пыли и улучшения системы охлаждения.
О том, как контролировать текущую частоту и температуру процессора в Linux смотрите здесь.
Источник