Перейти к основному контенту
Tech Path Finder
КурсыИнтервьюКод-ревьюБлог
Tech Path Finder

Персонализированный путеводитель в IT. Квизы, мок-интервью, код ревью и аналитика прогресса.

@potapov_me

Платформа

  • Курсы
  • Прогресс
  • Мок-интервью
  • Код ревью
  • Живое ревью с ИИ
  • Тренажёр переговоров
  • Закладки

Контент

  • Блог
  • Главная
  • Обратная связь

Компания

  • О проекте
  • Тарифы
  • Условия использования
  • Конфиденциальность
  • Согласие на обработку данных
  • Cookie
  • Реквизиты

Аккаунт

  • Войти
  • Зарегистрироваться
  • Профиль

© 2026 Tech Path Finder. Все права защищены.

·ИП Потапов К.С.·Политика конфиденциальности·
Сделано с ❤️ в России
  1. Тюнинг производительности
performance_tuning

Тюнинг производительности

Kernel params, ulimits, threading, maxconn, buffer sizes

Тюнинг производительности HAProxy

Kernel params, ulimits, threading, maxconn, buffer sizes для высокой производительности.

#Tuning ядра Linux

#Сетевые параметры

# /etc/sysctl.d/60-haproxy.conf # Увеличиваем очередь входящих соединений net.core.somaxconn = 10240 # Увеличиваем backlog для listen() net.ipv4.tcp_max_syn_backlog = 10240 # Разрешаем reuse TIME_WAIT сокетов net.ipv4.tcp_tw_reuse = 1 # Уменьшаем время FIN_WAIT net.ipv4.tcp_fin_timeout = 15 # Расширяем диапазон ephemeral ports net.ipv4.ip_local_port_range = 1024 65535 # Увеличиваем буферы TCP net.ipv4.tcp_rmem = 4096 87380 67108864 net.ipv4.tcp_wmem = 4096 65536 67108864 # Отключаем slow start после idle net.ipv4.tcp_slow_start_after_idle = 0 # Увеличиваем максимальное количество сокетов net.core.netdev_max_backlog = 5000 # Отключаем path MTU discovery (проблемы с некоторыми роутерами) # net.ipv4.tcp_mtu_probing = 1

Применение:

sudo sysctl -p /etc/sysctl.d/60-haproxy.conf

#Проверка параметров

# Проверка текущего значения sysctl net.core.somaxconn sysctl net.ipv4.ip_local_port_range # Проверка всех параметров sysctl -a | grep -E "(somaxconn|tcp_max_syn_backlog|tcp_tw_reuse)"

#Ulimits

#Настройка ulimits

# /etc/security/limits.d/haproxy.conf haproxy soft nofile 100000 haproxy hard nofile 100000 haproxy soft nproc 50000 haproxy hard nproc 50000

Параметры:

  • nofile — максимальное количество открытых файлов
  • nproc — максимальное количество процессов/потоков

#Проверка ulimits

# Для текущего пользователя ulimit -n ulimit -u # Для процесса HAProxy cat /proc/$(pidof haproxy)/limits | grep "open files"

#Systemd service

# /etc/systemd/system/haproxy.service.d/override.conf [Service] LimitNOFILE=100000 LimitNPROC=50000

Применение:

sudo systemctl daemon-reload sudo systemctl restart haproxy

#Threading

#Настройка потоков

global master-worker nbthread 8

Рекомендации:

  • nbthread = числу CPU ядер
  • Для hyperthreading: nbthread = числу физических ядер
  • Проверка: nproc или lscpu

#CPU affinity

global master-worker nbthread 8 cpu-affinity 0-7

Параметр:

  • cpu-affinity 0-7 — привязка к ядрам 0-7

#NUMA awareness

# Проверка NUMA numactl --hardware # Запуск на конкретной NUMA node numactl --cpunodebind=0 --membind=0 haproxy -f /etc/haproxy/haproxy.cfg

#Maxconn

#Глобальный maxconn

global maxconn 50000

Расчёт:

maxconn = (ulimit-n - резерв) / 2
maxconn = (100000 - 1000) / 2 = 49500

#Maxconn на frontend

frontend http_front bind *:80 maxconn 10000

Когда использовать:

  • Ограничение конкретного frontend
  • Защита от перегрузки

#Maxconn на server

backend web_servers server web1 192.168.1.10:8080 maxconn 100 check server web2 192.168.1.11:8080 maxconn 100 check

Поведение:

  • Превышение — запросы в очередь
  • Fair sharing между серверами

#Buffer Tuning

#Размер буфера

global tune.bufsize 16384 tune.maxrewrite 1024

Параметры:

  • tune.bufsize — размер буфера для HTTP заголовков (по умолчанию 4096)
  • tune.maxrewrite — место для rewrite операций

#Когда увеличивать bufsize

global # Большие JWT токены, много кастомных заголовков tune.bufsize 32764

Признаки проблем:

  • Ошибки 400 Bad Request с большими заголовками
  • Обрезанные cookies
  • Ошибки 502 Bad Gateway

#Compression buffers

global tune.comp.maxlevel 9

Параметр:

  • tune.comp.maxlevel — уровень компрессии (1-9)
  • По умолчанию 1 (быстро)
  • 9 — максимальное сжатие, больше CPU

#SSL Tuning

#SSL cache

global tune.ssl.lifetime 3600 tune.ssl.default-dh-param 2048

Параметры:

  • tune.ssl.lifetime — время жизни SSL сессии (секунды)
  • tune.ssl.default-dh-param — размер DH параметров (биты)

#SSL cache size

global ssl-cache-size 10000

Параметр:

  • Количество SSL сессий в кэше
  • По умолчанию 20000

#SSL engines

global ssl-engine aesni-xts-aes128-gcm

Параметр:

  • Использование hardware crypto acceleration
  • Проверка: openssl engine -t

#Memory Tuning

#Pool size

global maxconn 50000 tune.pipesize 65536

Параметры:

  • tune.pipesize — размер pipe buffer для splice()

#Memory limit

global max-spread-checks 5000

Параметр:

  • Ограничение проверок health check одновременно

#Connection Tuning

#Timeout tuning

defaults timeout connect 5s timeout client 30s timeout server 30s timeout http-request 10s timeout http-keep-alive 5s timeout queue 30s

Рекомендации:

  • timeout connect — меньше для быстрого обнаружения проблем
  • timeout client/server — больше для медленных клиентов
  • timeout queue — баланс между ожиданием и отказом

#Retries

defaults retries 3 option redispatch

Параметры:

  • retries — количество попыток подключения
  • option redispatch — переключение на другой сервер при неудаче

#Full Example: High Performance

# /etc/sysctl.d/60-haproxy.conf net.core.somaxconn = 10240 net.ipv4.tcp_max_syn_backlog = 10240 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_fin_timeout = 15 net.ipv4.ip_local_port_range = 1024 65535 net.ipv4.tcp_rmem = 4096 87380 67108864 net.ipv4.tcp_wmem = 4096 65536 67108864 net.ipv4.tcp_slow_start_after_idle = 0 net.core.netdev_max_backlog = 5000 # /etc/security/limits.d/haproxy.conf haproxy soft nofile 100000 haproxy hard nofile 100000 haproxy soft nproc 50000 haproxy hard nproc 50000 # /etc/systemd/system/haproxy.service.d/override.conf [Service] LimitNOFILE=100000 LimitNPROC=50000 # /etc/haproxy/haproxy.cfg global master-worker nbthread 8 cpu-affinity 0-7 maxconn 50000 tune.bufsize 16384 tune.maxrewrite 1024 tune.pipesize 65536 tune.ssl.lifetime 3600 tune.ssl.default-dh-param 2048 log /dev/log local0 info defaults log global mode http option httplog option dontlognull timeout connect 5s timeout client 30s timeout server 30s timeout http-request 10s timeout http-keep-alive 5s timeout queue 30s retries 3 option redispatch frontend https_front bind *:443 ssl crt /etc/haproxy/certs/site.pem maxconn 10000 default_backend web_servers backend web_servers balance roundrobin server web1 192.168.1.10:8080 check maxconn 100 server web2 192.168.1.11:8080 check maxconn 100 server web3 192.168.1.12:8080 check maxconn 100

#Benchmarking

#H2load (HTTP/2)

# Тест 1000 соединений, 10000 запросов h2load -n 10000 -c 1000 https://example.com/ # Тест с rate limiting h2load -n 100000 -c 100 --rate 1000 https://example.com/

#Wrk

# Базовый тест wrk -t12 -c400 -d30s http://example.com/ # С POST wrk -t12 -c400 -d30s -H "Content-Type: application/json" \ --post data.json http://example.com/api

#AB (Apache Benchmark)

ab -n 10000 -c 100 http://example.com/

#Monitoring производительности

#Ключевые метрики

# CPU usage haproxy_process_cpu_usage_percent # Memory usage haproxy_process_memory_bytes # Connections haproxy_frontend_current_sessions # Queue haproxy_backend_current_queue # Response time histogram_quantile(0.95, rate(haproxy_server_response_time_seconds_bucket[5m]))

#Проверка bottlenecks

# CPU top -p $(pidof haproxy) # Memory cat /proc/$(pidof haproxy)/status | grep Vm # Network iftop -P -n -p "port 80 or port 443" # Socket statistics ss -s netstat -s

#Troubleshooting

#Проверка параметров

# sysctl sysctl net.core.somaxconn sysctl net.ipv4.ip_local_port_range # ulimits cat /proc/$(pidof haproxy)/limits # HAProxy info echo "show info" | socat /var/run/haproxy/admin.sock stdio

#Ошибки производительности

# Too many open files
error: cannot create socket: Too many open files
# Решение: увеличить ulimit -n

# Cannot assign requested address
error: cannot bind socket: Cannot assign requested address
# Решение: увеличить ip_local_port_range

# Listen backlog exceeded
warning: listen backlog exceeded
# Решение: увеличить somaxconn

#Best Practices

#Балансировка настроек

# ✅ Хорошо (сбалансировано) maxconn 50000 ulimit-n 100000 tune.bufsize 16384 # ❌ Слишком агрессивно (память) # maxconn 1000000 # tune.bufsize 65536 # ❌ Слишком консервативно (производительность) # maxconn 1000 # tune.bufsize 4096

#Monitoring

# ✅ Регулярная проверка watch -n 1 'echo "show stat" | socat /var/run/haproxy/admin.sock stdio' # ❌ Только при проблемах # Проверка только когда всё упало

Далее: High Availability кластеры