虚拟机中的 Haproxy 吞吐量性能

虚拟机中的 Haproxy 吞吐量性能

我是 HAProxy 的新手,但我能够使其正常运行,尽管我没有获得我期望的吞吐量。

我的设置包括一个 5 节点存储集群(运行 Riak CS,一种 S3 样式的存储)和另一个运行 HAProxy 的 VM roundrobin。所有 VM 都使用 VirtualBox,每个 VM 都在专用机器上。HAProxy VM 运行在 Windows 7 上,而其他 VM 运行在 Windows 10 上。所有这些都在同一个千兆网络上,我为 HAProxy 测试了 1.4 和 1.5。

我有一个脚本(python + boto),可以反复下载 100 MB 的文件而不保存到磁盘,我相信每个脚本都应该归结为一个简单的获取请求,并且我在本地运行该脚本 3 次以增加负载。

如果我将它们全部指向 HAProxy 的 IP,我可以获得大约 4-500 Mbps 的下载速度,而如果我不使用 HAProxy 并将每个指向单独的 IP,我则可以获得高达 900+ Mbps 的下载速度。

进行此测试时,HAProxy 似乎已将单个核心的负载最大化,并成为瓶颈。对于正在运行的单个脚本(我相信是单个连接),它占用了 HAProxy 上 20-40% 的核心 CPU,这似乎很可疑?

这听起来像HAProxy 可以处理高吞吐量因此,我尝试调试我可能在 Ubuntu 或 HAProxy 配置文件中设置错误的地方。我发现nbproc 3配置中的改进很小,负载在 3 个进程之间肯定不平衡,因为其中一个进程仍处于最大负载状态。

此设置中是否有任何潜在危险,例如虚拟机?我的 haproxy 配置是否是罪魁祸首?或者我的常规 Ubuntu 设置?还值得一问的是,这是 HAProxy 的好用例还是坏用例?

编辑

我还需要进一步挖掘,但我目前的感觉是,这是特定于 VM 的,可能在以太网驱动程序 (e1000) 中?我能够将 HAProxy 设置移动到物理机器 (而不是 VM),并且在单核上,它几乎没有记录我之前的测试用例中的任何 CPU 使用率...

完整配置

global
    #log 127.0.0.1   local0
    #log 127.0.0.1   local1 notice
    maxconn 256000
    spread-checks 5
    daemon 
    nbproc 4 
    cpu-map 1 2
    cpu-map 2 3
    cpu-map 3 4
    cpu-map 4 5

defaults
    option dontlog-normal
    option  redispatch
    option  allbackups
    no option   httpclose
    retries 3
    maxconn 256000
    contimeout  5000
    clitimeout  5000
    srvtimeout  5000

    option forwardfor except 127.0.0.1

frontend riak_cs
    bind          *:8098
    bind          *:8080
    mode          http
    capture       request header Host len 64

    acl d1 dst_port 8098
    acl d2 dst_port 8080

    use_backend   riak_cs_backend_stats if d1
    use_backend   riak_cs_backend if d2



backend riak_cs_backend
    mode http 
    balance roundrobin
    option httpchk GET /riak-cs/ping
    timeout connect 60s
    timeout http-request 60s

    stats enable
    stats uri /haproxy?stats

    server riak1 192.168.80.105:8080 weight 1 maxconn 1024 check inter 5s 
    server riak2 192.168.80.106:8080 weight 1 maxconn 1024 check inter 5s
    server riak3 192.168.80.107:8080 weight 1 maxconn 1024 check inter 5s
    server riak4 192.168.80.108:8080 weight 1 maxconn 1024 check inter 5s
    server riak5 192.168.80.109:8080 weight 1 maxconn 1024 check inter 5s

backend riak_cs_backend_stats 
    mode http
    balance roundrobin
    timeout connect 60s
    timeout http-request 60s

    stats enable 
    stats uri /haproxy?stats

    server riak1 192.168.80.105:8098 weight 1 maxconn 1024 
    server riak2 192.168.80.106:8098 weight 1 maxconn 1024
    server riak3 192.168.80.107:8098 weight 1 maxconn 1024
    server riak4 192.168.80.108:8098 weight 1 maxconn 1024 
    server riak5 192.168.80.109:8098 weight 1 maxconn 1024 

答案1

我讨厌回答自己的问题,但我认为我的结论是我的测试受到虚拟机限制。我不能确切地说出具体原因,但通过我的虚拟机,HAProxy 的 CPU 使用率要高得多,而且正如我上面提到的,在具有相同配置的物理硬件上进行测试,即使删除该nbproc部分,我也几乎看不到 HAProxy 中的 CPU 负载。

我的目标不是通过虚拟机来运行任何生产环境,但它们对于测试(等待实际硬件时)和了解这些东西的工作原理来说更加方便。

答案2

由于您没有显示您的配置或正在使用的版本(请参阅我的评论),这有点像“盲目射击”。无论如何,您可以尝试将每个HAProxy进程固定到一个特定的核心,尝试最大化它们,并平衡它们之间的负载。

引用文档:

cpu-map <"all"|"odd"|"even"|process_num> <cpu-set>...

在 Linux 2.6 及更高版本中,可以将进程绑定到特定的 CPU 集。这意味着该进程永远不会在其他 CPU 上运行。该cpu-map 指令为进程集指定 CPU 集。第一个参数是需要绑定的进程号。此进程必须具有 1 到 32 或 64 之间的数字,具体取决于机器的字长,并且任何大于 nbproc 的进程 ID 都将被忽略。可以使用 一次指定所有进程all,仅使用 指定奇数odd或使用 指定偶数even,就像使用 bind-process指令一样。第二个和即将出现的参数是 CPU 集。每个 CPU 集都是 0 到 31 或 63 之间的唯一数字,或者是用破折号(“-”)分隔的两个这样的数字的范围。可以指定多个 CPU 编号或范围,并且允许进程绑定到所有 CPU 编号或范围。显然,cpu-map可以指定多个指令。当它们重叠时,每个cpu-map 指令将替换前一个指令。

因此,如果您使用三个流程,请测试以下内容:

cpu-map 1 0
cpu-map 2 1
cpu-map 3 2

相关内容