Kernel params, ulimits, threading, maxconn, buffer sizes
Kernel params, ulimits, threading, maxconn, buffer sizes для высокой производительности.
# /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)"# /etc/security/limits.d/haproxy.conf
haproxy soft nofile 100000
haproxy hard nofile 100000
haproxy soft nproc 50000
haproxy hard nproc 50000Параметры:
nofile — максимальное количество открытых файловnproc — максимальное количество процессов/потоков# Для текущего пользователя
ulimit -n
ulimit -u
# Для процесса HAProxy
cat /proc/$(pidof haproxy)/limits | grep "open files"# /etc/systemd/system/haproxy.service.d/override.conf
[Service]
LimitNOFILE=100000
LimitNPROC=50000Применение:
sudo systemctl daemon-reload
sudo systemctl restart haproxyglobal
master-worker
nbthread 8Рекомендации:
nbthread = числу CPU ядерnbthread = числу физических ядерnproc или lscpuglobal
master-worker
nbthread 8
cpu-affinity 0-7Параметр:
cpu-affinity 0-7 — привязка к ядрам 0-7# Проверка NUMA
numactl --hardware
# Запуск на конкретной NUMA node
numactl --cpunodebind=0 --membind=0 haproxy -f /etc/haproxy/haproxy.cfgglobal
maxconn 50000Расчёт:
maxconn = (ulimit-n - резерв) / 2
maxconn = (100000 - 1000) / 2 = 49500
frontend http_front
bind *:80
maxconn 10000Когда использовать:
backend web_servers
server web1 192.168.1.10:8080 maxconn 100 check
server web2 192.168.1.11:8080 maxconn 100 checkПоведение:
global
tune.bufsize 16384
tune.maxrewrite 1024Параметры:
tune.bufsize — размер буфера для HTTP заголовков (по умолчанию 4096)tune.maxrewrite — место для rewrite операцийglobal
# Большие JWT токены, много кастомных заголовков
tune.bufsize 32764Признаки проблем:
400 Bad Request с большими заголовками502 Bad Gatewayglobal
tune.comp.maxlevel 9Параметр:
tune.comp.maxlevel — уровень компрессии (1-9)global
tune.ssl.lifetime 3600
tune.ssl.default-dh-param 2048Параметры:
tune.ssl.lifetime — время жизни SSL сессии (секунды)tune.ssl.default-dh-param — размер DH параметров (биты)global
ssl-cache-size 10000Параметр:
global
ssl-engine aesni-xts-aes128-gcmПараметр:
openssl engine -tglobal
maxconn 50000
tune.pipesize 65536Параметры:
tune.pipesize — размер pipe buffer для splice()global
max-spread-checks 5000Параметр:
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 — баланс между ожиданием и отказомdefaults
retries 3
option redispatchПараметры:
retries — количество попыток подключенияoption redispatch — переключение на другой сервер при неудаче# /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# Тест 1000 соединений, 10000 запросов
h2load -n 10000 -c 1000 https://example.com/
# Тест с rate limiting
h2load -n 100000 -c 100 --rate 1000 https://example.com/# Базовый тест
wrk -t12 -c400 -d30s http://example.com/
# С POST
wrk -t12 -c400 -d30s -H "Content-Type: application/json" \
--post data.json http://example.com/apiab -n 10000 -c 100 http://example.com/# 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]))# 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# 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
# ✅ Хорошо (сбалансировано)
maxconn 50000
ulimit-n 100000
tune.bufsize 16384
# ❌ Слишком агрессивно (память)
# maxconn 1000000
# tune.bufsize 65536
# ❌ Слишком консервативно (производительность)
# maxconn 1000
# tune.bufsize 4096# ✅ Регулярная проверка
watch -n 1 'echo "show stat" | socat /var/run/haproxy/admin.sock stdio'
# ❌ Только при проблемах
# Проверка только когда всё упалоИзучим High Availability кластеры: Keepalived, VRRP, failover.
Вопросы ещё не добавлены
Вопросы для этой подтемы ещё не добавлены.