Má tcp-backlog velikost "fronty kompletního připojení" (třícestné navázání spojení dokončeno, jak je popsáno zde) nebo "fronty neúplného připojení"?
tcp-backlog
je velikost úplné fronty připojení . Redis ve skutečnosti předává tuto konfiguraci jako druhý parametr listen(int s, int backlog)
zavolejte.
@GuangshengZuo již na tuto otázku měl dobrou odpověď. Takže se zaměřím na ten druhý.
Pokud to znamená „fronta kompletního připojení“, proč bych měl zvyšovat tcp_max_syn_backlog, který omezuje velikost fronty neúplných připojení?
Citace z dokumentu, který jste zmínil:
Implementace používá dvě fronty, frontu SYN (nebo frontu neúplného připojení) a frontu přijetí (nebo frontu kompletního připojení). Spojení ve stavu SYN RECEIVED jsou přidána do fronty SYN a později přesunuta do fronty pro přijetí, když se jejich stav změní na ESTABLISHED, tj. když je přijat ACK paket v 3-cestném handshake. Jak název napovídá, přijímací volání je pak implementováno jednoduše tak, aby spotřebovalo spojení z přijímací fronty. V tomto případě argument nevyřízených záležitostí systému listen syscall určuje velikost fronty přijetí.
Vidíme, že položky ve complete connection queue
jsou přesunuty z incomplete connection queue
.
Pokud máte velký somaxconn
s malým tcp_max_syn_backlog
, pak možná NEMÁTE dostatek položek na přesunutí do complete connection queue
a complete connection queue
nemusí být nikdy plné. Mnoho požadavků již mohlo být vyřazeno z první fronty dříve, než měly možnost být přesunuty do druhé.
Takže pouze zvyšte hodnotu somaxconn
nemusí fungovat. Musíte je vychovat oba.