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.