diff --git a/docs/Advanced_settings/HIGH_LOAD.en.md b/docs/Advanced_settings/HIGH_LOAD.en.md new file mode 100644 index 0000000..2d7f3c4 --- /dev/null +++ b/docs/Advanced_settings/HIGH_LOAD.en.md @@ -0,0 +1,142 @@ +# High-Load Configuration & Tuning Guide +When deploying Telemt under high-traffic load (tens or hundreds of thousands of concurrent connections), the standard OS network stack limits can lead to packet drops, high CPU context switching, and connection failures. This guide covers Linux kernel tuning, hardware configuration, and architecture optimizations required to prepare the server for high-load scenarios. + +--- +## 1. System Limits & File Descriptors +Every TCP connection requires a file descriptor. At 100k connections, standard Linux limits (often 1024 or 65535) will be exhausted immediately. +### System-Wide Limits (`sysctl`) +Increase the global file descriptor limit in `/etc/sysctl.conf`: +```ini +fs.file-max = 2097152 +fs.nr_open = 2097152 +``` +### User-Level Limits (`limits.conf`) +Edit `/etc/security/limits.conf` to allow the telemt (or proxy) user to allocate them: +```conf +* soft nofile 1048576 +* hard nofile 1048576 +root soft nofile 1048576 +root hard nofile 1048576 +``` +### Systemd / Docker Overrides +If using **Systemd**, add to your `telemt.service`: +```ini +[Service] +LimitNOFILE=1048576 +LimitNPROC=65535 +TasksMax=infinity +``` +If using **Docker**, configure `ulimits` in `docker-compose.yaml`: +```yaml +services: + telemt: + ulimits: + nofile: + soft: 1048576 + hard: 1048576 +``` + +--- +## 2. Kernel Network Stack Tuning (`sysctl`) +Create a dedicated file `/etc/sysctl.d/99-telemt-highload.conf` and apply it via `sysctl -p /etc/sysctl.d/99-telemt-highload.conf`. +### 2.1 Connection Queues & SYN Flood Protection +Increase the size of accept queues to absorb sudden connection spikes (bursts) and mitigate SYN floods: +```ini +net.core.somaxconn = 65535 +net.core.netdev_max_backlog = 65535 +net.ipv4.tcp_max_syn_backlog = 65535 +net.ipv4.tcp_syncookies = 1 +``` +### 2.2 Port Exhaustion & TIME-WAIT Sockets +High churn rates lead to ephemeral port exhaustion. Expand the range and rapidly recycle closed sockets: +```ini +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 (Aggressive Dead Connection Culling) +By default, Linux keeps silent, dropped connections open for over 2 hours. This consumes memory at scale. Configure the system to detect and drop them in < 5 minutes: +```ini +net.ipv4.tcp_keepalive_time = 300 +net.ipv4.tcp_keepalive_intvl = 30 +net.ipv4.tcp_keepalive_probes = 5 +``` +### 2.4 TCP Buffers & Congestion Control +Optimize memory usage per socket and switch to BBR (Bottleneck Bandwidth and Round-trip propagation time) to improve latency on lossy networks: +```ini +# Core buffer sizes +net.core.rmem_default = 262144 +net.core.wmem_default = 262144 +net.core.rmem_max = 16777216 +net.core.wmem_max = 16777216 +# TCP specific buffers (min, default, max) +net.ipv4.tcp_rmem = 4096 87380 16777216 +net.ipv4.tcp_wmem = 4096 65536 16777216 +# Enable BBR +net.core.default_qdisc = fq +net.ipv4.tcp_congestion_control = bbr +``` + +--- +## 3. Conntrack (Netfilter) Tuning +If your server uses `iptables`, `ufw`, or `firewalld`, the Linux kernel tracks every connection state in a table (`nf_conntrack`). When this table fills up, Linux drops new packets. +Check your current limit and usage: +```bash +sysctl net.netfilter.nf_conntrack_max +sysctl net.netfilter.nf_conntrack_count +``` +If it gets close to the limit, tune it up, and reduce the time established connections linger in the tracker: +```ini +# In /etc/sysctl.d/99-telemt-highload.conf +net.netfilter.nf_conntrack_max = 2097152 +# Reduce timeout from default 5 days to 1 hour +net.netfilter.nf_conntrack_tcp_timeout_established = 3600 +net.netfilter.nf_conntrack_tcp_timeout_time_wait = 12 +``` +*Note: Depending on your OS, you may need to run `modprobe nf_conntrack` before setting these parameters.* + +--- +## 4. Multi-Tier Architecture: HAProxy Setup +For massive traffic loads, buffering Telemt behind a reverse proxy like HAProxy can help absorb connection spikes and handle basic TCP connections before handing them off. +### HAProxy High-Load `haproxy.cfg` +```haproxy +global + # Disable detailed logging under load + log stdout format raw local0 err + maxconn 250000 + # Threading optimizations (explicitly use all cores) + nbthread auto + # Buffer tuning + tune.bufsize 16384 + tune.maxaccept 64 +defaults + log global + mode tcp + option clitcpka + option srvtcpka + timeout connect 5s + timeout client 1h + timeout server 1h + # Quick purge for dead peers + 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 to preserve Client IP for Telemt's internal logic + server telemt_core 127.0.0.1:8443 maxconn 250000 send-proxy-v2 check inter 5s +``` +**Important**: Telemt must be configured to process the `PROXY` protocol on port `8443` for this chain to work and preserve client IPs. + +--- +## 5. Diagnostics & Monitoring +When operating under load, these commands are useful for diagnostics: +* **Checking dropped connections (Queues full)**: `netstat -s | grep "times the listen queue of a socket overflowed"` +* **Checking Conntrack drops**: `dmesg | grep conntrack` +* **Checking File Descriptor usage**: `cat /proc/sys/fs/file-nr` +* **Real-time connection states**: `ss -s` (Avoid using `netstat` on heavy loads). diff --git a/docs/Advanced_settings/HIGH_LOAD.ru.md b/docs/Advanced_settings/HIGH_LOAD.ru.md new file mode 100644 index 0000000..7c07155 --- /dev/null +++ b/docs/Advanced_settings/HIGH_LOAD.ru.md @@ -0,0 +1,141 @@ +# Руководство по High-Load конфигурации и тюнингу +При развертывании Telemt под высокой нагрузкой (десятки и сотни тысяч одновременных подключений), стандартные ограничения сетевого стека ОС могут приводить к потерям пакетов, переключениям контекста CPU и отказам в соединениях. В данном руководстве описана настройка ядра Linux, системных лимитов и аппаратной конфигурации для работы в подобных сценариях. + +--- +## 1. Системные лимиты и файловые дескрипторы +Каждое TCP-сосоединение требует файлового дескриптора. При 100 тысячах соединений стандартные лимиты Linux (зачастую 1024 или 65535) будут исчерпаны немедленно. +### Общесистемные лимиты (`sysctl`) +Увеличьте глобальный лимит файловых дескрипторов в `/etc/sysctl.conf`: +```ini +fs.file-max = 2097152 +fs.nr_open = 2097152 +``` +### На уровне пользователя (`limits.conf`) +Отредактируйте `/etc/security/limits.conf`, чтобы разрешить пользователю (от которого запущен telemt) резервировать дескрипторы: +```conf +* soft nofile 1048576 +* hard nofile 1048576 +root soft nofile 1048576 +root hard nofile 1048576 +``` +### Переопределения для Systemd / Docker +Если используется **Systemd**, добавьте в ваш `telemt.service`: +```ini +[Service] +LimitNOFILE=1048576 +LimitNPROC=65535 +TasksMax=infinity +``` +Если используется **Docker**, задайте `ulimits` в `docker-compose.yaml`: +```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: +```ini +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) портов. Расширьте диапазон портов и позвольте ядру быстро переиспользовать закрытые сокеты: +```ini +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 минут: +```ini +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) для улучшения задержки на плохих сетях: +```ini +# Размеры буферов ядра (по умолчанию и макс) +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 отбрасывает новые пакеты без уведомления приложения. +Проверьте текущие лимиты и использование: +```bash +sysctl net.netfilter.nf_conntrack_max +sysctl net.netfilter.nf_conntrack_count +``` +Если вы близки к пределу, увеличьте таблицу и заставьте ядро быстрее удалять установленные соединения. Добавьте в `/etc/sysctl.d/99-telemt-highload.conf`: +```ini +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 +```haproxy +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 127.0.0.1:8443 maxconn 250000 send-proxy-v2 check inter 5s +``` +**Важно**: Telemt должен быть настроен на обработку протокола `PROXY` на порту `8443`, чтобы получать оригинальные 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` под высокой нагрузкой).