I had a 95% CPU usage with a single haproxy process, so I switched to nbproc 2
.
I have a two frontends and two backends; I pinned 1 frontend and 1 backend to process 1, and pinned the remaining two to process 2. I expected the load on the CPU cores to be distributed based on the load of the frontend/backend groups, however, now I have two haproxy processes, one using 20% CPU, the other still using 95% CPU. Why is that the case?
I am not yet dropping connections, but I will be as I start using even more CPU on that one thread.
Configuration is as follows:
global
nbproc 2
maxconn 150000
user root # haproxy
group root # haproxy
daemon
stats socket /var/run/haproxy.sock group haproxy mode 775
defaults
mode tcp
timeout connect 5000ms
timeout client 130s
timeout server 130s
frontend http-in
bind-process 2
bind *:80
mode http
maxconn 40000
acl host_typea hdr(host) -i typea.example.com
acl host_typeb hdr(host) -i www.example.com
use_backend typea-backend if host_typea
use_backend typeb-backend if host_typeb
default_backend typeb-backend
frontend proxy-customers-frontend
bind-process 1
bind *:20000
maxconn 10000
option httpclose
mode http
log global
acl host_typec hdr(proxy-authorization) -m len gt 80
use_backend typec-backend if host_typec
default_backend typed-backend
backend typea-backend
bind-process 2
mode http
balance url_param ip check_post
server localhost-30000 127.0.0.1:30000 check
server localhost-30001 127.0.0.1:30001 check
server localhost-30002 127.0.0.1:30002 check
server localhost-30003 127.0.0.1:30003 check
server localhost-30004 127.0.0.1:30004 check
server localhost-30005 127.0.0.1:30005 check
server localhost-30006 127.0.0.1:30006 check
server localhost-30007 127.0.0.1:30007 check
backend typeb-backend
bind-process 2
mode http
option forwardfor
server localhost-81 127.0.0.1:81 check
backend typec-backend
bind-process 1
mode http
server localhost-19999 127.0.0.1:19999 check
backend typed-backend
bind-process 1
mode http
server localhost-20001 127.0.0.1:20001 check
server localhost-20002 127.0.0.1:20002 check
server localhost-20003 127.0.0.1:20003 check
server localhost-20004 127.0.0.1:20004 check
server localhost-20005 127.0.0.1:20005 check
server localhost-20006 127.0.0.1:20006 check
server localhost-20007 127.0.0.1:20007 check
server localhost-20008 127.0.0.1:20008 check
I've just started down a similar road with enabling multiple processes for haproxy. Based on the information here, it appears that the default behavior of the Linux kernel is for the processes to inherit CPU affinity from the parent, which would default to the same CPU. I believe you will see a difference if you map each process to a specific CPU with cpu-map: