Diminuição de desempenho no aplicativo de rede simples quando executado em uma máquina 'melhor'

3

Passei meio dia tentando descobrir por que um aplicativo simples de comunicação em rede é executado mais lentamente no que parece ser uma máquina melhor especificada.

Existem dois programas: um cliente simples que, através de TCP / IP, se conecta ao servidor, grava (a mesma) mensagem e espera por uma resposta, antes de escrever a mesma mensagem novamente. O servidor simples aguarda o cliente gravar uma mensagem e grava (a mesma) mensagem no cliente. Essa troca é feita em um loop 1M vezes. Este teste está sendo feito pelo host local.

Essa interação no computador mais antigo alcança cerca de 90000 mensagens por segundo e, no computador mais novo, atinge cerca de 44.000 mensagens por segundo, embora o computador mais novo tenha melhores especificações e não tenha nenhum outro processo de usuário sendo executado nele.

O computador mais antigo:

  • é uma caixa dev compartilhada - vários outros processos são executados em conjunto com meus testes
  • possui 16 processadores Intel Xeon XeSu X5570 a 2.93GHz
  • tem 49Gb de memória, dos quais apenas cerca de 5GB são gratuitos

O computador mais recente:

  • não é compartilhado - os únicos processos em execução são meus
  • possui 24 processadores Intel® Xeon® X5690 @ 3.47GHz
  • tem 24,5 GB de memória, dos quais 21 GB são gratuitos

Eu verifiquei o seguinte:

  • Os Kernels do SO são os mesmos. Uname -a mostra: Linux ficsydapd20 2.6.18-238.9.1.el5 # 1 SMP sex 18 de março 12:42:39 EDT 2011 x86_64 x86_64 x86_64 GNU / Linux
  • A arquitetura de memória
  • é melhor na máquina mais recente - comparada com o cachebench
  • A
  • máquina mais recente teve um desempenho superior em um comparativo de mercado da cpu - Fhourstone
  • strace mostra aproximadamente a mesma quantidade de chamadas do sistema
  • O vmstat não mostra paginação enquanto o programa está sendo executado
  • O MTU é o mesmo para o dispositivo de loopback via / sbin / ifconfig
  • Buffers de soquete padrão usados para ambos os sistemas verificados usando / proc / sys / net / ipv4 / tcp_wmem e / proc / sys / net / ipv4 / tcp_rmem
  • localhost é definido como 127.0.0.1 em / etc / hosts para ambas as máquinas

Alguém sabe qual pode ser o problema ou o que pode fornecer mais informações?

    
por Taras 06.01.2012 / 06:18

2 respostas

1

Nós sincronizamos versões e drivers do kernel, o que não ajudou. Acontece que algumas das configurações da BIOS estavam causando queda no desempenho. Em particular:

Os estados C e opções C1E que reduzem a velocidade do clock e o consumo de tensão quando a caixa não está sendo usada para economizar energia - porque a nova máquina não estava sendo utilizada tanto, ela estava sendo arrastada para esse estado, o que diminuir o desempenho (contra intuitivamente).

O desempenho agora está atingindo e, às vezes, excedendo o da máquina mais antiga.

    
por 19.01.2012 / 06:51
2

Você precisa verificar mais algumas coisas aqui

1) verifique se qdisc não está configurado .. certifique-se de que não há entrada para o dispositivo lo aqui

[qdisc é usado para interfaces de limite de taxa]

root@x:~# tc qdisc
qdisc pfifo_fast 0: dev eth0 root refcnt 2 bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
qdisc mq 0: dev wlan0 root 

2) verifique iptables: certifique-se de que eles são os mesmos para ambas as máquinas [log de conexão no iptables ou masquerading pode reduzir a velocidade efetiva]

root@x:~# iptables -L
root@x:~# iptables -L -t nat

if not you can try using iptables -F  and iptables -t nat -F  to flush them

3) verificar o status do status do selinux é o mesmo em ambos (ativado ou desativado)

4) na taxa de conexões / proc / sys / net / ipv4 tcp depende de muitos parâmetros como (já que você está enviando conexões a um ritmo muito rápido)

net.ipv4.tcp_tw_reuse

net.ipv4.tcp_max_syn_backlog

então você terá que garantir que esses valores sejam os mesmos para ambas as máquinas

Uma maneira fácil de detectar diferenças é

Máquina 1

root@x:~# sysctl -a | grep net.ipv4.tcp_ > s1

Máquina 2

root@x:~# sysctl -a | grep net.ipv4.tcp_ > s2

copie arquivos e confira diff

root@x:~# diff s1 s2

Você pode alterar os valores que são diferentes.

    
por 07.01.2012 / 08:44