8.1 KiB
Руководство по High-Load конфигурации и тюнингу
При развертывании Telemt под высокой нагрузкой (десятки и сотни тысяч одновременных подключений), стандартные ограничения сетевого стека ОС могут приводить к потерям пакетов, переключениям контекста CPU и отказам в соединениях. В данном руководстве описана настройка ядра Linux, системных лимитов и аппаратной конфигурации для работы в подобных сценариях.
1. Системные лимиты и файловые дескрипторы
Каждое TCP-сосоединение требует файлового дескриптора. При 100 тысячах соединений стандартные лимиты Linux (зачастую 1024 или 65535) будут исчерпаны немедленно.
Общесистемные лимиты (sysctl)
Увеличьте глобальный лимит файловых дескрипторов в /etc/sysctl.conf:
fs.file-max = 2097152
fs.nr_open = 2097152
На уровне пользователя (limits.conf)
Отредактируйте /etc/security/limits.conf, чтобы разрешить пользователю (от которого запущен telemt) резервировать дескрипторы:
* soft nofile 1048576
* hard nofile 1048576
root soft nofile 1048576
root hard nofile 1048576
Переопределения для Systemd / Docker
Если используется Systemd, добавьте в ваш telemt.service:
[Service]
LimitNOFILE=1048576
LimitNPROC=65535
TasksMax=infinity
Если используется Docker, задайте ulimits в docker-compose.yaml:
services:
telemt:
ulimits:
nofile:
soft: 1048576
hard: 1048576
2. Тонкая настройка сетевого стека ядра (sysctl)
Создайте выделенный файл /etc/sysctl.d/99-telemt-highload.conf и примените его через sysctl -p /etc/sysctl.d/99-telemt-highload.conf.
2.1 Очереди соединений и защита от SYN-флуда
Увеличьте размеры очередей, чтобы поглощать внезапные всплески соединений и смягчить атаки типа SYN flood:
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_syncookies = 1
2.2 Исчерпание портов и TIME-WAIT сокеты
Высокая текучесть приводит к нехватке временных (ephemeral) портов. Расширьте диапазон портов и позвольте ядру быстро переиспользовать закрытые сокеты:
net.ipv4.ip_local_port_range = 10000 65535
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_tw_buckets = 2000000
2.3 TCP Keepalive (Агрессивная очистка мертвых соединений)
По умолчанию Linux держит "оборванные" TCP-сессии более 2 часов. Задайте параметры для обнаружения и сброса мертвых соединений за менее чем 5 минут:
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 5
2.4 Буферы TCP и управление перегрузками (Congestion Control)
Оптимизируйте использование памяти на сокет и переключитесь на алгоритм BBR (Bottleneck Bandwidth and Round-trip propagation time) для улучшения задержки на плохих сетях:
# Размеры буферов ядра (по умолчанию и макс)
net.core.rmem_default = 262144
net.core.wmem_default = 262144
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
# Специфичные TCP буферы (min, default, max)
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
# Включение BBR
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
3. Тюнинг Conntrack (Netfilter)
Если ваш сервер использует iptables, ufw или firewalld, ядро вынуждено отслеживать каждое соединение в таблице состояний (nf_conntrack). Когда эта таблица переполняется, Linux отбрасывает новые пакеты без уведомления приложения.
Проверьте текущие лимиты и использование:
sysctl net.netfilter.nf_conntrack_max
sysctl net.netfilter.nf_conntrack_count
Если вы близки к пределу, увеличьте таблицу и заставьте ядро быстрее удалять установленные соединения. Добавьте в /etc/sysctl.d/99-telemt-highload.conf:
net.netfilter.nf_conntrack_max = 2097152
# Снижаем таймаут с дефолтных 5 дней до 1 часа
net.netfilter.nf_conntrack_tcp_timeout_established = 3600
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 12
Внимание: в зависимости от ОС, вам может потребоваться выполнить modprobe nf_conntrack перед установкой этих параметров.
4. Архитектура: Развертывание за HAProxy
Для максимальных нагрузок выставление Telemt напрямую в интернет менее эффективно, чем использование оптимизированного L4-балансировщика. HAProxy эффективен в поглощении TCP атак, обработке рукопожатий и сглаживании всплесков подключений.
Оптимизация haproxy.cfg для High-Load
global
# Отключить детальные логи соединений под нагрузкой
log stdout format raw local0 err
maxconn 250000
# Использовать все ядра CPU
nbthread auto
# Тюнинг буферов и приема сокетов
tune.bufsize 16384
tune.maxaccept 64
defaults
log global
mode tcp
option clitcpka
option srvtcpka
timeout connect 5s
timeout client 1h
timeout server 1h
# Быстрая очистка мертвых пиров
timeout client-fin 10s
timeout server-fin 10s
frontend proxy_in
bind *:443
maxconn 250000
option tcp-smart-accept
default_backend telemt_backend
backend telemt_backend
option tcp-smart-connect
# Send-Proxy-V2 обязателен для сохранения IP клиента внутри внутренней логики Telemt
server telemt_core 10.10.10.1:443 maxconn 250000 send-proxy-v2 check inter 5s
Важно: Telemt должен быть настроен на обработку протокола PROXY на порту 443, чтобы получать оригинальные IP-адреса клиентов.
5. Диагностика
Команды для выявления узких мест:
- Проверка дропов TCP (переполнение очередей):
netstat -s | grep "times the listen queue of a socket overflowed" - Контроль отбрасывания пакетов Conntrack:
dmesg | grep conntrack - Проверка использования файловых дескрипторов:
cat /proc/sys/fs/file-nr - Отображение состояния сокетов:
ss -s(Избегайте использованияnetstatпод высокой нагрузкой).