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

Обновлено: 02.07.2024

Некоторые программы в процессе своей работы нагружают центральный процессор на 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.

При вызове с опциями -e или -P, cpulimit ищет любой процесс в /proc с именем, которое соответствует имени процессу в переданном аргументе. Более того, она использует первый экземпляр найденного процесса. Для управление определённым экземпляром используйте опцию -p и укажите PID.

Контроль нагрузки на центральный процессор создаваемой группой программ

CPUTool – это ещё одна утилита, которая управляет использованием ЦПУ и нагрузкой на систему. Она умеет ограничивать нагрузку от одной программы или группы процесса по заданному лимиту.

CPUTool работает отправляя сигналы SIGSTOP и SIGCONT.

Установка CPUTool (в производные Debian):

Использование CPUTool:

Опции CPUTool:

Как и для предыдущей программы, возможно более 100% процессорной мощности, например, для двухъядерного процессора можно указать до 200 и так далее.

Примеры запуска CPUTool

Ограничить PID 4711 на использование 75% одного ядра ЦПУ:

Запуск rsync для создания резервной копии только когда системная нагрузка не превышает 7.5:

Заключение

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

О том, как контролировать текущую частоту и температуру процессора в Linux смотрите здесь.

Прежде всего, как выяснить процессы каких пользователей потребляют больше всего ресурсов CPU оперативной памяти.

Для текущего момента посмотреть процессы можно при помощи утилиты ps

Команды выведут сортированные списки процессов в одной из колонок каждого списка будет указано имя пользователя. Процессы, запущенные от имени root показываться не будут и выведутся только 35 самых активных процессов.

Подобным образом статистику посмотреть не удасться, например, для веб-сервера с mod_php, однаако в большинстве случаев это как раз та информация, которая нужна для того чтобы выбрать пользователей для которых нужно предусмотреть ограничения.

Ограничения нужны на нагруженных серверах, они существует у каждого хостинг провайдера.

Изменять /etc/security/limits.conf может только пользователь root или другой пользователь работающий из под sudo.

Файл хорошо задокументирован, вся необходимая информация находится в нем в комментариях

В общем виде любое правило выглядит так:

ulimit в Linux и ограничение ресурсов для пользователя

Soft лимиты пользователь может переопределить используя ulimit

Выполнение команды с аргументом -a выведет актуальные ограничения

ulimit -as 1500000
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 14685
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 14685
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited

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

Дополнительно следует указывать тип ограничения:

Если не указывать ничего лимиты будут заданы жестко. hard здесь можно задать для текущего пользователя даже без прав root, но изменения не сохранятся после перезагрузки и чтобы ограничения были установлены постоянно нужно редактировать файл, который был рассмотрен ранее.

Создадим ограничение по оперативной памяти в 1500 Мб для пользователя

Выполнив ulimit -Hm сейчас можно увидеть, что ограничение установлено. Получить ту же информацию можно просмотрев лимиты для процесса

Можно указывать идентификатор любого процесса, запущенного от имени пользователя, для которого задали ограничение по памяти


Мануал

При администрировании вашей Linux-системы вам необходимо ограничить использование ЦП процессом, поскольку оно может потреблять больше использования ЦП и влияет на производительность всей системы.

В этом уроке я покажу, как вы можете контролировать время процессов на Centos 7 и Ubuntu 16.

1) cpulimit

По умолчанию он отсутствует, поэтому нам нужно его установить.

Чтобы установить cpulimit на Ubuntu 16.04, выполните следующие действия:

Установить на centos 7

Мы ограничиваем использование ЦП с помощью параметра -limit или -l, чтобы установить процент использования для процесса.

Прежде чем ограничивать использование ЦП, вам необходимо найти процесс или команду, использующую все время процессора.

Существует три способа использования cpulimit, действуя:

по абсолютному пути имени файла с -path или -Poption

Итак, мы сначала проверим процесс / программу, которая потребляет процессорное время

Затем вы можете использовать следующую команду с именем программы.

Вы можете увидеть, что инструмент автоматически обнаружил идентификатор процесса программы.

Вы можете ограничить использование процессора с помощью идентификатора процесса, как показано ниже.

И вы можете увидеть результат ниже

2) cputool

Вы можете использовать cputool, который также использует cpulimit для уменьшения использования ЦП.

Это также можно сделать, используя ограничение нагрузки.

cputool по умолчанию отсутствует, поэтому вам нужно установить его на Ubuntu 16

Чтобы использовать cputool, вам необходимо соблюдать синтаксис ниже

В том же примере вы можете использовать cputool, как показано ниже

Команда будет контролировать ваш терминал, чтобы вы могли использовать его в фоновом режиме, как показано ниже:

Вы можете увидеть результат, как показано ниже.

С помощью этих инструментов вы можете легко контролировать использование процессором процесса, когда он уже запущен.

Вам не нужно убивать процессы, чтобы уменьшить использование, но вы можете просто назначить процент, который не должен превышаться.

Как вы думаете, операционная система Linux может автоматически позаботиться сама о себе? Когда работает все нормально или вам не нужны никакие нестандартные возможности - вполне да. Но иногда может понадобиться ваше вмешательство в ее работу.

В Linux для каждой отдельной программы, при ее запуске создается процесс. Неважно запускаете программу вы вручную самостоятельно или это делает система или ядро. Например, программа инициализации, которая запускается сразу после завершения загрузки ядра тоже имеет свой процесс с идентификатором 0. Процессы в linux можно описать как контейнеры, в которых хранится вся информация о состоянии и выполнении программы. Если программа работает хорошо, то все нормально, но если она зависла или вам нужно настроить ее работу может понадобиться управление процессами в Linux.

В этой статье будет затронута обширная тема, мы рассмотрим такие возможности:

  • Просмотр запущенных процессов
  • Просмотр информации о процессах
  • Поиск процессов в Linux
  • Изменение приоритета процессов
  • Завершение процессов
  • Ограничение памяти доступной процессу

Я не мог не включить в статью первые пункты, но они очень просты и мы не будем разбирать их очень подробно. Но вот все остальное может показаться сложным и недостаточно описанным.

Что такое процесс?

Начнем с того, что разберемся в терминах. По сути, процесс - это каждая программа. Как я уже говорил для каждой запускаемой программы создается отдельный процесс. В рамках процесса программе выделяется процессорное время, оперативная память и другие системные ресурсы. У каждого процесса есть свой идентификатор, Proccess ID или просто PID, по ним, чаще всего и определяются процессы Linux. PID определяется неслучайно, как я уже говорил, программа инициализации получает PID 1, а каждая следующая запущенная программа - на единицу больше. Таким образом PID пользовательских программ доходит уже до нескольких тысяч.

На самом деле, процессы Linux не настолько абстрактны, какими они вам сейчас кажутся. Их вполне можно попытаться пощупать. Откройте ваш файловый менеджер, перейдите в корневой каталог, затем откройте папку /proc. Видите здесь кучу номеров? Так вот это все - PID всех запущенных процессов. В каждой из этих папок находится вся информация о процессе.

Например, посмотрим папку процесса 1. В папке есть другие под каталоги и много файлов. Файл cmdline содержит информацию о команде запуска процесса:

Поскольку у меня используется система инициализации Systemd, то и первый процесс запускается для нее. С помощью каталога /proc можно сделать все. Но это очень неудобно, особенно учитывая количество запущенных процессов в системе. Поэтому для реализации нужных задач существуют специальные утилиты. Перейдем к рассмотрению утилит, которые позволяют реализовать управление процессами в Linux.

Управление процессами в Linux

В Linux есть очень большое количество утилит для решения различных задач по управлению процессами. Это и такие многофункциональные решения, как htop, top, а также простые утилиты, например, ps, kill, killall, who и т д. Я не буду рассматривать в этой статье графические утилиты, и top тоже рассматривать не буду. Первое потому что слишком просто, второе - потому что htop лучше. Мы остановимся на работе с программой htop и ее аналогами в форме утилит в стиле GNU, одна утилита - одна функция.

Давайте установим htop, если она у вас еще не установлена. В Ubuntu это делается так:

sudo apt install htop

В других дистрибутивах вам нужно просто использовать свой менеджер пакетов. Имя пакета такое же.

Посмотреть запущенные процессы

Это очень простая задача, и также просто она решается. Для этого существует множество утилит, начиная от обычной ps, до более продвинутых интерактивных top, htop и так далее.

Открыв htop, мы сразу видим список запущенных процессов. Конечно, здесь отображены не все процессы linux, их-то в системе очень много, вы уже знаете, все они на один экран не поместятся. По умолчанию выводятся процессы, запущенные от имени вашего пользователя:

htop

Вы можете увидеть такую информацию о процессе:

  • PID - идентификатор процесса
  • USER - пользователь, от которого был запущен процесс
  • PRI - приоритет процесса linux на уровне ядра (обычно NI+20)
  • NI - приоритет выполнения процесса от -20 до 19
  • S - состояние процесса
  • CPU - используемые ресурсы процессора
  • MEM - использованная память
  • TIME - время работы процесса

К отображению можно добавить и дополнительные параметры, но эти главные. Добавить параметры можно с помощью меню Setup. Там все очень просто, читайте подсказки и следуйте указаниям. Например, добавлен параметр PPID:


Очень важной особенностью программы есть то, что вы можете сортировать процессы в Linux по нужному параметру. Просто кликните по названию параметра, оно выделится зеленым и будет выполнена сортировка. Например, хотите посмотреть в каком порядке запускались процессы, сортируем по PID:

htop2

Также есть интересная возможность разместить процессы в виде дерева. Вы сможете увидеть, каким процессом был запущен тот или иной процесс. Для отображения дерева нажмите кнопку F5:

htop3

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

ps

Рассмотрим основные опции, которые будем использовать:

  • -e - вывести информацию обо всех процессах
  • -a - вывести информацию обо всех наиболее часто запрашиваемых процессах
  • -t - показывать только процессы из этого терминала
  • -p - показывать информацию только об указанном процессе
  • -u - показывать процессы только определенного пользователя

Одним словом, чтобы посмотреть все активные на данный момент процессы в linux, используется сочетание опций aux:

Программа показывает все те же параметры, только здесь нет интерактивного интерфейса. Думаете здесь нельзя отсортировать процессы, но ошибаетесь, можно. Для этого есть опция sort. Вы можете сортировать их по любому полю, например:

Список будет отсортирован в обратном порядке, внизу значения больше, вверху - меньше. Если нужно в обратном порядке, добавьте минус:

ps1

В качестве поля для сортировки могут быть использованы приоритеты процессов Linux или любые другие параметры. Также вы можете обрезать вывод, если не нужно выводить всю информацию:

Казалось бы, у ps нет возможности стоить деревья процессов. Но не совсем, для этого существует отдельная команда:

pstree

Поиск процессов в Linux

Список процессов, это хорошо. Но иногда, когда какой-нибудь процесс завис и нужно убить процесс Linux или нам нужно провести с ним какие-либо действия, нужно выделить этот процесс из списка, узнать его PID и информацию о нем.

Чтобы найти процесс linux в htop можно использовать кнопку F3. Нажмите F3 и наберите нужное слово. Дальше чтобы перейти к следующему вхождению нажимайте F2 или Esc для завершения поиска:

htop4

Для поиска процессов в htop можно использовать также фильтр htop. Нажмите F4, введите слово и будут выведены только процессы linux, имя которых включает это слово.

htop6

В утилите ps фильтрации нет, но зато мы можем использовать утилиту grep, перенаправив вывод ps на нее чтобы найти процесс linux:

ps aux | grep chromium

Это очень часто употребляемая команда.

Изменение приоритета процессов

Приоритет процесса linux означает, насколько больше процессорного времени будет отдано этому процессу по сравнению с другими. Так мы можем очень тонко настроить какая программа будет работать быстрее, а какая медленнее. Значение приоритета может колебаться от 19 (минимальный приоритет) до -20 - максимальный приоритет процесса linux. Причем, уменьшать приоритет можно с правами обычного пользователя, но чтобы его увеличить нужны права суперпользователя.

В htop для управления приоритетом используется параметр Nice. Напомню, что Priv, это всего лишь поправка, она в большинстве случаев больше за Nice на 20. Чтобы изменить приоритет процесса просто установите на него курсор и нажимайте F7 для уменьшения числа (увеличения приоритета) или F8 - для увеличения числа.

Но и для решения этой задачи управления процессами Linux необязательно использовать htop. Вы можете сделать все и другими командами. Например, команда nice. С помощью нее вы можете указать приоритет для запускаемого процесса:

nice -n 10 apt-get upgrade

Или изменить приоритет для уже существующего по его pid:

renice -n 10 -p 1343

Завершение процессов в Linux

Если процесс завис и не отвечает, его необходимо завершить. В htop, чтобы убить процесс Linux, просто установите курсор на процесс и нажмите F9:

htop7

Система для управления процессами использует определенные сигналы, есть сигналы, которые указывают процессу завершиться. Вот несколько основных сигналов:

  • SIGTERM - попросить процесс сохранить данные и завершится
  • SIGKILL - завершить процесс немедленно, без сохранения

Вообще сигналов есть несколько десятков, но мы не будем их рассматривать. Отправим сигнал SIGKILL:

Также можно воспользоваться утилитой kill:

Также можно уничтожить процесс по имени:

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

Управление процессами в Linux позволяет контролировать практически все. Вы уже видели что можно сделать, но можно еще больше. С помощью команды ulimit и конфигурационного файла /etc/security/limits.conf вы можете ограничить процессам доступ к системным ресурсам, таким как память, файлы и процессор. Например, вы можете ограничить память процесса Linux, количество файлов и т д.

Запись в файле имеет следующий вид:

<домен> <тип> <элемент> <значение>

  • домен - имя пользователя, группы или UID
  • тип - вид ограничений - soft или hard
  • элемент - ресурс который будет ограничен
  • значение - необходимый предел

Жесткие ограничения устанавливаются суперпользователем и не могут быть изменены обычными пользователями. Мягкие, soft ограничения могут меняться пользователями с помощью команды ulimit.

Рассмотрим основные ограничения, которые можно применить к процессам:

  • nofile - максимальное количество открытых файлов
  • as - максимальное количество оперативной памяти
  • stack - максимальный размер стека
  • cpu - максимальное процессорное время
  • nproc - максимальное количество ядер процессора
  • locks - количество заблокированных файлов
  • nice - максимальный приоритет процесса

Например, ограничим процессорное время для процессов пользователя sergiy:

sergiy hard nproc 20

Посмотреть ограничения для определенного процесса вы можете в папке proc:

Max cpu time unlimited unlimited seconds
Max file size unlimited unlimited bytes
Max data size unlimited unlimited bytes
Max stack size 204800 unlimited bytes
Max core file size 0 unlimited bytes
Max resident set unlimited unlimited bytes
Max processes 23562 23562 processes
Max open files 1024 4096 files
Max locked memory 18446744073708503040 18446744073708503040 bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 23562 23562 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us

Ограничения, измененные, таким образом вступят в силу после перезагрузки. Но мы можем и устанавливать ограничения для текущего командного интерпретатора и создаваемых им процессов с помощью команды ulimit.

Вот опции команды:

  • -S - мягкое ограничение
  • -H - жесткое ограничение
  • -a - вывести всю информацию
  • -f - максимальный размер создаваемых файлов
  • -n - максимальное количество открытых файлов
  • -s - максимальный размер стека
  • -t - максимальное количество процессорного времени
  • -u - максимальное количество запущенных процессов
  • -v - максимальный объем виртуальной памяти

Например, мы можем установить новое ограничение для количества открываемых файлов:

Установим лимит оперативной памяти:

ulimit -Sv 500000

Напоминаю, что это ограничение будет актуально для всех программ, выполняемых в этом терминале.

Выводы

Вот и все. Теперь управление процессами в Linux не вызовет у вас проблем. Мы рассмотрели очень даже подробно эту тему. Если у вас остались вопросы или есть предложения по дополнению статьи, пишите в комментариях!

Читайте также: