La infraestructura de datos Rockset de OpenAI experimentaba alrededor de un puñado de fallos diarios debido a una condición de carrera de 18 años en GNU libunwind, desencadenada por un aumento en el uso de la pila del manejador de señales y cargas de trabajo altas. El problema fue identificado utilizando métodos epidemiológicos, tratando un año de fallos de producción como un conjunto de datos en lugar de incidentes aislados.
En una entrada de blog de ingeniería de OpenAI, el equipo detalló su proceso de depuración para Rockset, un motor de búsqueda y análisis en C++ adquirido en 2024, que impulsa los complementos de búsqueda y datos de ChatGPT. Se observó que las funciones devolvían NULL o direcciones incorrectas, con algunos núcleos mostrando un puntero de pila desplazado en ocho bytes. A pesar de investigar escrituras de memoria, errores del compilador o enlaces, y errores de entrega de señales del kernel, no se encontró evidencia concluyente, y ASAN no detectó nada en staging.
Se utilizó un script escrito por ChatGPT para descargar y analizar volcados de núcleo del año anterior, categorizando los fallos en return-to-null, desalineado de pila, u otros. Este análisis reveló dos poblaciones de fallos no relacionados. Los fallos de desalineado de pila estaban localizados en una sola región de Azure, comenzando en una fecha específica y no afectando a los nodos de larga duración. El problema se rastreó hasta un host físico con una CPU que corrompe silenciosamente, que fue eliminado de la lista para eliminar la clase de fallos. El equipo también endureció el manejador de señales fatales para registrar el estado del registro para la detección futura de corrupción de hardware.
Los fallos return-to-null eran a escala de flota, aumentaban en frecuencia y carecían de una fecha de inicio clara. Con la contaminación de hardware aislada, el equipo reexaminó el desenrollado de excepciones C++, que anteriormente se había descartado. La causa raíz se encontró en `_Ux86_64_setcontext` de GNU libunwind, donde una ventana de carrera de una instrucción llevó a fallos a escala de flota debido a volúmenes altos de señales `SIGUSR2` y excepciones.
OpenAI resolvió el problema cambiando Rockset al desenrededor de libgcc, que evita el error y tiene menos contención de bloqueo a escala, y upstreameó un parche a GNU libunwind para cerrar por completo la ventana de carrera. El error ha estado presente desde el primer lanzamiento x86_64 de la biblioteca hace 18 años.
La lección metodológica del equipo fue clasificar la población completa de fallos antes de depurar en aislamiento. También descubrieron que su binario estaba vinculado dinámicamente contra GNU libunwind, a pesar de esperar que prevaleciera la versión de símbolos de libgcc, una sorpresa de resolución de dependencias que afectó su exposición. Para aquellos que ejecutan una infraestructura de C++ densa con instrumentación agresiva basada en señales, la pregunta sigue siendo: ¿cuántas otras carreras de bibliotecas dormidas están ocultas detrás del ruido a escala de flota, esperando las condiciones adecuadas para emerger?
Escrito y editado por agentes de IA · Methodology