我是HAProxy的新手,但是我能够实现function,尽pipe我没有获得预期的吞吐量。
我的设置包括一个5节点的存储集群(运行Riak CS,S3风格存储)和另一个运行HroRroxy的虚拟机。 所有的虚拟机都使用VirtualBox,每个虚拟机都在专用的机器上。 HAProxy虚拟机在Windows 7上,而其他虚拟机在Windows 10.这是所有在同一个千兆networking上,我testing了1.4和1.5 HAProxy。
我有一个脚本(python + boto)下载而不保存到磁盘,反复100 MB的文件,我认为这应该归结为一个简单的获取请求,我本地运行该脚本3次增加的负载。
如果我把它们全部指向HAProxy的IP地址,我可以下载大约4-500 Mbps的数据,而如果我不使用HAProxy并且指向一个单独的IP地址,我可以达到900 Mbps以上。
在做这个testing的时候,看起来HAProxy正在最大化一个核心,变成瓶颈。 对于单个运行的脚本,我认为这是一个单一的连接,它正在吃HAProxy上的核心CPU的20-40%,这似乎是可疑的?
这听起来像HAProxy可以处理高吞吐量,所以我试图debugging我可能设置错误的地方,无论是在Ubuntu或HAProxyconfiguration文件。 在configuration中,我看到使用nbproc 3
最小改进,负载在3个进程间绝对不平衡,因为一个仍然是最大的。
有关这个设置的任何事情,如虚拟机,跳出潜在的红旗? 我的haproxyconfiguration是不是罪魁祸首? 或者我的一般的Ubuntu设置? 另外值得一提的是,这是HAProxy的一个好的或坏的用例吗?
编辑
我有一些进一步的挖掘工作,但我目前的感觉是,这是VM特定的,可能在以太网驱动程序(e1000)? 我能够将HAProxy安装程序移动到物理机器(而不是VM),并且在单个内核上,它几乎没有使用我以前的testing用例注册任何CPU使用情况…
完整的configuration
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
我讨厌回答我自己的问题,但我认为我的结论是,我的testing是VM限制。 我不太清楚这是怎么回事,但是通过我的虚拟机使用HAProxy的CPU使用率要高得多,正如我上面提到的,使用相同的configurationtesting物理硬件,甚至删除nbproc
部分,我几乎看不到HAProxy中明显的CPU负载。
我的目标不是通过虚拟机来运行任何产品,而是更方便地进行testing(在等待实际硬件时),并了解这些东西的工作原理。
因为你没有显示你的configuration和正在使用的版本(见我的评论),这有点像“射中黑暗”。 无论如何,你可以尝试将每个HAProxy
进程固定到一个特定的核心,试图将所有的HAProxy
进程最大化,甚至连接它们之间的负载。
引用文档:
cpu-map <"all"|"odd"|"even"|process_num> <cpu-set>...
在Linux 2.6和更高版本上,可以将进程绑定到特定的CPU集。 这意味着该进程将永远不会运行在其他CPU上。
cpu-map
指令指定进程集的CPU集。 第一个参数是要绑定的进程号。 此过程必须具有1到32或64之间的数字,具体取决于机器的字大小,并且忽略nbproc上方的任何进程ID。 可以使用所有的进程一次性指定所有进程,只需使用odd
或偶数即可使用odd
,就像使用bind-process
指令一样。 第二个和即将出现的论点是CPU集。 每个CPU集合可以是0到31或63之间的唯一数字,也可以是由短划线(' – ')分隔的两个这样的数字的范围。 可以指定多个CPU号或范围,并允许进程绑定到所有这些进程。 显然,可以指定多个cpu-map
指令。 每个cpu-map
指令在重叠时都会replace之前的指令。
所以,如果您使用三个进程,请testing以下内容:
cpu-map 1 0 cpu-map 2 1 cpu-map 3 2