encontramos a causa raiz disso. Tivemos um acceptCount de 25 no nosso tomcat server.xml.
acceptCount é documentado assim:
acceptCount
The maximum queue length for incoming connection requests when all possible request processing threads are in use. Any requests received when the queue is full will be refused. The default value is 100.
Mas esta não é a história completa sobre o acceptCount. Short: acceptCount é o parâmetro do backlog ao abrir o socket. Portanto, esse valor é importante para o backlog de escuta, mesmo que nem todos os threads estejam ocupados. É importante que a solicitação seja mais rápida, em seguida, o tomcat pode aceitá-la e delegá-la a threads em espera. O acceptCount padrão é 100. Esse ainda é um valor pequeno para alimentar um pico repentino nas solicitações.
Verificamos a mesma coisa com apache e nginx e tivemos a mesma perda estranha de pacotes, mas com valores de concorrência mais altos. O valor correspondente no apache é ListenBacklog, cujo padrão é 511.
MAS, com o debian (e outro sistema operacional baseado em linux), o valor máximo padrão para o parâmetro de backlog é 128.
$ sysctl -a | grep somaxc
net.core.somaxconn = 128
Assim, o que você digitar em acceptCount ou ListenBacklog não será mais de 128 até que você altere net.core.somaxconn
Para um servidor web muito ocupado, 128 não é suficiente. Você deve alterá-lo para algo como 500, 1000 ou 3000, dependendo de suas necessidades.
Depois de definir acceptCount como 1000 e net.core.somaxconn como 1000, não mais tivemos esses pacotes descartados. (Agora temos um gargalo em outro lugar, mas isso é outra história ..)