Wird die Erhöhung von net.core.somaxconn einen Unterschied bewirken?

27

Beim Parameter net.core.somaxconn bin ich auf ein Argument gestoßen: Mir wurde gesagt, dass es keinen Unterschied macht, wenn wir den Standardwert 128 ändern.

Ich habe geglaubt, das könnte ein ausreichender Beweis sein:

"Wenn das Backlog-Argument größer ist als der Wert in / proc / sys / net / core / somaxconn, wird es stillschweigend auf diesen Wert abgeschnitten" http://linux.die.net/man/2/listen

aber es ist nicht.

Kennt jemand eine Methode, um dies mit zwei Computern zu bezeugen, die in einem Gbit-Netzwerk sitzen? Am besten wäre gegen MySQL, LVS, Apache2 (2.2), memcached.

petermolnar
quelle

Antworten:

43

Die Einstellung net.core.somaxconnauf höhere Werte ist nur auf Servern mit hoher Auslastung erforderlich, bei denen die neue Verbindungsrate so hoch / hoch ist, dass 128 (50% mehr in BSDs: 128 backlog+ 64 half-open) noch nicht akzeptierte Verbindungen als normal angesehen werden. Oder wenn Sie die Definition von "normal" an eine Anwendung selbst delegieren müssen.

Einige Administratoren verwenden High net.core.somaxconn, um Probleme mit ihren Diensten zu verbergen. Aus Sicht des Benutzers sieht dies also wie eine Latenzspitze aus und nicht wie eine Unterbrechung der Verbindung / ein Timeout (gesteuert von net.ipv4.tcp_abort_on_overflowLinux).

listen(2)Handbuch sagt - net.core.somaxconnHandelt nur an der oberen Grenze für eine Anwendung, die frei ist, etwas Kleineres zu wählen (normalerweise in der Konfiguration der App festgelegt). Einige Apps verwenden jedoch nur, listen(fd, -1)was bedeutet, dass der Rückstand auf den vom System zulässigen Höchstwert gesetzt wird.

Die eigentliche Ursache ist entweder eine niedrige Verarbeitungsrate (z. B. ein einzelner Thread-Blocking-Server) oder eine unzureichende Anzahl von Worker-Threads / -Prozessen (z. B. Multi-Process- / Thread-Blocking-Software wie apache/ tomcat).

PS. Manchmal ist es vorzuziehen, schnell zu scheitern und den Load-Balancer die Aufgabe (Wiederholung) ausführen zu lassen, als den Benutzer warten zu lassen. Zu diesem Zweck setzen wir einen net.core.somaxconnbeliebigen Wert und begrenzen den Anwendungsrückstand auf z. B. 10und setzen ihn net.ipv4.tcp_abort_on_overflowauf 1.

PPS. Alte Versionen des Linux-Kernels haben einen üblen Fehler, den somaxconWert auf 16 niedrigere Bits zu kürzen (dh den Wert auf "0" zu setzen uint16_t), sodass die Erhöhung dieses Werts auf mehr als 65535gefährlich sein kann. Weitere Informationen finden Sie unter: http://patchwork.ozlabs.org/patch/255460/

Weitere Informationen zu allen Backlog-Interna in Linux finden Sie unter: Funktionsweise von TCP-Backlog in Linux .

SaveTheRbtz
quelle
1
Ebenfalls erwähnenswert: Seit Linux 5.4 wurde es auf 4096 erhöht .
Hi-Angel,