Ingeniero de AWS reporta que el rendimiento de PostgreSQL cae a la mitad en Linux 7.0; la corrección podría no ser sencilla
(phoronix.com/news)- En el kernel de desarrollo de Linux 7.0, ingenieros de Amazon/AWS detectaron una grave regresión de rendimiento en la que el throughput del servidor de bases de datos PostgreSQL cae a cerca de la mitad frente al kernel anterior
- Según mediciones en servidores Graviton4, Linux 7.0 ofrece solo aproximadamente 0.51 veces el throughput del kernel previo, y se determinó que la causa es que se consume mucho más tiempo en los spinlocks en espacio de usuario
- La regresión se debe a un cambio en Linux 7.0 que restringe el modo de preemption del kernel; se presentó un parche para restaurar PREEMPT_NONE como valor predeterminado, pero no está claro si será aceptado
- El autor original, Peter Zijlstra, señaló que en vez de modificar el kernel, PostgreSQL debería adaptarse para aprovechar la extensión de time slice de RSEQ (Restartable Sequences)
- La versión estable de Linux 7.0 está prevista para dentro de unas 2 semanas y también será el kernel base de Ubuntu 26.04 LTS, por lo que existe preocupación por una degradación amplia del rendimiento hasta que PostgreSQL se adapte
Detección del problema y magnitud
- El ingeniero de Amazon/AWS Salvatore Dipietro reportó una regresión en el throughput y la latencia de PostgreSQL
- En mediciones sobre servidores Graviton4, Linux 7.0 entrega solo 0.51 veces el throughput del kernel existente
- Se confirmó que la causa es un consumo de tiempo mucho mayor en los spinlocks en espacio de usuario
Causa de la regresión: restricción del modo de preemption
- El resultado del bisecting identificó como causa el cambio que restringe el modo de preemption del kernel en Linux 7.0
- Ese cambio se realizó para mantener solo los modos Full y Lazy de preemption en arquitecturas de CPU modernas, y fue incluido como parte de la actualización del scheduler de Linux 7.0
Parche presentado y reacción de los mantenedores del kernel
- Debido a la gravedad de la regresión, se envió a la lista de correo del kernel de Linux un parche para restaurar PREEMPT_NONE como modo de preemption predeterminado
- Sin embargo, Peter Zijlstra, autor del código original, se mostró contrario a aceptar ese parche y afirmó que la solución es que PostgreSQL aproveche la extensión de time slice de RSEQ (Restartable Sequences)
- La extensión de time slice de RSEQ también es una función incluida en Linux 7.0
- Zijlstra explicó que "esto puede limitar la exposición a la preemption del lock holder"
Alcance del impacto y calendario de lanzamiento
- Si esa postura se mantiene, el rendimiento de PostgreSQL en algunos escenarios podría degradarse de forma considerable en la versión estable de Linux 7.0 hasta que PostgreSQL sea actualizado
- La versión estable de Linux 7.0 está prevista para dentro de unas 2 semanas
- Linux 7.0 será el kernel base de Ubuntu 26.04 LTS, por lo que Ubuntu 26.04 LTS, cuyo lanzamiento está previsto para finales de abril, también podría verse afectado
2 comentarios
Por lo que escuché, los desarrolladores del kernel les han estado diciendo a los desarrolladores de PostgreSQL desde hace casi 10-20 años: "los spinlocks en espacio de usuario no son recomendables, así que nos gustaría que lo reconsideraran"...
https://x.com/kosaki55tea/status/2040458791536497035
Comentarios en Hacker News
Vale la pena leer la respuesta de seguimiento en LKML de Andres Freund, desarrollador de Postgres
La opinión es que los mantenedores de Linux deberían dar prioridad de soporte a aplicaciones clave como PostgreSQL
Esto recuerda un caso anterior en Fedora donde las actualizaciones se bloqueaban al instalar Wine
O sea, no es un problema que vayan a sufrir todos los usuarios de PostgreSQL al actualizar al kernel más reciente
Hubo quien opinó que usar spinlock en espacio de usuario sin soporte del kernel es buscarse una caída de rendimiento
Pero los locks basados en futex provocan regresiones de rendimiento por el aumento de memory barriers
Además, Postgres todavía tiene que considerar plataformas que no soportan operaciones atómicas de 8 bytes, así que no es fácil reemplazarlo
El spinlock en cuestión fue eliminado recientemente y, al usar huge pages, el cuello de botella casi desaparece
También apareció la afirmación de que “nadie usa el kernel más reciente en producción”
En la práctica, Ubuntu 26.04 LTS saldrá pronto basado en Linux 7.0, así que muchos usuarios lo usarán pronto
El problema actual es que no se resuelve con sysctl sino que requiere un parche del kernel
El contexto sobre PREEMPT_LAZY puede verse en este artículo de LWN
Hubo un comentario en tono de broma preguntando si habían revisado si Jia Tan envió un parche reciente al kernel,
y alguien respondió que “ni hace falta, ya sobran las vulnerabilidades”
Hubo quien se preguntó si el I/O asíncrono y las optimizaciones de consultas paralelas de PostgreSQL 18 podrían compensar esta caída de rendimiento
Los detalles relacionados pueden verse en las notas de lanzamiento de PostgreSQL 18
También hubo dudas sobre por qué hacen falta modos de preempción dinámica como PREEMPT_LAZY
La idea es que no está claro cuál es el beneficio para el usuario común
Eso permite que el kernel reciba información más explícita y mejore las decisiones de planificación
Alguien comentó que había medido una caída de rendimiento del 10% entre FreeBSD 14 y 15.0, y que este caso al menos le daba algo de consuelo
También hubo críticas a que Phoronix publicó la nota sin verificación suficiente
En un correo posterior se concluyó que el benchmark en sí estaba mal y que en realidad no era un problema grave
Puede que no sea un gran problema para PostgreSQL, pero podría afectar a otras aplicaciones que no pueden usar huge pages
Por eso, algunos opinan que no es algo que simplemente deba ignorarse
También se compartió este enlace a un viejo hilo de LKML