Selon quels critères accordez-vous les timeouts d'attente dans la configuration HA Proxy?

Lors de la configuration de HA Proxy, comment décidez-vous des valeurs à affecter aux timeouts d'attente? J'ai lu une demi-douzaine d'échantillons dans divers blogs, et tout le monde utilise des timeouts différents et personne ne discute pourquoi.

HAPROxy semble particulièrement préoccupé par le client, la connection et le server, dont HAPRoxy lance un avertissement si vous laissez complètement désactivé:

While not properly invalid, you will certainly encounter various problems with such a configuration. To fix this, please ensure that all following timeouts are set to a non-zero value: 'client', 'connect', 'server'. 

La documentation n'est pas utile à cet égard: elle suggère "légèrement au-dessus des multiples de 3 secondes", mais pas pourquoi vous choisissez un multiple de 1 vs 100 ou 42.

Le RPM que j'utilise (repository Linux d'Amazon) définit ces valeurs par défaut:

 timeout connect 10s timeout client 1m timeout server 1m 

Deux d'entre eux sont des multiples exacts de 3 secondes, violant le seul avis officiel que j'ai vu.

Si vous ne disposez pas de conseils précis, peut-être une question plus facile est: qu'est-ce que je m'attends à avoir un problème avec des timeouts très courts ou très longs?

Le TCP RTO (timeout de réception) commence à trois secondes. ( RFC 1122 ) Si un package transmis n'a pas reçu un accusé de réception returnné dans ce timeout, il est supposé qu'il soit perdu et retransmis. C'est presque certainement ce à quoi l'auteur fait reference. (Notez que le RTO est réglé de manière dynamic ou dynamic par différents algorithms , en dehors de la scope de cette question).

Gardez à l'esprit que cela s'applique uniquement aux connections entre votre server frontal et les clients (c'est-à-dire les users Web). Dans des scénarios normaux, les connections entre HAProxy et vos servers backend devraient être sur un réseau local et vous devriez utiliser des timeouts d'attente beaucoup plus courts, de sorte que les retards de dysfonctionnement soient abandonnés tôt.

En ce qui concerne vos users Web, certains d'entre eux peuvent avoir des connections de latence très élevées, comme le satellite, et peuvent avoir des retransmissions supérieures à la normale en raison de cela. Le RTT sur une connection où un satellite est utilisé peut dépasser 2000 ms même si tout va bien.

Avec tout cela à l'esprit, vous voudrez généralement des timeouts d' timeout connect très courts pour la timeout connect et ceux très longs pour le timeout client .

Pour le timeout server , cela dépend de votre application Web. Lorsque vous définissez le timeout d'attente, pensez à la complexité de l'application Web desservie et à la durée pendant laquelle il faudra dans le pire des cas pour traiter une requête complexe. En cas de doute, augmentez la valeur.

Avant-propos

J'ai réglé HAProxy pendant un certain time et j'ai effectué beaucoup de tests de performance. De 100 requêtes HTTP / s à 50 000 requêtes HTTP / s.

Le premier conseil consiste à activer la page de statistics sur HAProxy . Vous avez besoin de surveillance, pas d'exception. Vous aurez également besoin d'un réglage fin si vous avez l'intention de dépasser 10 000 requests / s.

Les timeouts d'attente sont une bête confuse parce qu'ils ont une large gamme de valeurs possibles, la plupart n'ayant aucune différence observable. Je n'ai pas encore vu quelque chose échouer en raison d'un nombre 5% inférieur ou 5% plus élevé. 10000 vs 11000 millisecondes, qui s'en soucie? Probablement pas votre système.

Configuration

Je ne peux pas en toute conscience donner quelques numéros comme «meilleurs timeouts pour tous».

Ce que je peux dire à la place, c'est les timeouts de travail les plus agressifs qui sont toujours acceptables pour l'équilibrage de charge HTTP (S). Si vous rencontrez less que cela, il est time de reconfigurer votre équilibreur de charge.

 timeout connect 5000 timeout check 5000 timeout client 30000 timeout server 30000 

timeout time:

Le timeout d'inactivité s'applique lorsque le client doit confirmer ou envoyer des données. En mode HTTP, ce timeout est particulièrement important à considérer lors de la première phase, lorsque le client envoie la request et pendant la réponse pendant qu'il lit datatables envoyées par le server.

Lire : C'est le timeout maximum pour recevoir les en- têtes de requêtes HTTP du client.

3G / 4G / 56k / satellite peut être lent parfois. Pourtant, ils devraient pouvoir envoyer des en-têtes HTTP en quelques secondes, pas 30.

Si quelqu'un a une connection si grave qu'il a besoin de plus de 30 ans pour requestr une page (plus de 10 * 30 pour requestr les 10 images embeddedes / CSS / JS), je crois qu'il est acceptable de le rejeter.

server de timeout d'attente

Le timeout d'inactivité s'applique lorsque le server doit confirmer ou envoyer des données. En mode HTTP, ce timeout est particulièrement important à prendre en count lors de la première phase de la réponse du server, lorsqu'il doit envoyer les en-têtes, car il représente directement le time de traitement du server pour la request. Pour savoir quelle valeur mettre, il est souvent préférable de commencer par ce qui serait considéré comme des time de réponse inacceptables, puis vérifier les journaux pour observer la dissortingbution du time de réponse et ajuster la valeur en conséquence.

Lire : C'est le timeout maximum pour recevoir les en- têtes de réponse HTTP du server (après avoir reçu la request complète du client). Fondamentalement, c'est le time de traitement de vos servers, avant qu'il commence à envoyer la réponse.

Si votre server est si lent qu'il faut plus de 30 ans pour commencer à donner une réponse, je crois qu'il est acceptable de le considérer comme mort.

Cas spécial : certains services RARE effectuant un traitement très important peuvent prendre une minute ou plus pour donner une réponse. Ce timeout d'attente devra peut-être augmenter considérablement pour cette utilisation spécifique. (Remarque: Il est probable que ce soit une mauvaise design, une communication de style asynchique ou n'utilisez pas HTTP du tout).

timeout connect

Définissez le timeout maximum pour attendre une tentative de connection à un server pour réussir.

Lire : le time maximum qu'un server doit accepter une connection TCP.

Les servers sont dans le même réseau local que HAProxy, donc il devrait être rapide. Donnez-lui au less 5 secondes parce que c'est la durée qu'il peut prendre lorsque quelque chose d'inattendu se produit (un package TCP perdu pour retransmettre, un server qui traverse un nouveau process pour prendre les nouvelles requests, augmenter le trafic).

Cas spécial : lorsque les servers se trouvent dans un réseau local différent ou sur un lien peu fiable. Ce timeout d'attente devra peut-être augmenter considérablement. (Note: Ceci est susceptible d'être un cas de mauvaise architecture.)

vérification de timeout

Définissez un timeout de contrôle supplémentaire, mais seulement après qu'une connection a déjà été établie.

Définissez un timeout de vérification supplémentaire, mais seulement après une connection déjà établie. Si l'option est définie, haproxy utilise le timeout d'attente de connection ("timeout connect", "inter") en tant que timeout de connection pour la vérification et le "timeout check". Le "min" est utilisé pour que les personnes qui fonctionnent avec très longtime "timeout connect" (p. Ex. Ceux qui ont besoin de cela en raison de la queue ou du tarpit) ne ralentissent pas leurs chèques. (Notez également qu'il n'y a pas de raison valable d'avoir de tels timeouts de connection prolongés, car "timeout queue" et "timeout tarpit" peuvent toujours être utilisés pour éviter cela).

Lire : Lors de l'exécution d'une vérification de la santé, le server a un timeout connect pour accepter la connection et le timeout check pour donner la réponse.

Tous les servers DOIVENT avoir une vérification de security HTTP (S) configurée. C'est le seul moyen pour l'équilibreur de charge de savoir si un server est disponible. Le Healthcheck est une page simple /isalive répondant toujours à OK .

Donner ce timeout d'attente au less 5 secondes, car il y a combien de time il peut prendre quand il arrive quelque chose d'inattendu (un package TCP perdu pour restreindre, un server qui bifurque un nouveau process pour prendre les nouvelles requests, augmenter le trafic).

War Story : Beaucoup de gens croient à tort que le server peut toujours répondre à cette page simple en 3 ms. Ils ont fixé un timeout d'attente agressif (<2000 ms) avec un basculement agressif (2 échecs vérifiés = server mort). J'ai vu des sites Web entiers baisser à cause de cela. Typiquement, il y a un léger pic de trafic, les servers de backend deviennent plus lents, les traitements de santé sont retardés … jusqu'à ce qu'ils aient tous un time d'attente, HAProxy pense que TOUS les servers sont morts à la fois et que tout le site tombe en panne.