Подробный гайд по настройке параметров ядра Linux для оптимизации

Настройка ядра Linux для оптимизации: сеть, память, I/O, планировщик. Готовые конфиги sysctl и практические рекомендации для серверов и десктопов.

2026.04.24                  


Подробный гайд по настройке параметров ядра Linux для оптимизацииПодробный гайд по настройке параметров ядра Linux для оптимизации

Важно:

  • Не существует «универсального» набора параметров ядра. Оптимальные значения зависят от аппаратной платформы, версии ядра, типа нагрузки (веб-сервер, БД, десктоп, контейнеры, низколатентные приложения) и версии дистрибутива. Слепое копирование конфигов из интернета может привести к нестабильности или снижению производительности.

1. Основы и безопасная работа с sysctl

Где хранятся параметры

  • Временные: sysctl -w <параметр>=<значение> (сбрасываются после перезагрузки)
  • Постоянные: /etc/sysctl.conf или файлы в /etc/sysctl.d/ (рекомендуется создавать отдельные, например 99-custom.conf)

Бэкап текущих значений

sudo sysctl -a > ~/sysctl_backup_$(date +%F_%T).txt

Применение изменений

# Применить конкретный файл
sudo sysctl -p /etc/sysctl.d/99-custom.conf

# Применить все файлы из /etc/sysctl.d/ и /etc/sysctl.conf
sudo sysctl --system

Проверка применённого значения

sysctl <имя.параметра>
# или
cat /proc/sys/<путь/к/параметру>

2. Сетевые параметры (net.*)

Параметр Описание Рекомендуемое значение Примечание
net.core.somaxconn Макс. длина очереди входящих соединений 102465535 Для Nginx/HAProxy ставьте ≥1024. Не выше 65535 без необходимости.
net.core.netdev_max_backlog Буфер пакетов на сетевом интерфейсе 20003000 Помогает при burst-трафике.
net.ipv4.tcp_max_syn_backlog Очередь полуоткрытых SYN-соединений 20488192 Должно быть ≥ somaxconn.
net.ipv4.tcp_tw_reuse Повторное использование сокетов в TIME_WAIT 1 Безопасно в ядрах ≥4.12 для исходящих соединений.
net.ipv4.tcp_fin_timeout Время ожидания закрытия соединения 15 По умолчанию 60. Снижение ускоряет освобождение портов.
net.ipv4.tcp_keepalive_time / intvl / probes Keepalive-механизм 600, 60, 5 Экономит ресурсы при долгоживущих соединениях.
net.ipv4.tcp_rmem / wmem Буферы приёма/передачи TCP 4096 87380 6291456 Формат: min default max. Не завышайте max без тестов.
net.core.rmem_max / wmem_max Глобальные макс. буферы 16777216 Должны быть ≥ tcp_rmem/wmem max.
net.ipv4.ip_local_port_range Диапазон эфемерных портов 1024 65535 Увеличивает количество одновременных исходящих соединений.
net.ipv4.tcp_congestion_control Алгоритм управления перегрузкой bbr или cubic bbr лучше при высоких задержках/потерях. Требует ядро ≥4.9.
net.ipv4.tcp_no_metrics_save Не сохранять TCP-метрики маршрутов 1 Ускоряет установку соединений в динамических сетях.

Как применить:

sudo sysctl -w net.ipv4.tcp_congestion_control=bbr
echo "net.ipv4.tcp_congestion_control=bbr" | sudo tee -a /etc/sysctl.d/99-network.conf

3. Параметры памяти и виртуальной памяти (vm.*)

Параметр Описание Рекомендуемое значение Примечание
vm.swappiness Склонность ядра использовать swap 1030 (серверы), 15 (БД) 0 не отключает swap полностью (начиная с ядра 5.8).
vm.dirty_background_ratio % памяти, после которого фоновая запись на диск 510 Снижает лаги при интенсивной записи.
vm.dirty_ratio % памяти, после которого процесс блокируется на запись 1020 Не ставьте слишком низким на медленных дисках.
vm.vfs_cache_pressure Давление на кэш inode/dentry 50100 50 полезно при работе с миллионами мелких файлов.
vm.min_free_kbytes Резерв свободной памяти (КБ) Авто или 5122048 (для >8 ГБ ОЗУ) Ядро рассчитывает автоматически. Ручная правка нужна редко.
vm.overcommit_memory Политика выделения памяти 0 (эвристика), 2 (строго) Для БД/контейнеров часто 2 + vm.overcommit_ratio=80.
vm.max_map_count Макс. количество memory map regions 2621441048576 Обязательно для Elasticsearch, Java, Chrome.
vm.transparent_hugepage THP: always / madvise / never madvise или never Для БД и low-latency приложений never или madvise снижает задержки.

Важно:

  • THP управляется через /sys/kernel/mm/transparent_hugepage/enabled, но sysctl не влияет напрямую. Настраивается через grub или systemd-tmpfiles.

4. Файловые системы и I/O (fs.*, dev.*)

Параметр Описание Рекомендуемое значение Примечание
fs.file-max Макс. открытых файлов в системе 1000000+ Зависит от ulimit -n. Для веб-серверов/БД обязательно.
fs.nr_open Лимит открытых файлов на процесс 1048576 Должен быть ≥ file-max.
fs.inotify.max_user_watches Макс. наблюдаемых файлов через inotify 524288 Для Docker, IDE, файловых синхронизаторов.
vm.dirty_expire_centisecs Время «грязных» страниц до принудительной записи 1500 (15 сек) Снижение уменьшает риск потери данных при падении питания.
vm.dirty_writeback_centisecs Интервал фоновой записи 500 (5 сек)

I/O планировщик:

  • Не настраивается через sysctl. В современных ядрах (5.4+) используется mq-deadline, kyber или bfq.

Меняется через:

echo mq-deadline | sudo tee /sys/block/sda/queue/scheduler

Или параметром ядра в GRUB: elevator=mq-deadline.


5. Планировщик, CPU и NUMA (kernel.*)

Параметр Описание Рекомендуемое значение Примечание
kernel.sched_migration_cost_ns Стоимость миграции задачи между CPU 500000 Снижение повышает отзывчивость, но увеличивает кэш-промахи.
kernel.numa_balancing Автоматическая балансировка памяти в NUMA 0 или 1 Отключайте (0) для выделенных серверов с фиксированными привязками.
kernel.sched_latency_ns Базовый период планирования 6000000 Не меняйте без профилирования.
kernel.sched_rt_runtime_us Квант времени для real-time задач 950000 950000 = 95% CPU для RT, 5% для обычных.

Примечание:

  • Современный CFS-планировщик хорошо автонастраивается. Ручная правка sched_* параметров оправдана только для real-time, аудио-производства или специфичных нагрузок.

6. Сценарные рекомендации

Сценарий Ключевые параметры
Веб-сервер (Nginx, HAProxy, Envoy) somaxconn, tcp_max_syn_backlog, tcp_tw_reuse, ip_local_port_range, file-max, inotify.max_user_watches
СУБД (PostgreSQL, MySQL, Redis) swappiness=1, dirty_ratio=10, overcommit_memory=2, max_map_count=262144+, transparent_hugepage=never
Контейнеры / Kubernetes fs.inotify.max_user_watches, fs.file-max, vm.max_map_count, net.ipv4.tcp_tw_reuse, отключение numa_balancing на нодах
Десктоп / Гейминг swappiness=10-20, vfs_cache_pressure=50, tcp_congestion_control=bbr, vm.dirty_background_ratio=10
Low-latency / Аудио / Real-time swappiness=0, kernel.sched_rt_runtime_us=950000, transparent_hugepage=never, cpu governor=performance, isolcpus (через GRUB)

7. Пример готового конфига

Создайте /etc/sysctl.d/99-optimization.conf:

# === Сеть ===
net.core.somaxconn = 4096
net.core.netdev_max_backlog = 2500
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 60
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_rmem = 4096 87380 6291456
net.ipv4.tcp_wmem = 4096 65536 6291456
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_congestion_control = bbr
net.ipv4.tcp_no_metrics_save = 1

# === Память ===
vm.swappiness = 10
vm.dirty_background_ratio = 5
vm.dirty_ratio = 10
vm.vfs_cache_pressure = 70
vm.overcommit_memory = 0
vm.max_map_count = 262144
vm.min_free_kbytes = 1024

# === Файловые системы ===
fs.file-max = 1000000
fs.nr_open = 1048576
fs.inotify.max_user_watches = 524288
vm.dirty_expire_centisecs = 1500
vm.dirty_writeback_centisecs = 500

# === Планировщик ===
kernel.sched_migration_cost_ns = 500000
kernel.numa_balancing = 0

Примените:

sudo sysctl -p /etc/sysctl.d/99-optimization.conf

8. Верификация и мониторинг

Инструмент Команда Что показывает
sysctl sysctl net.ipv4.tcp_* Текущие значения
ss ss -s, ss -tnpa Статистика соединений
vmstat vmstat 2 5 Swap, память, I/O, CPU
iostat iostat -x 2 Загрузка дисков, latency
perf / bpftrace sudo bpftrace -e 'tracepoint:syscalls:sys_enter_* { @=count(); }' Глубокий анализ
dmesg dmesg -T grep -iE 'sysctl|tcp|oom|swap' | Ошибки ядра

Правило:

  • Замеряйте метрики до и после изменений. Используйте sar, prometheus+node_exporter или grafana для долгосрочного мониторинга.

9. Лучшие практики и предостережения

  1. Меняйте по одному параметру → тестируйте → фиксируйте результат.
  2. Учитывайте версию ядра: Поведение tcp_tw_reuse, bbr, swappiness менялось между 4.x, 5.x и 6.x.
  3. Контейнеры: Параметры net.* и fs.* часто глобальны для хоста. В Docker/Containerd часть ограничений задаётся через --sysctl.
  4. Не отключайте полностью своп (swappiness=0 в старых ядрах мог вызывать OOM). В современных ядрах используйте vm.swappiness=1 + zswap/zram при необходимости.
  5. Используйте tuned: В RHEL/Alma/Rocky/Fedora tuned предлагает проверенные профили (throughput-performance, latency-performance, virtual-guest).
  6. Документируйте: Комментируйте в конфигах зачем и когда меняли параметр.