Temos um servidor dedicado que funciona bem e aceita conexões de entrada. Ele também recebe e envia dados normalmente.
Funciona muito bem por algumas horas, mas depois disso todas as conexões aceitas expiram automaticamente logo após o soquete ser aceito.
Quanto mais soquetes ele aceitar, mais rápido ele entrará em um estado em que todas as novas conexões terão tempo limite esgotado.
O problema não é do cliente e nem é realmente pelo tempo que definimos em timeout, porque ele só acontece depois da aceitação na função read().
Quando reiniciamos o servidor, tudo começa a funcionar bem novamente.
Acredito que o Linux esteja causando esse problema. Não conheço bem o Linux, sei que há configurações no Linux que estão limitando meu processo.
Alguém pode sugerir material para leitura sobre configurações Linux para sockets TCP?
obrigado
Você poderia fornecer mais detalhes? Que tipo de serviço aceita conexões? Qual distro é usada (por favor, forneça a saída de uname -a )? Você tem alguma informação nos logs de serviço?
Você pode verificar os logs do sistema com os seguintes comandos systemctl status <service> para ver o status do serviço e algumas linhas de logs.
E journalctl -x --lines 100 -u <serviço> para ver as últimas 100 linhas de logs de serviço.
Também o comando dmesg ou arquivos como /var/log/syslog e /var/log/kern.log no caso de sistemas do tipo debian podem conter informações adicionais. Ou /var/log/messages no caso de sistemas do tipo rhel.
O problema também pode estar relacionado ao número de arquivos abertos ou à configuração do serviço (como limite de conexões na configuração do banco de dados ou número máximo de threads no tomcat). Normalmente, os sistemas modernos não precisam de modificação das configurações padrão. Mas alguns sistemas antigos podem falhar ao abrir novas conexões se o limite for atingido. https://linux.die.net/man/5/limits.conf
Configurações do kernel relacionadas à rede: https://docs.kernel.org/networking/ip-sysctl.html
Os parâmetros podem ser configurados para todas as interfaces ou por interface usando o caminho apropriado. As configurações podem ser alteradas on-the-fly de duas maneiras (por exemplo, desabilitando o ipv6):
Comandos úteis que também podem ajudar: lsof para listar arquivos abertos (a conexão também é contada como arquivo) e ss ou netstat .
Por exemplo, lsof -i:8090 listará todas as conexões na porta 8090. E lsof -p 2345 listará todos os arquivos e conexões abertas pelo processo com PID 2345.
Observe que antes de fazer qualquer alteração nos parâmetros do kernel é melhor saber a causa real.
depois de meses lutando com isso, descobri a raiz do problema.
Fechei o fd 0, que é o stdin, e novos sockets de entrada escolheriam o fd 0 e, no meu código, eu esperava que qualquer fd válido fosse maior que 0, caso contrário significaria que já estava fechado ou deveria ser despejado das conexões válidas (e eu fecho esse fd para ter certeza :D antes de despejar).
e isso fazia com que o fd 0 sempre fosse fechado após ser selecionado.
a culpa foi minha.