Hi,
We are letting HAProxy pick what it think is best for our hardware. It
seems to always pick `nbproc = 1` (we only have one cpu socket), and
`nbthread = $(nproc)`
On 14/12/22 3:15, Emerson Gomes wrote:
Hi,
Have you tried increasing the number of processes/threads?
I dont see any nbthreads or nbproc in your config.
Check out https://www.haproxy.com/blog/multithreading-in-haproxy/
BR.,
Emerson
Em seg., 12 de dez. de 2022 às 02:49, Iago Alonso
<iago.alo...@marfeel.com> escreveu:
Hello,
We are performing a lot of load tests, and we hit what we think is an
artificial limit of some sort, or a parameter that we are not taking
into account (HAProxy config setting, kernel parameter…). We are
wondering if there’s a known limit on what HAProxy is able to process,
or if someone has experienced something similar, as we are thinking
about moving to bigger servers, and we don’t know if we will observe a
big difference.
When trying to perform the load test in production, we observe that we
can sustain 200k connections, and 10k rps, with a load1 of about 10.
The maxsslrate and maxsslconn are maxed out, but we handle the
requests fine, and we don’t return 5xx. Once we increase the load just
a bit and hit 11k rps and about 205k connections, we start to return
5xx and we rapidly decrease the load, as these are tests against
production.
Production server specs:
CPU: AMD Ryzen 7 3700X 8-Core Processor (16 threads)
RAM: DDR4 64GB (2666 MT/s)
When trying to perform a load test with synthetic tests using k6 as
our load generator against staging, we are able to sustain 750k
connections, with 20k rps. The load generator has a ramp-up time of
120s to achieve the 750k connections, as that’s what we are trying to
benchmark.
Staging server specs:
CPU: AMD Ryzen 5 3600 6-Core Processor (12 threads)
RAM: DDR4 64GB (3200 MT/s)
I've made a post about this on discourse, and I got the suggestion to
post here. In said post, I've included screenshots of some of our
Prometheus metrics.
https://discourse.haproxy.org/t/theoretical-limits-for-a-haproxy-instance/8168
Custom kernel parameters:
net.ipv4.ip_local_port_range = "12768 60999"
net.nf_conntrack_max = 5000000
fs.nr_open = 5000000
HAProxy config:
global
log /dev/log len 65535 local0 warning
chroot /var/lib/haproxy
stats socket /run/haproxy-admin.sock mode 660 level admin
user haproxy
group haproxy
daemon
maxconn 2000000
maxconnrate 2500
maxsslrate 2500
defaults
log global
option dontlognull
timeout connect 10s
timeout client 120s
timeout server 120s
frontend stats
mode http
bind *:8404
http-request use-service prometheus-exporter if { path /metrics }
stats enable
stats uri /stats
stats refresh 10s
frontend k8s-api
bind *:6443
mode tcp
option tcplog
timeout client 300s
default_backend k8s-api
backend k8s-api
mode tcp
option tcp-check
timeout server 300s
balance leastconn
default-server inter 10s downinter 5s rise 2 fall 2 slowstart 60s
maxconn 500 maxqueue 256 weight 100
server master01 x.x.x.x:6443 check
server master02 x.x.x.x:6443 check
server master03 x.x.x.x:6443 check
retries 0
frontend k8s-server
bind *:80
mode http
http-request add-header X-Forwarded-Proto http
http-request add-header X-Forwarded-Port 80
default_backend k8s-server
backend k8s-server
mode http
balance leastconn
option forwardfor
default-server inter 10s downinter 5s rise 2 fall 2 check
server worker01a x.x.x.x:31551 maxconn 200000
server worker02a x.x.x.x:31551 maxconn 200000
server worker03a x.x.x.x:31551 maxconn 200000
server worker04a x.x.x.x:31551 maxconn 200000
server worker05a x.x.x.x:31551 maxconn 200000
server worker06a x.x.x.x:31551 maxconn 200000
server worker07a x.x.x.x:31551 maxconn 200000
server worker08a x.x.x.x:31551 maxconn 200000
server worker09a x.x.x.x:31551 maxconn 200000
server worker10a x.x.x.x:31551 maxconn 200000
server worker11a x.x.x.x:31551 maxconn 200000
server worker12a x.x.x.x:31551 maxconn 200000
server worker13a x.x.x.x:31551 maxconn 200000
server worker14a x.x.x.x:31551 maxconn 200000
server worker15a x.x.x.x:31551 maxconn 200000
server worker16a x.x.x.x:31551 maxconn 200000
server worker17a x.x.x.x:31551 maxconn 200000
server worker18a x.x.x.x:31551 maxconn 200000
server worker19a x.x.x.x:31551 maxconn 200000
server worker20a x.x.x.x:31551 maxconn 200000
server worker01an x.x.x.x:31551 maxconn 200000
server worker02an x.x.x.x:31551 maxconn 200000
server worker03an x.x.x.x:31551 maxconn 200000
retries 0
frontend k8s-server-https
bind *:443 ssl crt /etc/haproxy/certs/
mode http
http-request add-header X-Forwarded-Proto https
http-request add-header X-Forwarded-Port 443
http-request del-header X-SERVER-SNI
http-request set-header X-SERVER-SNI %[ssl_fc_sni] if { ssl_fc_sni
-m found }
http-request set-var(txn.fc_sni) hdr(X-SERVER-SNI) if {
hdr(X-SERVER-SNI) -m found }
http-request del-header X-SERVER-SNI
default_backend k8s-server-https
backend k8s-server-https
mode http
balance leastconn
option forwardfor
default-server inter 10s downinter 5s rise 2 fall 2 check
no-check-ssl
server worker01a x.x.x.x:31445 ssl ca-file /etc/haproxy/ca/ca.crt
sni var(txn.fc_sni) maxconn 200000
server worker02a x.x.x.x:31445 ssl ca-file /etc/haproxy/ca/ca.crt
sni var(txn.fc_sni) maxconn 200000
server worker03a x.x.x.x:31445 ssl ca-file /etc/haproxy/ca/ca.crt
sni var(txn.fc_sni) maxconn 200000
server worker04a x.x.x.x:31445 ssl ca-file /etc/haproxy/ca/ca.crt
sni var(txn.fc_sni) maxconn 200000
server worker05a x.x.x.x:31445 ssl ca-file /etc/haproxy/ca/ca.crt
sni var(txn.fc_sni) maxconn 200000
server worker06a x.x.x.x:31445 ssl ca-file /etc/haproxy/ca/ca.crt
sni var(txn.fc_sni) maxconn 200000
server worker07a x.x.x.x:31445 ssl ca-file /etc/haproxy/ca/ca.crt
sni var(txn.fc_sni) maxconn 200000
server worker08a x.x.x.x:31445 ssl ca-file /etc/haproxy/ca/ca.crt
sni var(txn.fc_sni) maxconn 200000
server worker09a x.x.x.x:31445 ssl ca-file /etc/haproxy/ca/ca.crt
sni var(txn.fc_sni) maxconn 200000
server worker10a x.x.x.x:31445 ssl ca-file /etc/haproxy/ca/ca.crt
sni var(txn.fc_sni) maxconn 200000
server worker11a x.x.x.x:31445 ssl ca-file /etc/haproxy/ca/ca.crt
sni var(txn.fc_sni) maxconn 200000
server worker12a x.x.x.x:31445 ssl ca-file /etc/haproxy/ca/ca.crt
sni var(txn.fc_sni) maxconn 200000
server worker13a x.x.x.x:31445 ssl ca-file /etc/haproxy/ca/ca.crt
sni var(txn.fc_sni) maxconn 200000
server worker14a x.x.x.x:31445 ssl ca-file /etc/haproxy/ca/ca.crt
sni var(txn.fc_sni) maxconn 200000
server worker15a x.x.x.x:31445 ssl ca-file /etc/haproxy/ca/ca.crt
sni var(txn.fc_sni) maxconn 200000
server worker16a x.x.x.x:31445 ssl ca-file /etc/haproxy/ca/ca.crt
sni var(txn.fc_sni) maxconn 200000
server worker17a x.x.x.x:31445 ssl ca-file /etc/haproxy/ca/ca.crt
sni var(txn.fc_sni) maxconn 200000
server worker18a x.x.x.x:31445 ssl ca-file /etc/haproxy/ca/ca.crt
sni var(txn.fc_sni) maxconn 200000
server worker19a x.x.x.x:31445 ssl ca-file /etc/haproxy/ca/ca.crt
sni var(txn.fc_sni) maxconn 200000
server worker20a x.x.x.x:31445 ssl ca-file /etc/haproxy/ca/ca.crt
sni var(txn.fc_sni) maxconn 200000
server worker01an x.x.x.x:31445 ssl ca-file /etc/haproxy/ca/ca.crt
sni var(txn.fc_sni) maxconn 200000
server worker02an x.x.x.x:31445 ssl ca-file /etc/haproxy/ca/ca.crt
sni var(txn.fc_sni) maxconn 200000
server worker03an x.x.x.x:31445 ssl ca-file /etc/haproxy/ca/ca.crt
sni var(txn.fc_sni) maxconn 200000
retries 0
frontend k8s-nfs-monitor
bind *:8080
mode http
monitor-uri /health_nfs_cluster
acl k8s_server_down nbsrv(k8s-server) le 2
acl nfs_down nbsrv(nfs) lt 1
monitor fail if nfs_down || k8s_server_down
backend nfs
mode tcp
default-server inter 5s downinter 2s rise 1 fall 2
server nfs01 x.x.x.x:2049 check
frontend k8s-cluster-monitor
bind *:8081
mode http
monitor-uri /health_cluster
acl k8s_server_down nbsrv(k8s-server) le 2
monitor fail if k8s_server_down
Thanks in advance.