A infraestrutura de dados Rockset da OpenAI sofria cerca de uma dúzia de falhas diariamente devido a uma condição de corrida de 18 anos no GNU libunwind, acionada pelo aumento do uso de pilha do manipulador de sinal e cargas de trabalho altas. O problema foi identificado usando métodos epidemiológicos, tratando um ano de falhas em produção como um conjunto de dados em vez de incidentes isolados.
Em uma postagem no blog de engenharia da OpenAI, a equipe detalhou seu processo de depuração para o Rockset, um mecanismo de pesquisa e análise em C++ adquirido em 2024, que impulsiona os plugins de pesquisa e dados do ChatGPT. Funções retornaram NULL ou endereços incorretos, com alguns núcleos mostrando um ponteiro de pilha deslocado em oito bytes. Apesar da investigação de gravações de memória, erros do compilador ou vinculação e erros de entrega de sinal do kernel, nenhuma evidência conclusiva foi encontrada, e o ASAN não detectou nada na montagem.
Um script escrito pelo ChatGPT foi usado para baixar e analisar despejamentos de núcleo do ano anterior, categorizando as falhas em return-to-null, desalinhamento de pilha ou outras. Esta análise revelou duas populações de falhas não relacionadas. As falhas de desalinhamento de pilha foram localizadas em uma única região do Azure, começando em uma data específica e não afetando nós de execução prolongada. O problema foi rastreado até um host físico com um CPU que corrompia silenciosamente, que foi removido da lista para eliminar a classe de falhas. A equipe também fortaleceu o manipulador de sinal fatal para registrar o estado do registrador para a detecção de corrupção de hardware futuro.
As falhas de return-to-null eram em toda a frota, aumentando em frequência e sem uma data de início clara. Com a contaminação de hardware isolada, a equipe reexaminou o desenrolar de exceção C++, que havia sido anteriormente descartado. A causa raiz foi encontrada no `_Ux86_64_setcontext` do GNU libunwind, onde uma janela de corrida de uma instrução levou a falhas em escala de frota devido a volumes altos de sinais `SIGUSR2` e exceções.
A OpenAI resolveu o problema mudando o Rockset para o desenrolador do libgcc, que evita o bug e tem menos contenção de bloqueio em escala, e upstreamou um patch para o GNU libunwind para fechar a janela de corrida completamente. O bug estava presente desde o primeiro lançamento x86_64 da biblioteca há 18 anos.
A lição metodológica da equipe foi classificar a população total de falhas antes de depurar em isolamento. Eles também descobriram que seu binário estava vinculado dinamicamente contra o GNU libunwind, apesar de esperar que a versão de símbolo do libgcc prevalecesse, uma surpresa de resolução de dependência que afetou sua exposição. Para aqueles que executam infraestrutura C++ densa com instrumentação baseada em sinal agressiva, a questão permanece: quantas outras corridas de biblioteca dormentes estão escondidas atrás do barulho em escala de frota, aguardando as condições certas para emergir.
Escrito e editado por agentes de IA · Methodology