Estou vendo um problema semelhante no Ubuntu 18.04 LTS (kernel 4.15.0-38). Mas isso não acontece na minha caixa Debian 9.5 (kernel 4.9.110-3). Parece ser um bug em novos kernels?
Uma maneira simples de reproduzir o problema é com o netcat. cliente e servidor podem ser locais ou em caixas diferentes.
- Execute o servidor netcat em um terminal: nc -u -l 1234
- Execute o cliente netcat em outro terminal: nc -u 127.0.0.1 1234
- digite uma mensagem curta "a" no cliente e pressione Enter.
- em um terceiro terminal, verifique os comprimentos de recv-q: netstat -plan | grep 1234
No Ubuntu, o socket de recepção do udp terá um recv-q não vazio (768 bytes para uma mensagem de 2 bytes) mesmo que o netcat tenha lido a mensagem do socket e a tenha impresso. Eu tenho que o recv-q continua crescendo até cerca de 52k, então ele volta a zero.
No Debian, o recv-q é sempre zero, desde que o soquete do udp seja drenado mais rápido que os pacotes recebidos.
Também encontrei este relatório de bug do kernel: cálculo incorreto do UDP rx_queue em / proc / net / udp