web-dev-qa-db-fra.com

L'augmentation de net.core.somaxconn fera-t-elle une différence?

Je suis entré dans un argument sur le paramètre net.core.somaxconn: on m'a dit que cela ne ferait aucune différence si nous modifiions le 128 par défaut.

Je pensais que cela pourrait être une preuve suffisante:

"Si l'argument du backlog est supérieur à la valeur dans/proc/sys/net/core/somaxconn, alors il est tronqué silencieusement à cette valeur" http://linux.die.net/man/2/listen

mais ce n'est pas.

Est-ce que quelqu'un connaît une méthode pour en témoigner avec deux machines, assis sur un réseau Gbit? Le meilleur serait contre MySQL, LVS, Apache2 (2.2), memcached.

31
petermolnar

La définition de net.core.somaxconn Sur des valeurs plus élevées n'est nécessaire que sur les serveurs à charge élevée où le nouveau taux de connexion est si élevé/explosif que d'avoir 128 (50% de plus dans les BSD: 128 backlog + 64 half-open ) les connexions non encore acceptées sont considérées comme normales. Ou lorsque vous devez déléguer la définition de "normal" à une application elle-même.

Certains administrateurs utilisent un net.core.somaxconn Élevé pour masquer les problèmes avec leurs services, donc du point de vue de l'utilisateur, cela ressemblera à un pic de latence au lieu d'une connexion interrompue/timeout (contrôlé par net.ipv4.tcp_abort_on_overflow Sous Linux) .

listen(2) manuel dit - net.core.somaxconn agit uniquement sur la limite supérieure pour une application qui est libre de choisir quelque chose de plus petit (généralement défini dans la configuration de l'application). Bien que certaines applications utilisent simplement listen(fd, -1), ce qui signifie que le backlog est à la valeur maximale autorisée par le système.

La cause réelle est soit un faible taux de traitement (par exemple, un serveur de blocage à thread unique) ou un nombre insuffisant de threads/processus de travail (par exemple, un logiciel de blocage multi-processus/thread comme Apache/Tomcat)

PS. Parfois, il est préférable d'échouer rapidement et de laisser l'équilibreur de charge faire son travail (réessayer) plutôt que de faire attendre l'utilisateur - à cette fin, nous définissons net.core.somaxconn N'importe quelle valeur, et limitons le retard d'application par exemple. 10 Et réglez net.ipv4.tcp_abort_on_overflow Sur 1.

PPS. Les anciennes versions du noyau Linux ont un bug désagréable de tronquer la valeur de somaxcon à ses 16 bits inférieurs (c'est-à-dire la valeur de cast à uint16_t), Donc augmenter cette valeur à plus de 65535 Peut même être dangereux. Pour plus d'informations, voir: http://patchwork.ozlabs.org/patch/255460/

Si vous souhaitez entrer dans plus de détails sur tous les composants internes du backlog sous Linux, n'hésitez pas à lire: Comment TCP backlog fonctionne sous Linux .

48
SaveTheRbtz