Estou executando um conjunto de testes de carga para determinar o desempenho da seguinte configuração:
Node.js test suite (client) --> StatsD (server) --> Graphite (server)
Em resumo, o conjunto de testes node.js envia uma quantidade definida de métricas a cada x segundos para uma instância StatsD localizada em outro servidor. O StatsD, por sua vez, libera as métricas a cada segundo para uma instância do Graphite localizada no mesmo servidor. Depois, analiso quantas métricas foram realmente enviadas pelo conjunto de testes e quantas foram recebidas pelo Graphite para determinar a perda de pacotes entre o conjunto de testes e o Graphite.
No entanto, notei que às vezes recebia taxas muito grandes de queda de pacotes (observe que ele está sendo enviado com o protocolo UDP), variando de 20 a 50%. Foi então que comecei a investigar onde esses pacotes estavam sendo descartados, pois poderia haver algum problema de desempenho com o StatsD. Então comecei a registrar as métricas em todas as partes do sistema para rastrear onde essa queda ocorreu. E é aí que as coisas ficam estranhas.
Estou usando o tcpdump para criar um arquivo de captura que inspeciono após a execução do teste. Mas sempre que eu executo os testes com o tcpdump em execução, a perda de pacotes é quase inexistente! Parece que o tcpdump está aumentando o desempenho dos meus testes e não consigo descobrir por que e como isso acontece. Estou executando o seguinte comando para registrar as mensagens tcpdump no servidor e no cliente:
tcpdump -i any -n port 8125 -w test.cap
Em um caso de teste específico, estou enviando 40000 métricas / s. O teste durante a execução do tcpdump apresenta uma perda de pacotes de cerca de 4%, enquanto o teste sem uma perda de pacotes de cerca de 20%
Ambos os sistemas estão executando como VMs do Xen com a seguinte configuração:
- Intel Xeon E5-2630 v2 a 2.60GHz
- 2GB RAM
- Ubuntu 14.04 x86_64
Coisas que eu já verifiquei para possíveis causas:
- Aumentando o tamanho de recebimento / envio do buffer UDP.
- Carga da CPU que afeta o teste. (carga máxima de 40-50%, do lado do cliente e do servidor)
- Executando o tcpdump em interfaces específicas em vez de 'any'.
- Executando o tcpdump com '-p' para desativar o modo promíscuo.
- Executando o tcpdump apenas no servidor. Isso resultou na perda de pacotes de 20% e parece não afetar os testes.
- Executando o tcpdump apenas no cliente. Isso resultou em maior desempenho.
- Aumentando netdev_max_backlog e netdev_budget para 2 ^ 32-1. Isso não fez diferença.
- Tentei todas as configurações possíveis do modo promíscuo em todos os nichos (servidor ativado e cliente desativado, servidor desativado e cliente ativado, ambos ativados, ambos desativados). Isso não fez diferença.
ifconfig eth0 promisc
ativa e ifconfig eth0 -promisc
desativa o modo promíscuo em eth0. Se isso fizer diferença, tente comparar as 4 combinações possíveis de promisc ativadas / desativadas nas duas máquinas. Isso pode ajudar a identificar a fonte dos problemas.
-p
opção de pular isso para ver se faz alguma diferença.