2 votes

Performances du débit d'Haproxy dans une VM

Je suis novice en matière de HAProxy, mais j'ai réussi à faire fonctionner les choses, même si je n'obtiens pas le débit que j'attends.

Ma configuration comprend un cluster de stockage à 5 nœuds (exécutant Riak CS, un stockage de type S3) et une autre VM exécutant HAProxy avec roundrobin . Toutes les VMs utilisent VirtualBox, chacune sur une machine dédiée. La VM HAProxy est sous Windows 7, tandis que les autres sont sous Windows 10. Tout cela se trouve sur le même réseau gigabit et j'ai testé les versions 1.4 et 1.5 de HAProxy.

J'ai un script (Python + boto) qui télécharge sans sauvegarder sur le disque, des fichiers de 100 Mo encore et encore, qui, je crois, devraient chacun se résumer à une simple requête get, et j'exécute ce script localement 3 fois pour une charge supplémentaire.

Si je les fais pointer tous vers l'ip de HAProxy, j'obtiens environ 4-500 Mbps de téléchargement alors que je peux obtenir jusqu'à 900+ Mbps si je n'utilise pas HAProxy et que je fais pointer chacun vers une ip séparée.

Lors de ce test, il semble que le HAProxy soit en train d'utiliser au maximum un seul cœur et qu'il devienne un goulot d'étranglement. Pour un seul script en cours d'exécution, qui, je crois, est une connexion unique, il consomme 20-40% du cpu d'un cœur sur HAProxy, ce qui semble suspect ?

On dirait que HAProxy peut gérer un débit élevé J'essaie donc de déterminer où j'ai pu mal configurer les choses, soit dans Ubuntu, soit dans le fichier de configuration de HAProxy. Je constate une amélioration minime en utilisant nbproc 3 dans la configuration, la charge n'est certainement pas équilibrée entre les 3 processus, car l'un d'entre eux est toujours au maximum.

Est-ce que quelque chose dans cette configuration, comme les VM, saute aux yeux comme un drapeau rouge potentiel ? Est-ce que ma configuration haproxy semble coupable ? Ou mes paramètres généraux d'Ubuntu ? Il faut aussi se demander si ce cas d'utilisation de HAProxy est bon ou mauvais.

EDIT

J'ai encore quelques recherches à faire, mais mon sentiment actuel est que c'est spécifique à la VM, potentiellement dans le pilote ethernet (e1000) ? J'ai pu déplacer la configuration de HAProxy sur une machine physique (pas une VM) et sur un seul cœur, il a à peine enregistré une utilisation du processeur avec mon cas de test précédent...

configuration complète

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

1voto

g3cko Points 131

Je déteste répondre à ma propre question, mais je pense que ma conclusion est que mon test est VM limité. Je ne peux pas dire exactement comment, mais l'utilisation du processeur de HAProxy à travers ma VM était beaucoup, beaucoup plus élevée, et comme je l'ai noté plus haut, le test sur le matériel physique avec la même configuration, même en supprimant l'option nbproc je vois une charge CPU à peine perceptible dans HAProxy.

Mon but n'était pas d'exécuter quoi que ce soit en production par le biais des VM, mais elles sont beaucoup plus pratiques pour les tests (en attendant le matériel réel) et pour apprendre comment ces choses fonctionnent.

0voto

gxx Points 5443

Comme vous n'avez pas montré votre configuration ni la version utilisée (voir mon commentaire), c'est un peu comme "tirer dans le noir". Quoi qu'il en soit, vous pouvez essayer d'épingler chaque HAProxy à un noyau spécifique, pour essayer de les maximiser tous, et de répartir la charge entre eux.

Je cite les documents :

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

Sous Linux 2.6 et plus, il est possible de lier un processus à un ensemble spécifique de CPU spécifique. Cela signifie que le processus ne s'exécutera jamais sur d'autres CPU. Le site cpu-map spécifie les ensembles de CPU pour les ensembles de processus. Le premier argument est le numéro du processus à lier. Ce processus doit avoir un numéro compris entre 1 et 32 ou 64, selon la taille des mots de la machine, et tout ID de processus supérieur à nbproc sont ignorés. Il est possible de spécifier tous les processus en même temps en utilisant all , seulement les nombres impairs en utilisant odd ou des nombres pairs en utilisant even comme dans le cas de la bind-process directive. Les deuxième et quatrième arguments sont des ensembles de CPU. Chaque ensemble de CPU est soit un nombre unique entre 0 et 31 ou 63, soit une plage de deux nombres délimités par un tiret ('-'). deux de ces nombres délimités par un tiret ('-'). Plusieurs numéros ou plages de CPU peuvent être spécifiés, et les processus seront autorisés à se lier à chacun d'entre eux. Évidemment, de multiples cpu-map peuvent être spécifiées. Chaque cpu-map remplacera les précédentes lorsqu'elles se chevaucheront.

Donc, si vous utilisez trois processus, testez ce qui suit :

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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X