Como solucionar problemas de latência entre dois hosts Linux

16

A latência entre dois hosts Linux é de cerca de 0,23 ms. Eles estão conectados por um switch. Ping & Wireshark confirmam o número de latência. Mas, eu não tenho nenhuma visibilidade do que está causando essa latência. Como posso saber se a latência é devido à placa de rede no host A ou B ou no switch ou nos cabos?

ATUALIZAÇÃO: A latência de 0,23 ms é ruim para o meu aplicativo existente, que envia mensagens com uma frequência muito alta e estou tentando ver se ele pode ser reduzido para .1ms

Jimm
fonte
2
Por que você acha que .23ms é uma latência ruim? Essa é uma latência incrível.
quer
6
Conecte-os diretamente com um cabo cruzado. Se você tiver a mesma latência, a causa é um dos hosts. Se você não tiver a mesma latência, a causa é o comutador ou o cabeamento.
joeqwerty
11
Concordou, qual é o problema? A latência de 0,23 ms é menor do que eu recebo com duas máquinas sentadas próximas uma da outra.
Michael Hampton
@joeqwerty Se dois sistemas estiverem conectados via cabo cruzado, como eles se localizam? O ARP ainda funciona? O TCP ainda funciona?
Jimm
11
Eles funcionarão da mesma forma como se estivessem ambos conectados ao mesmo switch. O cabo é apenas o meio físico sobre o qual eles se comunicam. Todas as 7 camadas do modelo OSI (ou as 4 camadas do modelo DARPA, se você preferir) funcionarão exatamente como agora.
joeqwerty

Respostas:

15

Geralmente, você pode usar alguns dos switches avançados do utilitário iperf para obter uma visão do desempenho da rede entre sistemas, especificamente latência e jitter ...

É um fluxo de mensagens baseado em UDP ou TCP?

Comentei acima sobre a necessidade de mais informações sobre sua configuração. Se esse é um aplicativo de mensagens de baixa latência, existe um mundo inteiro de técnicas de ajuste e otimização que abrangem ajustes de hardware, driver e sistema operacional. Mas, realmente, precisamos de mais informações.

Editar:

Ok, então essa é a mensagem TCP. Você modificou algum /etc/sysctl.confparâmetro? Como são seus buffers de envio / recebimento? Usar um kernel em tempo real por si só não fará muito, mas se você passar para o ponto em que vincula interrupções às CPUs, alterar a prioridade em tempo real do aplicativo de mensagens ( chrt) e possivelmente modificar o tuned-admperfil do sistema pode ajudar ...

Parece ser um sistema EL6 genérico, portanto, uma maneira fácil de definir uma linha de base de ajuste de desempenho envolve alterar o perfil de desempenho do sistema para outro disponível na estrutura ajustada . Então construa a partir daí.

No seu caso:

yum install tuned tuned-utils
tuned-adm profile latency-performance

Uma matriz rápida mostrando as diferenças:

Você pode nos falar sobre o hardware? Tipos de CPU, NIC, memória?

Portanto, pode ser interessante testar seu link ... Experimente este teste iperf ...

Em um sistema, inicie um ouvinte do iperf UDP. Por outro lado, abra uma conexão com o primeiro ... Um teste rápido de qualidade da linha.

# Server2
[root@server2 ~]# iperf -su   

# Server1
[root@server1 ~]# iperf -t 60 -u -c server2

No meu caso, baixa instabilidade e baixo tempo de ping:

------------------------------------------------------------
Server listening on UDP port 5001
Receiving 1470 byte datagrams
UDP buffer size:  224 KByte (default)
------------------------------------------------------------
[  3] local 192.168.15.3 port 5001 connected with 172.16.2.152 port 36312
[ ID] Interval       Transfer     Bandwidth        Jitter   Lost/Total Datagrams
[  3]  0.0-20.0 sec  2.50 MBytes  1.05 Mbits/sec   0.012 ms    0/ 1785 (0%)

PING server1 (172.16.2.152) 56(84) bytes of data.
64 bytes from server1 (172.16.2.152): icmp_seq=1 ttl=63 time=0.158 ms
64 bytes from server1 (172.16.2.152): icmp_seq=2 ttl=63 time=0.144 ms

Eu verificaria o hardware e as interfaces quanto a erros. Se desejar, elimine a alternância entre sistemas e veja como é uma conexão direta. Você não deseja alta variação (variação), então verifique isso.

Mas, honestamente, mesmo com os tempos de ping que você está recebendo na sua configuração atual, isso não deve ser suficiente para matar seu aplicativo. Eu seguiria o caminho de ajustar seus buffers de envio / recebimento. Veja: net.core.rmem_max, net.core.wmem_maxe seus padrões ...

Algo como o seguinte em /etc/sysctl.conf(por favor, sintonize a gosto):

net.core.rmem_default = 10000000
net.core.wmem_default = 10000000
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
ewwhite
fonte
É um aplicativo de mensagens sensível à latência. O sistema operacional típico seria o kernel-2.6.32-279.11.1.el6.x86_64, embora eu carregasse os hosts com o kernel 3.2.23-rt37.56.el6rt.x86_64 para ver se isso faria alguma diferença. Mas era praticamente o mesmo. Os tamanhos das mensagens variam entre 1 KB e 3 KB. Toda a comunicação acontece via TCP.
Jimm
O sistema operacional Red Hat MRG?
ewwhite
Neste momento, o seu Redhat 6.3 simples, mas o MRG também é uma possibilidade. Como mencionei acima, tentei os dois, mas a latência era a mesma. Com que tipo de sintonizadores devo me preocupar?
Jimm
Gostaria de saber o hardware e a configuração da NIC. O modelo de switch ajuda. Para os tunables, a área óbvia para olhar no 6.3 é o seu tuned-admperfil.
ewwhite
Controladores Ethernet duplos: Emulex Corporation OneConnect 10Gb NIC (rev 02) e 16 processadores AMD Family 10h de núcleo, cada 2400 MHz.
Jimm