Pacotes de rede fora de ordem / ACKs duplicados

2

Atualmente, tenho um problema muito grande com o desempenho da rede de um novo DataCenter no qual acabamos de nos mudar e, honestamente, não sei onde proceder; então estou procurando inspiração.

O DataCenter tem uma rede gerenciada à qual eu não tenho acesso, mas estamos encarregados de gerenciar nossos hosts dentro dele.

Informações gerais

  • Temos onze hosts (todos do Debian Squeeze) no ambiente do DataCenter (Dell R210s e R710s).
  • Cada host possui duas interfaces ativas, que são configuradas em uma configuração ativo / passivo bond0 (eth0 e eth1).
  • A pilha de rede nos hosts é basicamente conforme a configuração padrão da Debian, não estamos executando com tentativas de otimização de desempenho ou similares.
  • O problema é idêntico / replicável em qualquer um dos onze hosts, mas só se aplica ao tráfego que cruza o limite da rede (isto é, não se aplica ao tráfego entre os próprios hosts internos).
  • A equipe de suporte do DataCenter conectou um laptop ao mesmo switch em que o restante dos hosts está e não pode recriar o problema; e, portanto, disseram que deve ser um problema de configuração com os próprios hosts internos e NÃO é um problema com a rede.

O problema

Em transferências de saída, a transferência começa rapidamente com um tamanho de janela grande, mas nos pacotes do servidor remoto são recebidos fora de ordem e isso, por sua vez, faz com que as ACKs duplicadas sejam enviadas. Em pouco tempo, o tamanho da janela diminuiu massivamente (estabilizou-se entre 40.000 e 60.000 bytes) e a transferência passou de megabytes por segundo para ~ 200-300KB / s.

Nas transferências de entrada, tudo está "bem" (onde "bem" é definido como taxas de transferência sustentadas de 2 MB / s).

Assim, uma transferência SCP de um arquivo de 20MB para fora do datacenter começará em ~ 2,2MB / seg mas cairá para ~ 275KB / seg e levará no total 01m14s, enquanto a transferência SCP do mesmo arquivo de 20MB INTO o datacenter começará em ~ 2,2MB / seg, permanecerá estável entre ~ 2,0-2,2MB / seg e terminará em 00m09s.

O que tentei

  • Verifiquei que não há confusão na negociação entre os hosts e o hardware da rede - todos os links são vistos como 1 GbE full duplex por todas as partes.
  • Eu tentei desabilitar o dimensionamento de janelas.
  • Eu tentei encolher net.ipv4.tcp_rmem e net.ipv4.tcp_wmem de seus padrões debian.
  • Eu tentei desativar o bond0 e apenas transferir os arquivos por uma interface eth0 simples.
  • Tentei transferir para vários pontos de extremidade externos extensos; todos compartilham o mesmo problema (ou seja, tenho certeza de que o problema está no final do DataCenter e não no outro).
  • Eu executei mtr checagem das rotas para os múltiplos end-points externos (dos quais eu posso replicar o problema) - as rotas são diferentes (não são parecidas depois de alguns saltos), e enquanto algumas deles mostram algum nível de perda de pacotes; o fato de que o comportamento é tão semelhante em todos os endpoints (que têm rotas diferentes e níveis diferentes de perda de pacotes) me leva a acreditar que o problema não é culpa de nada mais do que três ou quatro saltos do DC interno ( como esses são os saltos comuns para cada rota - e esses saltos não mostram nenhum nível significativo de perda de pacotes).

Abaixo está uma análise de tráfego do tráfego de entrada / saída (da perspectiva do host no DC). Como você pode ver, existem ACKs repetidos (muito) regulares que mantêm a velocidade de transferência muito abaixo do que deveria ser. Observe também que, em uma transferência de entrada, o mesmo problema não ocorre.

tshark -r outbound-bond0.pcap -q -z io,stat,1,\
  "COUNT(tcp.analysis.retransmission) tcp.analysis.retransmission",\
  "COUNT(tcp.analysis.duplicate_ack)tcp.analysis.duplicate_ack",\
  "COUNT(tcp.analysis.lost_segment) tcp.analysis.lost_segment",\
  "COUNT(tcp.analysis.fast_retransmission) tcp.analysis.fast_retransmission"
===================================================================
IO Statistics
Interval: 1.000 secs
Column #0: COUNT(tcp.analysis.retransmission) tcp.analysis.retransmission
Column #1: COUNT(tcp.analysis.duplicate_ack)tcp.analysis.duplicate_ack
Column #2: COUNT(tcp.analysis.lost_segment) tcp.analysis.lost_segment
Column #3: COUNT(tcp.analysis.fast_retransmission) tcp.analysis.fast_retransmission
                |   Column #0    |   Column #1    |   Column #2    |   Column #3    
Time            |          COUNT |          COUNT |          COUNT |          COUNT 
000.000-001.000                 8               22                0                2 
001.000-002.000                 4               28                0                3 
002.000-003.000                 4               33                0                4 
003.000-004.000                 4               25                0                3 
004.000-005.000                 3               28                0                3 
005.000-006.000                 4               38                0                4 
006.000-007.000                 6               22                0                4 
007.000-008.000                 4               14                0                2 
008.000-009.000                 5               33                0                4 
009.000-010.000                 1               10                0                1 
010.000-011.000                 4               25                0                2 
011.000-012.000                 2               25                0                2 
012.000-013.000                 3               35                0                3 
013.000-014.000                 2               23                0                2 
014.000-015.000                 4               50                0                4 
015.000-016.000                 3               22                0                2 
016.000-017.000                 5               28                0                3 
017.000-018.000                 3               29                0                3 
018.000-019.000                 3               31                0                3 
019.000-020.000                 5               17                0                2 
020.000-021.000                 4               40                0                4 
021.000-022.000                 7               27                0                3 
022.000-023.000                 5               37                0                4 
023.000-024.000                10               17                0                1 
024.000-025.000                 3               10                0                1 
025.000-026.000                 4                9                0                2 
026.000-027.000                 3               10                0                1 
027.000-028.000                 4               47                0                4 
028.000-029.000                 5               35                0                4 
029.000-030.000                 3               14                0                2 
030.000-031.000                 9               24                0                3 
031.000-032.000                 4               20                0                3 
032.000-033.000                 6               37                0                5 
033.000-034.000                 3               19                0                3 
034.000-035.000                 3               17                0                1 
035.000-036.000                 3               42                0                3 
036.000-037.000                 6               49                0                5 
037.000-038.000                 1                7                0                1 
038.000-039.000                 9               59                0                6 
039.000-040.000                 3               23                0                3 
040.000-041.000                 1               12                0                1 
041.000-042.000                 4               39                0                2 
042.000-043.000                 6               15                0                0 
043.000-044.000                 2               25                0                2 
044.000-045.000                 3               41                0                3 
045.000-046.000                 1                8                0                1 
===================================================================

tshark -r inbound-bond0.pcap -q -z io,stat,1,\
  "COUNT(tcp.analysis.retransmission) tcp.analysis.retransmission",\
  "COUNT(tcp.analysis.duplicate_ack)tcp.analysis.duplicate_ack",\
  "COUNT(tcp.analysis.lost_segment) tcp.analysis.lost_segment",\
  "COUNT(tcp.analysis.fast_retransmission) tcp.analysis.fast_retransmission"
===================================================================
IO Statistics
Interval: 1.000 secs
Column #0: COUNT(tcp.analysis.retransmission) tcp.analysis.retransmission
Column #1: COUNT(tcp.analysis.duplicate_ack)tcp.analysis.duplicate_ack
Column #2: COUNT(tcp.analysis.lost_segment) tcp.analysis.lost_segment
Column #3: COUNT(tcp.analysis.fast_retransmission) tcp.analysis.fast_retransmission
                |   Column #0    |   Column #1    |   Column #2    |   Column #3    
Time            |          COUNT |          COUNT |          COUNT |          COUNT 
000.000-001.000                 0                0                0                0 
001.000-002.000                 0                0                0                0 
002.000-003.000                 0                0                0                0 
003.000-004.000                 0                0                0                0 
004.000-005.000                 0                0                0                0 
005.000-006.000                 0                0                0                0 
006.000-007.000                 0                0                0                0 
007.000-008.000                 1               26                1                0 
008.000-009.000                 1               70                0                1 
009.000-010.000                21              184                5                4 
010.000-011.000                 4               42                4                2 
011.000-012.000                 9               48                3                2 
012.000-013.000                 0                0                0                0 
013.000-014.000                 0                0                0                0 
014.000-015.000                 1               29                1                1 
===================================================================

Francamente, eu estou em uma perda total. Sugestões para o que tentar em seguida são muito bem-vindas.

    
por Remi 12.09.2012 / 19:57

1 resposta

1

Se você tem certeza de que o problema é causado por pacotes fora de ordem, então eu posso facilmente pensar em uma coisa que faria com que seus pacotes ficassem fora de ordem: um etherchannel multi-link em algum lugar entre você e o borda do DC configurado para balanceamento de carga round-robin por pacote. pergunte ao seu provedor para procurar por isso especificamente.

    
por 12.09.2012 / 20:11