- Netflix migró un microservicio Java intensivo en CPU de
m5.4xl (16 vCPU) a m5.12xl (48 vCPU)
- Como tenía 3 veces más vCPU, esperaban aproximadamente 3 veces más rendimiento, pero el throughput solo aumentó un 25%
- Incluso la latencia se redujo un 50%, y tanto el patrón de CPU como el de latencia se volvieron mucho más entrecortados (choppy)
- Un artículo que organiza hasta nivel de bajo nivel el recorrido para resolver este problema
Proceso de resolución
- Decidieron comparar el nodo rápido con el nodo lento
- Con Flame Graph y profiling de la JVM (usando JFR-Java Flight Recorder) no pudieron identificar diferencias
- Como no había nada extraño a nivel de app/OS/JVM, revisaron los PMC (Performance Monitoring Counters, PMU Counter) que ofrece la instancia
m5.12xl
- Uno de los problemas era el "False Sharing": un patrón que ocurre cuando 2 núcleos leen o escriben variables no relacionadas que comparten la misma línea de caché L1
- Lo resolvieron insertando bytes de padding en código del JDK para cambiar solo el layout de datos, sin modificar la funcionalidad
- Otro problema era el "True Sharing": leer y escribir la misma variable desde varios hilos/núcleos
- Para resolverlo, evitaron escribir en variables compartidas y rodearon la caché secundaria de superclases de la JVM
- Tras aplicar ambos parches, obtuvieron una mejora de velocidad de 3.5 veces respecto al inicio
- Mientras resolvían este problema, descubrieron el bug JDK-8180450, que había permanecido inactivo durante 5 años
Conclusión
- Existe la tendencia a pensar que la JVM es un entorno de ejecución altamente optimizado que compite con lenguajes orientados al rendimiento como C++
- Para la mayoría de las cargas de trabajo, eso es cierto, pero en cargas específicas el rendimiento puede verse afectado no solo por la implementación de la aplicación, sino también por la implementación de la propia JVM
- En este caso, usaron PMC para encontrar y parchear un cuello de botella en código nativo de la JVM, logrando mejorar en más de 3 veces el throughput de esa carga de trabajo
- Para este tipo de problemas de rendimiento, la capacidad de inspeccionar la ejecución a nivel de microarquitectura de CPU es la única solución
- Intel vTune ofrece información valiosa incluso solo con los PMC clave expuestos en instancias como
m5.12xl
- Si todas las instancias en la nube ofrecieran un conjunto completo de PMC junto con PEBS (Processor Event-Based Sampling), sería posible lograr mejoras de rendimiento mucho mayores mediante análisis más profundos
2 comentarios
Vaya, qué demonios...
Debe haber sido emocionante cuando se confirmó la hipótesis y se corrigió.