Como posso solucionar problemas de desempenho de encaminhamento do roteador / firewall Linux com o Intel 10 Gbe?

4

Temos um firewall Linux com dois adaptadores 10Gbe voltados para fora (Intel 82599EB) e um adaptador 10Gbe voltado para dentro (Intel 82598EB).

O problema que estou enfrentando é que o firewall só encaminhará o tráfego de entrada a uma taxa muito baixa: aproximadamente < 2 Mbps. No entanto, uma conexão direta do firewall para uma máquina "interna" recebe ~ 6 Gbps, enquanto uma conexão direta com o firewall de uma máquina externa recebe ~ 1 Gbps. Há algum ajuste a ser feito claramente, mas eles demonstram velocidades de Gbps.

Atualizamos recentemente o driver Intel ixgbe da versão 2.1.4 para a 3.7.14 devido a preocupações de estabilidade com o driver 2.1.4 (travamentos) e isso parece ocorrer quando os problemas de taxa de transferência começaram.

Eu também tentei a versão 3.7.17, mas isso deu um desempenho similar ao 3.7.14. Ao reverter para o driver 2.1.4 (recompilado para um kernel atualizado, com IXGBE_NO_LRO e IXGBE_NO_NAPI), consegui obter um throughput de ~ Gbps (bem ~ 900 Mbps com iperf sobre TCP com 3 threads).

Isso resolve o problema imediato, mas eu preferiria poder usar a versão atual do driver, pois gostaria de acompanhar as correções de bugs, etc., então, minha pergunta é

  • Como posso solucionar problemas de desempenho de encaminhamento do roteador / firewall Linux?

Especificamente, como posso descobrir onde o driver do kernel / iptables / network, etc. está gastando seu tempo ao encaminhar pacotes?

Qualquer conselho relevante seria apreciado.

    
por david-ocallaghan 04.01.2012 / 15:07

4 respostas

4

Realmente estranho que você obtenha apenas 1 Gbps de desempenho de roteamento (mesmo a filtragem difícil geralmente significa 2 cópias no espaço do kernel para o mesmo dispositivo, provavelmente 4x para roteamento) - houve um post LKML um ano atrás que você pode obter 120Gbps do desempenho de roteamento na série 2.6.3X com ixgbe de dispositivos. Eu uso principalmente NICs Intel 10GbE e geralmente ganho 1000MByte / s + com iperf em uma infraestrutura comutada.

Primeiro, você precisa verificar como o sistema funciona para TCP simples com algo como iperf entre seus pontos de extremidade. Isso deve te dar uma linha de base. Lembre-se que muitas coisas entram em jogo se você precisar de velocidade de fio de 10Gbps. Em plataformas pré-Nehalem, isso é impossível de alcançar. Além disso, o carregamento do sistema deve corresponder ao layout NUMA e as NICs devem ser anexadas ao mesmo complexo PCI (isso é importante se você estiver preso em < 8 Gbps). A distribuição de código-fonte do ixgbe possui um script de fixação de IRQ (que também desativa coisas como economia de energia e o irqbalancer que apenas bagunçará os caches e não está ciente de topologia) que deve organizar as filas RX-TX uniformemente em todos os núcleos eles daqui a pouco).

Em relação à sua pergunta sobre timings, você precisa de um kernel compilado com suporte de criação de perfil e um profiler de nível de sistema como oprofile .

Obtenha seu endpoint para o desempenho do endpoint resolvido antes de ativar a filtragem ou o roteamento de pacotes e postá-lo.

    
por 04.01.2012 / 18:52
1

Vários meses atrás eu me esforcei bastante para otimizar o Linux para roteamento Gigabit wirespeed com muitos pacotes pequenos. Isso foi para um balanceador de carga (IPVS) e não um firewall NAT. Aqui estão algumas dicas baseadas nisso.

  • Atualize o kernel do Linux para pelo menos 2.6.30 (precisamos de um driver Broadcom bnx2 atualizado)
  • Use o ifconfig para procurar na interface por qualquer tipo de erro / queda / etc
  • Faça o download e compile o mais recente ethtool para garantir que ele ofereça suporte total ao driver da NIC
  • Use o ethtool para procurar estatísticas mais detalhadas
  • Use o ethool para ajustar as configurações de coalescência, NAPI, etc. para minimizar as interrupções
  • Veja o equilíbrio para se certificar de que eles estão equilibrados entre os núcleos da CPU
  • Veja os tópicos do kernel como o ksoftirqd ... eles estão usando muita CPU?
  • COMPLETAMENTE desabilite o iptables descarregando os módulos do kernel com o rmmod. Especialmente o NAT e o conntrack podem ter um enorme impacto negativo, mesmo que você tenha liberado todas as regras e tenha correntes vazias. Eu vi um enorme aumento de desempenho ao fazer isso. Você mencionou que isso é um firewall, mas eu ainda descarregaria temporariamente os módulos NAT e conntrack para ver se faz alguma diferença.

Eu ainda não vi nenhum desmembramento no tempo gasto por função de rede do kernel, como switching vs routing vs firewall vs whatever.

    
por 04.01.2012 / 18:32
0

O Iptables é realmente um firewall eficiente para sistemas Linux. Ele pode lidar com uma enorme quantidade de tráfego sem começar o gargalo, já que você escreveu um bom conjunto de regras.

Uma coisa que você pode fazer é desativar o iptables limpando todas as regras e definir a política FORWARD padrão como ACCEPT . Desta forma, você pode eliminar qualquer preocupação com a implementação do iptables. Depois disso, você pode examinar o driver de rede e tentar depurar o problema se ele persistir.

Como um conselho, tenha cuidado e não desabilite o iptables em uma máquina publicamente acessível, a menos que você saiba o que está fazendo.

    
por 04.01.2012 / 15:22
0

O desempenho unidirecional pode ser causado por problemas com o descarregamento de segmentação tcp e outras configurações na NIC. Pode ser visto em muitos casos, e. com tráfego de VM ou VPN passando por uma NIC física. É fácil desativá-lo usando o ethtool e verificar o desempenho, então vale a pena tentar (certifique-se de desativá-lo em ambos os endpoints para teste).

/usr/sbin/ethtool -K eth0 tso off
/usr/sbin/ethtool -K eth0 lro off

Aqui está um pouco mais de fundo:

link link

    
por 20.09.2015 / 08:11