Настройка ядра Linux для оптимизации: сеть, память, I/O, планировщик. Готовые конфиги sysctl и практические рекомендации для серверов и десктопов.
2026.04.24
#Linux
#sysctl
#оптимизация
#ядро
#производительность
#сеть
#память
#сервер
Подробный гайд по настройке параметров ядра 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 |
Макс. длина очереди входящих соединений |
1024–65535 |
Для Nginx/HAProxy ставьте ≥1024. Не выше 65535 без необходимости. |
net.core.netdev_max_backlog |
Буфер пакетов на сетевом интерфейсе |
2000–3000 |
Помогает при burst-трафике. |
net.ipv4.tcp_max_syn_backlog |
Очередь полуоткрытых SYN-соединений |
2048–8192 |
Должно быть ≥ 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 |
10–30 (серверы), 1–5 (БД) |
0 не отключает swap полностью (начиная с ядра 5.8). |
vm.dirty_background_ratio |
% памяти, после которого фоновая запись на диск |
5–10 |
Снижает лаги при интенсивной записи. |
vm.dirty_ratio |
% памяти, после которого процесс блокируется на запись |
10–20 |
Не ставьте слишком низким на медленных дисках. |
vm.vfs_cache_pressure |
Давление на кэш inode/dentry |
50–100 |
50 полезно при работе с миллионами мелких файлов. |
vm.min_free_kbytes |
Резерв свободной памяти (КБ) |
Авто или 512–2048 (для >8 ГБ ОЗУ) |
Ядро рассчитывает автоматически. Ручная правка нужна редко. |
vm.overcommit_memory |
Политика выделения памяти |
0 (эвристика), 2 (строго) |
Для БД/контейнеров часто 2 + vm.overcommit_ratio=80. |
vm.max_map_count |
Макс. количество memory map regions |
262144–1048576 |
Обязательно для 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. Лучшие практики и предостережения
- Меняйте по одному параметру → тестируйте → фиксируйте результат.
- Учитывайте версию ядра: Поведение tcp_tw_reuse, bbr, swappiness менялось между 4.x, 5.x и 6.x.
- Контейнеры: Параметры net.* и fs.* часто глобальны для хоста. В Docker/Containerd часть ограничений задаётся через --sysctl.
- Не отключайте полностью своп (swappiness=0 в старых ядрах мог вызывать OOM). В современных ядрах используйте vm.swappiness=1 + zswap/zram при необходимости.
- Используйте tuned: В RHEL/Alma/Rocky/Fedora tuned предлагает проверенные профили (throughput-performance, latency-performance, virtual-guest).
- Документируйте: Комментируйте в конфигах зачем и когда меняли параметр.