Ответ
В 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.