La velocidad a la que mi servidor puede aceptar () nuevas conexiones TCP entrantes es realmente mala en Xen. La misma prueba en hardware de metal desnudo muestra aceleraciones de 3-5x.
- ¿Cómo es que esto es tan malo con Xen?
- ¿Puedes ajustar Xen para mejorar el rendimiento de las nuevas conexiones TCP?
- ¿Existen otras plataformas de virtualización más adecuadas para este tipo de casos de uso?
Antecedentes
Últimamente he estado investigando algunos cuellos de botella de rendimiento de un servidor Java desarrollado internamente que se ejecuta bajo Xen. El servidor habla HTTP y responde llamadas simples de conexión / solicitud / respuesta / desconexión de TCP.
Pero incluso mientras envía cargas de tráfico al servidor, no puede aceptar más de ~ 7000 conexiones TCP por segundo (en una instancia EC2 de 8 núcleos, c1.xlarge ejecuta Xen). Durante la prueba, el servidor también exhibe un comportamiento extraño en el que un núcleo (no necesariamente CPU 0) se carga mucho> 80%, mientras que los otros núcleos permanecen casi inactivos. Esto me lleva a pensar que el problema está relacionado con el núcleo / virtualización subyacente.
Cuando pruebo el mismo escenario en una plataforma no virtualizada de metal desnudo, obtengo resultados de prueba que muestran tasas de aceptación de TCP () más allá de 35 000 / segundo. Esto en una máquina Core i5 4 core que ejecuta Ubuntu con todos los núcleos casi completamente saturados. Para mí, ese tipo de figura parece correcta.
En la instancia de Xen nuevamente, he intentado habilitar / ajustar casi todas las configuraciones que hay en sysctl.conf. Incluyendo la habilitación de Recibir Packet Steering y Recibir Flow Steering y fijar hilos / procesos a las CPU pero sin ganancias aparentes.
Sé que es de esperar un rendimiento degradado cuando se ejecuta virtualizado. Pero a este grado? Un servidor más lento y básico que supera al virt. 8 núcleos por un factor de 5?
- ¿Es este el comportamiento realmente esperado de Xen?
- ¿Puedes ajustar Xen para mejorar el rendimiento de las nuevas conexiones TCP?
- ¿Existen otras plataformas de virtualización más adecuadas para este tipo de casos de uso?
Reproduciendo este comportamiento
Al investigar más a fondo y determinar el problema, descubrí que la herramienta de prueba de rendimiento de netperf podría simular el escenario similar que estoy experimentando. Utilizando la prueba TCP_CRR de netperf, he recopilado varios informes de diferentes servidores (tanto virtualizados como no virtuales). Si desea contribuir con algunos hallazgos o consultar mis informes actuales, consulte https://gist.github.com/985475
¿Cómo sé que este problema no se debe a un software mal escrito?
- El servidor ha sido probado en hardware de metal desnudo y casi satura todos los núcleos disponibles.
- Cuando se usan conexiones TCP para mantener vivo, el problema desaparece.
¿Porque es esto importante?
En ESN (mi empleador) soy el líder del proyecto de Beaconpush , un servidor Comet / Web Socket escrito en Java. Aunque es muy eficiente y puede saturar casi cualquier ancho de banda que se le otorgue en condiciones óptimas, todavía se limita a la rapidez con la que se pueden hacer nuevas conexiones TCP. Es decir, si tiene una gran rotación de usuarios donde los usuarios van y vienen muy a menudo, muchas conexiones TCP tendrán que configurarse / desglosarse. Intentamos mitigar esto manteniendo las conexiones vivas el mayor tiempo posible. Pero al final, el rendimiento accept () es lo que evita que nuestros núcleos giren y eso no nos gusta.
Actualización 1
Alguien publicó esta pregunta en Hacker News , también hay algunas preguntas / respuestas allí. Pero intentaré mantener esta pregunta actualizada con la información que encuentre a medida que avance.
Hardware / plataformas He probado esto en:
- EC2 con los tipos de instancia c1.xlarge (8 núcleos, 7 GB de RAM) y cc1.4xlarge (2x Intel Xeon X5570, 23 GB de RAM). Los AMI utilizados fueron ami-08f40561 y ami-1cad5275 respectivamente. Alguien también señaló que los "Grupos de seguridad" (es decir, el firewall de EC2) también podrían afectar. Pero para este escenario de prueba, he intentado solo en localhost para eliminar factores externos como este. Otro rumor que escuché es que las instancias de EC2 no pueden impulsar más de 100k PPS.
- Dos servidores virtualizados privados que ejecutan Xen. Uno tenía cero carga antes de la prueba, pero no hizo la diferencia.
- Privado dedicado, servidor Xen en Rackspace. Sobre los mismos resultados allí.
Estoy en el proceso de volver a ejecutar estas pruebas y completar los informes en https://gist.github.com/985475. Si desea ayudar, contribuya con sus números. ¡Es fácil!
(El plan de acción se ha movido a una respuesta separada y consolidada)