Haproxy“nbproc 2”高 CPU

Haproxy“nbproc 2”高 CPU

我的单个 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

相关内容