Перейти к содержимому

Настройка ядра: sysctl и лимиты

BBR, очередь соединений и лимит открытых файлов: что менять, зачем и как проверить эффект.

Уровень
Продвинутый
Время чтения
3 мин чтения
Обновлено
Проверено на
Ubuntu 22.04, Ubuntu 24.04, Debian 12
Содержание
  1. Как применять настройки
  2. TCP BBR
  3. Очередь входящих соединений
  4. Лимит открытых файлов
  5. Проверьте результат
  6. Как откатить

Универсальных «оптимальных настроек ядра» не существует. Значения по умолчанию в современных Ubuntu и Debian разумны для большинства задач. Меняйте параметр, только если понимаете, какую проблему он решает, и можете измерить результат.

Как применять настройки

Храните свои параметры в отдельном файле в /etc/sysctl.d/ — так их видно и легко откатить:

bash
$ sysctl net.ipv4.tcp_congestion_control$ nano /etc/sysctl.d/90-tuning.conf$ sysctl --system

Первая команда показывает текущее значение, последняя применяет все файлы настроек.

TCP BBR

BBR — алгоритм управления перегрузкой TCP. Он помогает при отдаче больших файлов удалённым клиентам по каналам с потерями. Модуль есть в ядрах Ubuntu 22.04/24.04 и Debian 12.

/etc/sysctl.d/90-tuning.conf
net.core.default_qdisc = fqnet.ipv4.tcp_congestion_control = bbr
bash
$ sysctl --system$ sysctl net.ipv4.tcp_congestion_control

Эффект оценивайте замером: скачайте большой файл с сервера до и после изменения из одной и той же точки.

Очередь входящих соединений

net.core.somaxconn ограничивает очередь соединений, которые ещё не принял процесс. В ядрах 5.4 и новее значение по умолчанию уже 4096. Увеличивать его имеет смысл, только если под нагрузкой растут счётчики переполнений:

bash
$ nstat -az TcpExtListenOverflows TcpExtListenDrops

Учтите: сама программа тоже задаёт размер очереди (в Nginx — параметр backlog у listen), и действует меньшее из двух значений.

Лимит открытых файлов

Каждое сетевое соединение — открытый файловый дескриптор. Ошибка «Too many open files» означает, что процесс упёрся в свой лимит. Системный предел fs.file-max в современных ядрах очень велик — упираются почти всегда в лимит процесса.

bash
$ grep 'open files' /proc/$(pidof -s nginx)/limits

Для служб systemd лимит задаётся в unit-файле, а не в /etc/security/limits.conf — тот действует только на сессии входа пользователей:

bash
$ systemctl edit nginx
Содержимое override
[Service]LimitNOFILE=65535
bash
$ systemctl restart nginx

Для Nginx поднимите и его собственные параметры worker_rlimit_nofile и worker_connections в nginx.conf — иначе он не воспользуется новым лимитом.

Проверьте результат

bash
$ sysctl net.core.default_qdisc net.ipv4.tcp_congestion_control$ grep 'open files' /proc/$(pidof -s nginx)/limits

Как откатить

Удалите свой файл из /etc/sysctl.d/ и перезагрузите сервер — ядро вернётся к значениям по умолчанию. Override службы удаляется командой systemctl revert nginx.

Дочитайте до конца — статья засчитается в обучении автоматически.

  • sysctl
  • ядро
  • bbr
  • оптимизация
  • ulimit
  • nofile

Статья помогла?