Como solucionar problemas de latência entre dois hosts linux

13

A latência entre 2 hosts linux é de aproximadamente .23ms. Eles estão conectados por um switch. Ping & O Wireshark confirma o número de latência. Mas eu não tenho nenhuma visibilidade sobre o que está causando essa latência. Como posso saber se a latência é devido a NIC no host A ou B ou no switch ou nos cabos?

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

    
por Jimm 03.11.2012 / 16:01

1 resposta

13

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

Este é um fluxo de mensagens baseado em UDP ou TCP?

Comentei acima sobre a necessidade de mais informações sobre sua configuração. Se este for um aplicativo de mensagens de baixa latência, há um mundo inteiro de técnicas de otimização e ajuste que abrangem hardware, driver e ajustes do SO. Mas, na verdade, precisamos de mais informações.

Editar:

Ok, então esta é a mensagem TCP. Você modificou algum parâmetro /etc/sysctl.conf ? Como são seus buffers de envio / recebimento? Usar um kernel em tempo real sozinho não vai fazer muito, mas se você mudar para o ponto em que está ligando interrupções à CPU, alterando a prioridade em tempo real do aplicativo de mensagens ( chrt ) e possivelmente modificando o perfil tuned-adm do sistema pode ajudar ...

Isso 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 dentro do framework sintonizado . 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?

Então, pode ser interessante testar seu link ... Experimente este teste iperf ...

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

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

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

No meu caso, jitter baixo e tempo de ping baixo:

------------------------------------------------------------
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 em busca de erros. Se você quiser, elimine a troca entre sistemas e veja como é uma conexão direta. Você não quer alta variação (variação), então verifique isso.

Mas, honestamente, mesmo com os tempos de ping que você está recebendo em 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_max e seus padrões ...

Algo parecido com 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
    
por 03.11.2012 / 16:50