Eu tenho uma hipótese: às vezes as conexões TCP chegam mais rapidamente do que o meu servidor pode accept()
. Eles ficam na fila até a fila exceder e, em seguida, há problemas.
Como posso confirmar que isso está acontecendo?
Posso monitorar o comprimento da fila de aceitação ou o número de estouros? Existe um balcão exposto em algum lugar?
linux
networking
monitoring
Phil Frost
fonte
fonte
netstat
.netstat
mostra apenas os comprimentos da fila de envio e recebimento, que não são iguais à fila de aceitação.man netstat | less +/Flags
netstat
, parece não aparecerFlags
para as conexões TCP. A partir de um pequeno teste, parece que as conexões são mostradas comoESTABLISHED
emnetstat
, mesmo que eu tente abrir conexões para um processo que ocorre,listen()
mas nuncaaccept()
.SYN_RECV
. Não há outra fila além disso. Suponho que o kernel possa ser instruído de alguma forma a registrar pacotes descartados por causa de muitas conexões semi-abertas, mas há mais de 10 anos desde que eu olhei para a rede com Linux, então não tenho idéia de como fazer isso. Em uma nota lateral: você não está esperando paraaccept()
fazer o trabalho, está esperandoACK
s chegarem dos hosts de conexão para concluir as conexões.Respostas:
Para verificar se sua fila está transbordando, use netstat ou nstat
Referência: https://perfchron.com/2015/12/26/investigating-linux-network-issues-with-netstat-and-nstat/
Para monitorar seus tamanhos de fila, use o comando ss e procure os soquetes SYN-RECV.
Referência: https://blog.cloudflare.com/syn-packet-handling-in-the-wild/
fonte
O Sysdig fornecerá algumas dessas informações no final de cada
accept
syscall, comoqueuelen
argumento. Também mostra o comprimento da fila comoqueuemax
.Tanto quanto sei, ele não fornece um mecanismo para saber exatamente quando ou quantas vezes a fila transbordou. E seria complicado integrar isso ao monitoramento periódico
collectd
ou similar.fonte
O que você está procurando é a entrada na saída do comando sysctl -a como tal :::
net.ipv4.tcp_max_sync_backlog = 4096
No exemplo de exemplo acima, a lista de pendências de conexões de estado SYN é no máximo 4096. Você pode aumentar isso com base na quantidade de RAM existente no servidor. Considero que o backlog de 32K é um bom começo para o ajuste de servidores da Web com muita carga.
Verifique também se o seguinte NÃO está definido como Um (1):
net.ipv4.tcp_abort_on_overflow = 0
Caso contrário, ele descartará definitivamente os pacotes se houver um estouro de lista de pendências.
Você pode verificar facilmente via
"sysctl -a | lista pendente do egrep"
"sysctl -a | egrep overflow"
Além disso, você pode encontrar o rótulo "descartado" sob o
"ifconfig -a"
saída do comando. Isso mostra quantos pacotes foram descartados para cada interface, juntamente com outros dados e erros, etc.
Para registrar pacotes descartados, há um artigo de paywall no RHEL 7:
https://access.redhat.com/solutions/1191593
Para mais pesquisas, você pode ler:
http://veithen.io/2014/01/01/how-tcp-backlog-works-in-linux.html
Indica aqui de acordo com o TCP / IP ilustrado do livro de Steven:
"O limite da fila se aplica à soma do […] número de entradas na fila de conexão incompleta […] e […] do número de entradas na fila de conexão concluída […]."
Daí também afirma que:
"A fila de conexão concluída quase sempre está vazia porque, quando uma entrada é colocada nessa fila, a chamada do servidor para aceitar retorna e o servidor retira a conexão concluída da fila."
A fila de aceitação pode parecer completamente vazia e você precisará ajustar seu servidor Web Apache (possivelmente neste caso) para aceitar mais rapidamente as conexões colocadas na fila "total agregado".
fonte