Какие лимиты ресурсов (limits) в Linux ты знаешь?

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

Ответ

В Linux работа с лимитами критична для стабильности сервера. Я разделяю их на два основных типа:

1. Лимиты для пользователей и процессов (ulimit): Управляются командой ulimit и настраиваются в /etc/security/limits.conf. Самые важные из них:

  • nofile — максимальное количество открытых файловых дескрипторов для процесса. Для высоконагруженных веб-серверов (Nginx, БД) увеличиваю до 65535 и более.
  • nproc — максимальное количество процессов для пользователя. Лимит предотвращает fork-бомбы.
  • stack — максимальный размер стека процесса.

Проверка и установка:

# Просмотр всех лимитов для текущей оболочки
ulimit -a
# Проверка лимита на открытые файлы
ulimit -n
# Временное увеличение лимита (в текущей сессии)
ulimit -n 65535

2. Системные лимиты (sysctl): Глобальные лимиты, управляемые через sysctl и файлы в /proc/sys/.

  • fs.file-max — общее максимальное количество файловых дескрипторов в системе.
  • kernel.pid_max — максимальное значение PID, ограничивающее общее число процессов.
  • net.core.somaxconn — максимальное количество backlog-соединений в очереди сокета, критично для веб-серверов.

Пример настройки для высоконагруженного сервиса:

# В /etc/security/limits.conf добавляю:
nginx soft nofile 65536
nginx hard nofile 65536

# В /etc/sysctl.conf или отдельном файле в /etc/sysctl.d/:
fs.file-max = 2097152
net.core.somaxconn = 65535
vm.swappiness = 10

# Применяю изменения
sysctl -p

3. Лимиты cgroups (для контейнеров): В современных средах (Docker, Kubernetes) лимиты CPU, памяти, I/O задаются через контрольные группы (cgroups). Например, в Docker:

docker run --memory="512m" --cpus="1.5" my-app

В Kubernetes эти лимиты задаются в манифестах Pod/Deployment в секциях resources.limits и resources.requests.