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?
netstatmostra 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 aparecer Flagspara as conexões TCP. A partir de um pequeno teste, parece que as conexões são mostradas como ESTABLISHEDem netstat, mesmo que eu tente abrir conexões para um processo que ocorre, listen()mas nunca accept().
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 para accept()fazer o trabalho, está esperando ACKs chegarem dos hosts de conexão para concluir as conexões.
netstat.