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