Er tcp-backlog størrelsen på "komplet forbindelseskø" (tre-vejs håndtryk komplet, hvad der er beskrevet her) eller "ufuldstændig forbindelseskø"?
tcp-backlog
er størrelsen på komplet forbindelseskø . Faktisk sender Redis denne konfiguration som den anden parameter i listen(int s, int backlog)
ring.
@GuangshengZuo havde allerede et godt svar på dette spørgsmål. Så jeg vil fokusere på den anden.
Hvis det betyder "fuldstændig forbindelseskø", hvorfor skulle jeg så hæve tcp_max_syn_backlog, som begrænser størrelsen af en ufuldstændig forbindelseskø?
Citat fra den læge, du nævnte:
Implementeringen bruger to køer, en SYN-kø (eller ufuldstændig forbindelseskø) og en acceptkø (eller komplet forbindelseskø). Forbindelser i tilstanden SYN MODTAGET føjes til SYN-køen og flyttes senere til acceptkøen, når deres tilstand ændres til ETABLERET, dvs. når ACK-pakken i 3-vejs-håndtrykket modtages. Som navnet antyder, implementeres acceptopkaldet blot for at forbruge forbindelser fra acceptkøen. I dette tilfælde bestemmer backlog-argumentet for listen syscall størrelsen på acceptkøen.
Vi kan se, at elementer i complete connection queue
flyttes fra incomplete connection queue
.
Hvis du har en stor somaxconn
med en lille tcp_max_syn_backlog
, så har du muligvis IKKE nok elementer til at blive flyttet til den complete connection queue
, og den complete connection queue
bliver måske aldrig fuld. Mange anmodninger er muligvis allerede blevet slettet fra den første kø, før de har mulighed for at blive flyttet til den anden.
Så hæv kun værdien af somaxconn
virker muligvis IKKE. Du skal hæve dem begge.