Não está claro por que você tem certeza de que o problema não é causado por um de seus endpoints (cliente ou servidor), que tipo de tráfego você está gerando? Funciona com dispositivo diferente?
Eu tenho uma caixa Linux atuando como um roteador sem iptables ou outro firewall e nenhum aplicativo de rede rodando nele, apenas roteador puro. Eu coloquei em um ambiente de teste que gera muitas conexões TCP, cada uma com fonte única e IP de destino, e essas conexões passam por esse roteador. Eu estou observando que o número de conexões criadas com sucesso sobe para aproximadamente 500 e então nenhuma outra conexão pode ser criada por vários minutos, então outras 100 conexões podem ser criadas e há outra pausa, e assim por diante. Se 10 conexões para cada par origem-destino forem criadas, então os números máximos vão aproximadamente 10 vezes, então o problema provavelmente está com muitas conexões de diferentes IPs.
Como o tráfego é simplesmente roteado, não tem a ver com o número de descritores de arquivos, o rastreamento de conexões do iptables e outras coisas frequentemente propostas para verificar casos semelhantes. A caixa tem bastante RAM livre e CPU, ambos os NICs são gigabit. O kernel é 2.6.32.
Eu já tentei aumentar o net.core. * mem_max, net.core.netdev_max_backlog e txqueuelen em ambos os NICs, sem nenhum efeito. O que mais devo verificar? Existe algum limite de taxa no próprio kernel?
Não está claro por que você tem certeza de que o problema não é causado por um de seus endpoints (cliente ou servidor), que tipo de tráfego você está gerando? Funciona com dispositivo diferente?
Eu encontrei a resposta e foi muito engraçado - estouro da tabela ARP. O tráfego no ambiente de teste foi gerado a partir de muitos IPs que residiam em redes diretamente conectadas, então o sistema teve que usar o ARP primeiro para descobrir MACs, e o limite rígido padrão da tabela ARP no Linux é apenas 1024 entradas, o que dá número de conexões entre redes conectadas a 2 interfaces diferentes próximas a 512. Quando eu aumentei net.ipv4.neigh.gc_thresh1 e também .gc_thresh2 e .gc_thresh3, o problema foi resolvido.
Tags networking ip linux