Sou novo no HAProxy, mas consegui fazer com que as coisas funcionassem, embora eu não esteja obtendo o rendimento esperado.
Minha configuração inclui um cluster de armazenamento de 5 nós (executando o Riak CS, um armazenamento no estilo S3) e outra VM executando o HAProxy com roundrobin
. Todas as VMs estão usando o VirtualBox, cada uma em uma máquina dedicada. A VM HAProxy está no Windows 7, enquanto os outros são o Windows 10. Tudo isso está na mesma rede gigabit e eu testei os dois 1.4 e 1.5 para o HAProxy.
Eu tenho um script (python + boto) que faz o download sem salvar no disco, arquivos de 100 MB repetidas vezes, que acredito que devem se resumir a uma solicitação get simples, e eu executo esse script localmente 3 vezes para adicionar carga .
Se eu apontar todos eles para o ip do HAProxy, obtenho um download de aproximadamente 4-500 Mbps, enquanto posso obter até 900+ Mbps se eu NÃO usar o HAProxy e apontar cada um para um ip separado.
Ao fazer este teste, parece que o HAProxy está maximizando um único núcleo e se tornando um gargalo. Para um único script em execução, que eu acredito ser uma conexão única, ele está comendo 20-40% de um núcleo de CPU no HAProxy, o que parece suspeito?
Parece que o HAProxy pode processar alta taxa de transferência , por isso estou tentando depurar onde eu poderia ter configurado as coisas incorretamente, no Ubuntu ou no arquivo de configuração HAProxy. Eu vejo uma melhoria mínima usando nbproc 3
na configuração, a carga definitivamente não está equilibrada nos três processos, pois um ainda está no máximo.
Alguma coisa sobre essa configuração, como as VMs, aparece como possível sinal vermelho? O meu haproxy config soa culpado? Ou minhas configurações gerais do Ubuntu? Também vale a pena perguntar, este é um caso de uso bom ou ruim para o HAProxy?
EDITAR
Eu tenho mais algumas pesquisas para fazer, mas a minha sensação atual é que isso é específico da VM, potencialmente no driver ethernet (e1000)? Eu era capaz de mover a configuração do HAProxy para uma máquina física (não uma VM) e em um único núcleo, ele mal registrava qualquer uso de cpu com meu caso de teste anterior ...
configuração completa
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