Задать вопрос
Все статьи / Полезная информация / Как ограничить CPU и RAM для процессов и сервисов
Найти результаты:
Период:
с:
 
по:
Помощь в поиске

Помощь в поиске

apple banana
Найти записи, которые содержат хотя бы одно из двух слов.

+apple +juice
Найти записи, которые содержат оба слова.

+apple macintosh
Найти записи, которые содержат слово 'apple', но положение записей выше, если они также содержат 'macintosh'.

+apple -macintosh
Найти записи, которые содержат слово 'apple', но не 'macintosh'.

+apple ~macintosh
Найти записи, которые содержат слово 'apple', но если запись также содержит слово 'macintosh', rate it lower than if row does not. Это более "мягкий" чем поиск '+apple -macintosh', для которого наличие 'macintosh' вызывает что записи не будут возвращены вовсе.

+apple +(>turnover <strudel)
Найти записи, которые содержат слова 'apple' и 'turnover', или 'apple' и 'strudel' (в любом порядке), но ранг 'apple turnover' выше чем 'apple strudel'.

apple*
Найти записи, которые содержат такие слова как 'apple', 'apples', 'applesauce', или 'applet'.

"some words"
Найти записи, которые содержат точную фразу 'some words' (например записи содержащие 'some words of wisdom', но не "some noise words").

Как ограничить CPU и RAM для процессов и сервисов

Эффективное распределение ресурсов CPU и RAM – ключевая задача при эксплуатации многозадачных систем. Неконтролируемое потребление ресурсов отдельными процессами может привести к деградации производительности или даже отказу критически важных сервисов. 

В этой статье разберем основные инструменты Linux для ограничения использования CPU и оперативной памяти. 

Почему важно ограничивать ресурсы процессов

Ограничивать ресурсы на сервере нужно не только для того, чтобы снизить нагрузку от приложений с высоким потреблением ресурсов. Главное — добиться стабильной и предсказуемой работы сервера. Если для процесса установить лимит по CPU или RAM, он не сможет использовать слишком много ресурсов и мешать работе базы данных, веб‑сервера или системных служб.

Без ограничений даже один процесс может создать проблемы для всей системы: скрипт уйдет в бесконечный цикл, приложение начнет накапливать данные в памяти, контейнер неожиданно вырастет по потреблению, а пользовательские запросы станут обрабатываться медленнее. На небольших VPS это особенно заметно: запас ресурсов ограничен, поэтому ошибка в одном сервисе быстро отражается на остальных.

Ограничения помогают:

  • защитить сервер от перегрузки, если один процесс начинает использовать слишком много CPU;
  • снизить риск нехватки оперативной памяти и срабатывания OOM Killer;
  • не дать фоновым задачам мешать важным сервисам, например API, базе данных или веб-серверу;
  • распределить ресурсы между несколькими приложениями на одном сервере;
  • сделать поведение системы стабильнее при пиковых нагрузках;
  • быстрее находить проблемные процессы: если сервис постоянно упирается в лимит, его нужно оптимизировать или переносить на более мощный сервер;
  • контролировать расходы на инфраструктуру, особенно в облачных средах и на VPS;
  • безопаснее запускать тестовые скрипты, парсеры, обработчики очередей и другие ресурсоемкие задачи;
  • изолировать контейнеры и сервисы друг от друга, чтобы сбой одного приложения не затронул остальные.

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

Ограничивать CPU и RAM важно, но это не отменяет необходимости оптимизировать код, настраивать базу данных и искать утечки памяти. Зато такие ограничения работают как страховка: если в каком‑то процессе возникнет ошибка, он не сможет израсходовать все доступные ресурсы и нарушить работу системы.

Для проектов, где важны стабильность и контроль над нагрузкой, подойдут виртуальные серверы от Spaceweb. Вы получите доступ к Linux-системе и можете самостоятельно управлять ресурсами: ограничивать CPU и RAM через systemd и cgroups, задавать лимиты для контейнеров, контролировать фоновые процессы и масштабировать конфигурацию сервера под рост нагрузки. 

Как работают ограничения CPU и RAM в Linux

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

Для CPU чаще используются два типа ограничений:

  1. Относительный приоритет. Процессу не запрещают использовать процессор полностью, но задают его «вес» относительно других процессов. Если сервер свободен, приложение может получить больше CPU. При высокой нагрузке ядро распределит процессорное время с учетом заданных приоритетов.
  2. Жесткая квота CPU. В этом случае процессу или сервису разрешают использовать только определенную часть процессорного времени. Например, лимит 50% означает половину одного ядра, 100% – одно ядро, 200% – два ядра. На многоядерных системах проценты считаются относительно одного CPU-ядра, поэтому значение выше 100% нормально.

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

  • новая память не будет выделена;
  • процесс начнет активнее использовать swap, если он разрешен;
  • система завершит процесс через OOM Killer;
  • ограничение сработает только внутри группы процессов, не затрагивая весь сервер.

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

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

cgroups, или control groups, – основной механизм Linux для ограничения ресурсов. Он позволяет объединять процессы в группы и задавать для них правила: сколько CPU можно использовать, какой объем памяти доступен, сколько процессов разрешено создавать, какие операции ввода-вывода допустимы.

Именно на cgroups опираются многие привычные инструменты: systemd, Docker, Podman, Kubernetes. Они не создают ограничения с нуля, а используют возможности ядра и предоставляют более удобный интерфейс для настройки.

В современных дистрибутивах чаще применяется cgroups v2. В этой версии управление ресурсами собрано в единую иерархию, а параметры находятся в каталоге:

/sys/fs/cgroup

Проверить, какая версия используется в системе, можно командой:

mount | grep cgroup

Если в выводе есть cgroup2, значит система работает с cgroups v2.

Например, можно создать отдельную группу для приложения:

sudo mkdir /sys/fs/cgroup/myapp

Чтобы ограничить память для процессов в этой группе до 512 МБ, используется параметр memory.max:

echo 512M | sudo tee /sys/fs/cgroup/myapp/memory.max

После этого в группу нужно добавить процесс. Для этого в файл cgroup.procs записывается PID процесса:

echo 12345 | sudo tee /sys/fs/cgroup/myapp/cgroup.procs

Здесь 12345 – идентификатор процесса, который нужно ограничить.

Для ограничения CPU в cgroups v2 используется файл cpu.max. Например:

echo "50000 100000" | sudo tee /sys/fs/cgroup/myapp/cpu.max

Эта настройка означает, что процессам в группе доступно 50 000 микросекунд процессорного времени из каждых 100 000 микросекунд. То есть лимит составит примерно 50% одного CPU-ядра.

Чтобы убрать жесткое ограничение CPU, можно записать:

echo "max 100000" | sudo tee /sys/fs/cgroup/myapp/cpu.max

Для памяти также можно задать не только жесткий лимит, но и мягкий порог:

echo 400M | sudo tee /sys/fs/cgroup/myapp/memory.high

memory.high не завершает процесс сразу, но сообщает системе, что группа начала потреблять слишком много памяти. Ядро будет стараться сдерживать дальнейший рост потребления.

Полезные параметры cgroups v2:

Параметр cgroups v2 Что делает
memory.max Задает жесткий лимит оперативной памяти для группы процессов
memory.high Устанавливает мягкий порог потребления RAM: при превышении ядро начинает сдерживать процессы
memory.swap.max Ограничивает или запрещает использование swap
cpu.max Задает жесткий лимит CPU, например долю одного ядра
cpu.weight Определяет относительный вес группы при распределении процессорного времени
pids.max Ограничивает максимальное количество процессов и потоков в группе
cgroup.procs Используется для добавления процессов в cgroup по PID

Например, можно запретить группе использовать swap:

echo 0 | sudo tee /sys/fs/cgroup/myapp/memory.swap.max

И ограничить количество процессов:

echo 100 | sudo tee /sys/fs/cgroup/myapp/pids.max

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

Ограничение ресурсов через systemd

systemd – один из самых удобных способов ограничить CPU и RAM для сервисов в Linux. Он автоматически создает отдельные cgroups для служб, поэтому администратору не нужно вручную работать с каталогом /sys/fs/cgroup. Достаточно указать нужные параметры в unit-файле сервиса.

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

sudo systemctl edit myapp.service

Она создаст override-файл, в который можно добавить ограничения:

[Service]
CPUQuota=50%
MemoryMax=512M

После сохранения настроек нужно перечитать конфигурацию и перезапустить сервис:

sudo systemctl daemon-reload
sudo systemctl restart myapp.service

В этом примере сервис myapp.service сможет использовать не больше половины одного CPU-ядра и до 512 МБ оперативной памяти.

Полезные параметры systemd для ограничения ресурсов:

Параметр За что отвечает
CPUQuota=50% Ограничивает сервис половиной одного CPU-ядра
CPUQuota=200% Разрешает использовать до двух CPU-ядер
MemoryMax=1G Задает жесткий лимит оперативной памяти
MemoryHigh=800M Задает мягкий порог памяти, после которого система начинает сдерживать потребление
MemorySwapMax=0 Запрещает использовать swap
TasksMax=200 Ограничивает количество процессов и потоков внутри сервиса

Пример более полной конфигурации:

[Service]
CPUQuota=100%
MemoryHigh=700M
MemoryMax=1G
MemorySwapMax=0
TasksMax=200

Эта настройка разрешает сервису использовать до одного CPU-ядра, задает мягкий порог памяти в 700 МБ и жесткий лимит в 1 ГБ. Swap для сервиса отключен, а количество процессов и потоков ограничено значением 200.

Проверить примененные параметры можно командой:

systemctl show myapp.service | grep -E 'CPUQuota|MemoryMax|MemoryHigh|MemorySwapMax|TasksMax'

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

systemd-run --scope -p CPUQuota=50% -p MemoryMax=512M ./script.sh

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

Контроль ресурсов для контейнеров

Контейнеры тоже используют механизмы cgroups. Docker, Podman и Kubernetes принимают настройки CPU и памяти, а затем применяют их на уровне ядра Linux. Поэтому контейнеры важно запускать с лимитами: без них одно приложение может занять слишком много ресурсов хоста и повлиять на соседние сервисы.

В Docker ограничить память можно параметром --memory:

docker run --memory="512m" nginx

В этом примере контейнеру доступно до 512 МБ RAM.

Ограничение CPU задается параметром --cpus:

docker run --cpus="1.5" nginx

Контейнер сможет использовать до полутора CPU-ядер.

Кроме того, можно задать оба ограничения сразу:

docker run --memory="1g" --cpus="2" nginx

Для Docker Compose лимиты можно указать в docker-compose.yml:

services:
  app:
    image: myapp:latest
    mem_limit: 512m
    cpus: 1.0

В Kubernetes для управления ресурсами используются requests и limits:

resources:
  requests:
    cpu: "500m"
    memory: "256Mi"
  limits:
    cpu: "1"
    memory: "512Mi"

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

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

Мониторинг использования ресурсов

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

Для быстрой проверки процессов можно использовать стандартные команды Linux:

top

Показывает текущую нагрузку на CPU, RAM и список самых активных процессов.

Более удобная интерактивная версия top: 

htop

Команда покажет загрузку ядер, память, swap и отдельные процессы.

Чтобы отобразить процессы с наибольшей нагрузкой на CPU, пропишите:

ps aux --sort=-%cpu | head

А если нужно посмотреть процессы, которые используют больше всего памяти, используйте:

ps aux --sort=-%mem | head

Для сервисов, запущенных через systemd, полезна команда:

systemd-cgtop

Она отображает потребление ресурсов по cgroups. Это удобно, когда нужно посмотреть не отдельный PID, а весь сервис вместе с его дочерними процессами.

Проверить состояние конкретного сервиса можно так:

systemctl status myapp.service

А подробные параметры и лимиты – так:

systemctl show myapp.service

Для контейнеров Docker используется команда:

docker stats

Она показывает потребление CPU, памяти, сетевой трафик и операции ввода-вывода по каждому запущенному контейнеру.

В Kubernetes базовую информацию дают команды:

kubectl top pods
kubectl top nodes

Они показывают, сколько CPU и памяти используют pod’ы и node’ы. Для работы этих команд в кластере должен быть установлен Metrics Server.

Для долгосрочного наблюдения лучше подключать полноценный мониторинг: Prometheus, Grafana, Zabbix, Netdata, VictoriaMetrics или другие инструменты. Они позволяют отслеживать не только текущую нагрузку, но и историю: пики CPU, рост потребления памяти, частые рестарты, приближение к лимитам и OOM-события.

Итоги

Ограничение CPU и RAM в Linux помогает защитить сервер от перегрузки, повысить стабильность сервисов и сделать потребление ресурсов предсказуемым.

Главные инструменты:

  • cgroups – низкоуровневый механизм ядра Linux;
  • systemd – удобный способ задавать лимиты для сервисов;
  • Docker, Podman, Kubernetes – управление ресурсами контейнеров;
  • top, htop, systemd-cgtop, docker stats, kubectl top – базовый мониторинг нагрузки.

Для обычных сервисов чаще всего достаточно настроек CPUQuota, MemoryMax, MemoryHigh и MemorySwapMax в systemd. Для контейнеров важно задавать limits и requests, чтобы приложение не занимало больше ресурсов, чем ему выделено.

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

Предыдущая статья
Как настроить SMTP-сервер Google
Следующая статья
Как подключиться к виртуальной машине VMware Cloud Director по...