O tcp-backlog é do tamanho da "fila de conexão completa" (handshake de três vias completo, o que é descrito aqui) ou "fila de conexão incompleta"?
tcp-backlog
é o tamanho da fila de conexão completa . Na verdade, o Redis passa essa configuração como o segundo parâmetro do listen(int s, int backlog)
ligar. @GuangshengZuo já tinha uma boa resposta para essa pergunta. Então vou focar no outro.
Se significa "fila de conexão completa", por que devo aumentar tcp_max_syn_backlog que limita o tamanho de uma fila de conexão incompleta?
Citação do documento que você mencionou:
A implementação usa duas filas, uma fila SYN (ou fila de conexão incompleta) e uma fila de aceitação (ou fila de conexão completa). As conexões no estado SYN RECEIVED são adicionadas à fila SYN e depois movidas para a fila de aceitação quando seu estado muda para ESTABLISHED, ou seja, quando o pacote ACK no handshake de 3 vias é recebido. Como o nome indica, a chamada de aceitação é implementada simplesmente para consumir conexões da fila de aceitação. Nesse caso, o argumento backlog do syscall de escuta determina o tamanho da fila de aceitação.
Podemos ver que itens na
complete connection queue
são movidos da incomplete connection queue
. Se você tiver um grande
somaxconn
com um pequeno tcp_max_syn_backlog
, então você pode NÃO ter itens suficientes para serem movidos para a complete connection queue
, e a complete connection queue
pode nunca estar cheio. Muitas solicitações já podem ter sido descartadas da primeira fila antes de terem a chance de serem movidas para a segunda. Portanto, aumente apenas o valor de
somaxconn
pode NÃO funcionar. Você tem que levantar os dois.