Hat tcp-backlog die Größe von "complete connection queue" (Dreiwege-Handshake komplett, was hier beschrieben wird) oder "incomplete connection queue"?
tcp-backlog
ist die Größe der vollständigen Verbindungswarteschlange . Tatsächlich übergibt Redis diese Konfiguration als zweiten Parameter von listen(int s, int backlog)
anrufen.
@GuangshengZuo hatte bereits eine gute Antwort auf diese Frage. Also konzentriere ich mich auf den anderen.
Wenn es "vollständige Verbindungswarteschlange" bedeutet, warum sollte ich dann tcp_max_syn_backlog erhöhen, was die Größe einer unvollständigen Verbindungswarteschlange begrenzt?
Zitat aus dem von Ihnen erwähnten Dokument:
Die Implementierung verwendet zwei Warteschlangen, eine SYN-Warteschlange (oder unvollständige Verbindungswarteschlange) und eine Annahmewarteschlange (oder vollständige Verbindungswarteschlange). Verbindungen im Zustand SYN RECEIVED werden der SYN-Warteschlange hinzugefügt und später in die Annahmewarteschlange verschoben, wenn sich ihr Zustand in ESTABLISHED ändert, d. h. wenn das ACK-Paket im 3-Wege-Handshake empfangen wird. Wie der Name schon sagt, wird der Accept-Aufruf dann einfach implementiert, um Verbindungen aus der Accept-Queue zu verbrauchen. In diesem Fall bestimmt das backlog-Argument des Listen-Systemaufrufs die Größe der Accept-Queue.
Wir können diese Elemente in complete connection queue
sehen werden aus der incomplete connection queue
verschoben .
Wenn Sie eine große somaxconn
haben mit einem kleinen tcp_max_syn_backlog
, dann haben Sie möglicherweise NICHT genügend Elemente, um sie in die complete connection queue
zu verschieben , und die complete connection queue
vielleicht nie voll. Viele Anfragen wurden möglicherweise bereits aus der ersten Warteschlange gelöscht, bevor sie in die zweite verschoben werden können.
Erhöhen Sie also nur den Wert von somaxconn
könnte NICHT funktionieren. Du musst beide erhöhen.