Можно ли при запуске программы в Linux выделить ей определенное количество ресурсов?

«Можно ли при запуске программы в Linux выделить ей определенное количество ресурсов?» — вопрос из категории Linux, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

1. cgroups (control groups) Ядро Linux позволяет создавать группы процессов и распределять между ними ресурсы (CPU, память, I/O). Это основа для контейнеризации (Docker, Kubernetes).

Пример создания cgroup для ограничения CPU:

# Создаем cgroup для CPU
sudo mkdir /sys/fs/cgroup/cpu/myapp
sudo echo 100000 > /sys/fs/cgroup/cpu/myapp/cpu.cfs_quota_us # Ограничение до 10% одного ядра
# Запускаем процесс в этой cgroup
sudo echo $$ > /sys/fs/cgroup/cpu/myapp/cgroup.procs
./my_program

2. Утилиты для ограничения ресурсов:

  • systemd-run — удобная обертка над cgroups для запуска процессов с лимитами.
    # Запуск с ограничением памяти и CPU
    systemd-run --scope -p MemoryLimit=500M -p CPUQuota=50% ./my_program
  • cpulimit — для ограничения использования CPU в процентах.
    cpulimit -l 30 -p $(pgrep my_program)
  • ulimit — встроенная команда shell для ограничений процесса (открытые файлы, стек и т.д.).
    ulimit -n 1024  # Макс. количество открытых файловых дескрипторов
    ulimit -s 8192  # Макс. размер стека (KB)

3. Контейнеры (Docker): Docker использует cgroups под капотом. Лимиты задаются при запуске:

docker run --cpus="0.5" --memory="512m" --memory-swap="1g" my_image

В продакшене такие ограничения задаются через оркестраторы (Kubernetes resources.limits) или конфигурацию systemd-сервисов.