Estoy ejecutando un conjunto de pruebas de carga para determinar el rendimiento de la siguiente configuración:
Node.js test suite (client) --> StatsD (server) --> Graphite (server)
En resumen, el conjunto de pruebas node.js envía una cantidad establecida de métricas cada x segundos a una instancia de StatsD que se encuentra en otro servidor. Luego, StatsD vacía las métricas cada segundo a una instancia de Graphite ubicada en el mismo servidor. Luego miro cuántas métricas fueron enviadas realmente por el conjunto de pruebas y cuántas fueron recibidas por Graphite para determinar la pérdida de paquetes entre el conjunto de pruebas y Graphite.
Sin embargo, noté que a veces obtenía tasas de caída de paquetes muy grandes (tenga en cuenta que se envía con el protocolo UDP), que van del 20 al 50%. Entonces fue cuando comencé a investigar dónde se descartaban estos paquetes, ya que podría haber algún problema de rendimiento con StatsD. Entonces comencé a registrar las métricas en cada parte del sistema para rastrear dónde ocurrió esta caída. Y aquí es donde las cosas se ponen raras.
Estoy usando tcpdump para crear un archivo de captura que inspecciono después de que la prueba termina de ejecutarse. Pero cada vez que ejecuto las pruebas con tcpdump en ejecución, ¡la pérdida de paquetes es casi inexistente! Parece que tcpdump está aumentando de alguna manera el rendimiento de mis pruebas y no puedo entender por qué y cómo lo hace. Estoy ejecutando el siguiente comando para registrar los mensajes tcpdump tanto en el servidor como en el cliente:
tcpdump -i any -n port 8125 -w test.cap
En un caso de prueba en particular, estoy enviando 40000 métricas / s. La prueba mientras ejecuta tcpdump tiene una pérdida de paquetes de aproximadamente el 4%, mientras que la que no tiene una pérdida de paquetes de aproximadamente el 20%
Ambos sistemas se ejecutan como máquinas virtuales de Xen con la siguiente configuración:
- Intel Xeon E5-2630 v2 @ 2.60GHz
- 2 GB de RAM
- Ubuntu 14.04 x86_64
Cosas que ya verifiqué por posibles causas:
- Aumento del tamaño de recepción / envío del búfer UDP.
- Carga de la CPU que afecta la prueba. (carga máxima de 40-50%, tanto del lado del cliente como del servidor)
- Ejecutar tcpdump en interfaces específicas en lugar de 'any'.
- Ejecutando tcpdump con '-p' para deshabilitar el modo promiscuo.
- Ejecutando tcpdump solo en el servidor. Esto resultó en la pérdida de paquetes del 20% y parece no afectar las pruebas.
- Ejecutar tcpdump solo en el cliente. Esto dio como resultado un mayor rendimiento.
- Aumento de netdev_max_backlog y netdev_budget a 2 ^ 32-1. Esto no hizo ninguna diferencia.
- Probé todas las configuraciones posibles del modo promiscuo en cada nic (servidor encendido y cliente apagado, servidor apagado y cliente encendido, ambos encendidos, ambos apagados). Esto no hizo ninguna diferencia.
ifconfig eth0 promisc
habilita y ifconfig eth0 -promisc
deshabilita el modo promiscuo en eth0. Si hace la diferencia, intente comparar las 4 posibles combinaciones de promisc on / off en ambas máquinas. Eso podría ayudar a determinar la fuente de los problemas.
-p
opción de omitir hacer eso para ver si hace la diferencia.