我的单个 haproxy 进程的 CPU 使用率高达 95%,因此我切换到了nbproc 2
。
我有两个前端和两个后端;我将 1 个前端和 1 个后端固定到进程 1,将其余两个固定到进程 2。我预计 CPU 核心上的负载将根据前端/后端组的负载进行分配,但是,现在我有两个 haproxy 进程,一个使用 20% 的 CPU,另一个仍然使用 95% 的 CPU。为什么会这样?
我还没有断开连接,但当我开始在那个线程上使用更多的 CPU 时我就会断开连接。
配置如下:
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
答案1
我刚刚开始尝试为 haproxy 启用多个进程。根据信息这里看来 Linux 内核的默认行为是让进程从父进程继承 CPU 亲和性,父进程默认为同一个 CPU。我相信,如果你使用 cpu-map 将每个进程映射到特定的 CPU,你会看到差异:
nbproc 2
cpu-map 1 0
cpu-map 2 1