Desempenho de taxa de transferência de haproxy em uma VM

2

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 
    
por g3cko 13.09.2016 / 20:06

2 respostas

1

Eu odeio responder a minha própria pergunta, mas acho que minha conclusão é que meu teste é limitado a VM. Eu não posso dizer exatamente como, mas o uso da CPU do HAProxy através da minha vm foi muito, muito maior, e como eu disse acima, testando em hardware físico com a mesma configuração, mesmo removendo a parte nbproc , eu vejo Uma carga de CPU quase imperceptível no HAProxy.

Não era meu objetivo executar qualquer produção através de VMs, mas elas são muito mais convenientes para testes (enquanto aguardo hardware real) e para aprender como essas coisas funcionam.

    
por 14.09.2016 / 20:29
0

Como você não mostrou sua configuração nem a versão em uso (veja meu comentário), isso é um pouco como "atirar no escuro". De qualquer forma, você poderia tentar fixar cada HAProxy do processo em um núcleo específico, para tentar maximizá-los, e para equilibrar a carga entre eles.

Citando os documentos:

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

On Linux 2.6 and above, it is possible to bind a process to a specific CPU set. This means that the process will never run on other CPUs. The cpu-map directive specifies CPU sets for process sets. The first argument is the process number to bind. This process must have a number between 1 and 32 or 64, depending on the machine's word size, and any process IDs above nbproc are ignored. It is possible to specify all processes at once using all, only odd numbers using odd or even numbers using even, just like with the bind-process directive. The second and forthcoming arguments are CPU sets. Each CPU set is either a unique number between 0 and 31 or 63 or a range with two such numbers delimited by a dash ('-'). Multiple CPU numbers or ranges may be specified, and the processes will be allowed to bind to all of them. Obviously, multiple cpu-map directives may be specified. Each cpu-map directive will replace the previous ones when they overlap.

Se você estiver usando três processos, teste o seguinte:

cpu-map 1 0
cpu-map 2 1
cpu-map 3 2
    
por 14.09.2016 / 00:34