OpenAI исправила 18-летний баг в GNU libunwind, анализируя крахи как эпидемию
Инженеры OpenAI обнаружили и устранили два независимых дефекта, которые проявлялись как одна проблема в инфраструктуре данных ChatGPT. Первый баг представлял собой скрытое аппаратное повреждение на одном Azure-хосте, приводящее к тихому искажению данных. Второй — 18-летняя гонка (race condition) в ф

Инженеры OpenAI обнаружили и устранили два независимых дефекта, которые проявлялись как одна проблема в инфраструктуре данных ChatGPT. Первый баг представлял собой скрытое аппаратное повреждение на одном Azure-хосте, приводящее к тихому искажению данных. Второй — 18-летняя гонка (race condition) в функции setcontext библиотеки GNU libunwind, уязвимость которой составляла всего одну машинную инструкцию. Прорыв произошел, когда команда перешла от изучения отдельных дампов памяти к популяционному анализу сбоев, рассматривая крахи как эпидемию. Такой подход позволил выявить закономерности, которые ранее оставались незамеченными, и в итоге исправить давнюю ошибку, влияющую на стабильность многих систем.
Как OpenAI обнаружила скрытую гонку в GNU libunwind
Проблема начала проявляться в виде случайных крахов в инфраструктуре данных ChatGPT. Инженеры заметили, что сбои возникают нерегулярно и не привязаны к конкретным операциям. Традиционные методы отладки, такие как анализ отдельных core dump, не давали результатов, так как каждый сбой выглядел как единичный инцидент. Тогда команда решила применить эпидемиологический подход: они собрали данные о тысячах крахов и проанализировали их как популяцию, а не как изолированные события. Это позволило выявить статистическую аномалию, указывающую на два различных источника проблемы.
Что такое популяционный анализ сбоев и почему он эффективен
Популяционный анализ сбоев — это метод, при котором инженеры изучают не каждый сбой по отдельности, а совокупность всех инцидентов. Они ищут общие паттерны, временные корреляции и другие признаки, которые могут указывать на системную проблему. В случае OpenAI этот подход помог разделить два независимых бага, которые проявлялись одинаково. Первый баг был связан с аппаратным повреждением на одном сервере Azure, вызывающим тихое искажение данных. Второй — с гонкой в GNU libunwind, существовавшей 18 лет. Окно уязвимости составляло всего одну инструкцию, что делало ошибку крайне редкой и трудноуловимой.
Почему баг в GNU libunwind оставался незамеченным 18 лет
GNU libunwind — это библиотека для трассировки стека вызовов, используемая во многих проектах, включая компиляторы и отладчики. Гонка в функции setcontext возникала при определенном порядке выполнения потоков, когда один поток изменял контекст, а другой одновременно читал его. Из-за крайне малого окна уязвимости (одна инструкция) ошибка проявлялась крайне редко, и её было практически невозможно воспроизвести в тестовой среде. Многие разработчики могли списывать случайные крахи на аппаратные сбои или другие внешние факторы. Только масштабный анализ тысяч сбоев позволил OpenAI выявить закономерность и локализовать проблему.
Как исправление бага повлияет на стабильность ChatGPT и других систем
Исправление гонки в GNU libunwind уже включено в официальный репозиторий проекта. Это означает, что все пользователи библиотеки, включая разработчиков высоконагруженных и распределенных систем, получат более стабильное программное обеспечение. Для пользователей ChatGPT это приведет к уменьшению случайных сбоев и повышению надежности сервиса. Кроме того, популяционный подход к анализу сбоев может стать новой практикой в индустрии, помогая выявлять сложные, редкие ошибки, которые невозможно найти традиционными методами.
Какие системы могут быть затронуты багом libunwind
Библиотека GNU libunwind используется в различных проектах, включая GCC, LLVM, и многих встраиваемых системах. Любая программа, которая полагается на libunwind для обработки исключений или трассировки стека, потенциально могла быть подвержена этой гонке. Однако из-за редкости ошибки большинство пользователей, вероятно, не сталкивались с ней. Тем не менее, в высоконагруженных системах, где выполняются миллионы операций в секунду, даже редкая ошибка может проявляться достаточно часто, чтобы вызывать проблемы.
Что пока остается неизвестным
OpenAI не раскрывает детали аппаратного повреждения на Azure-хосте, которое стало вторым источником крахов. Также пока неясно, сколько систем могли быть затронуты багом libunwind за 18 лет и сколько инцидентов было ошибочно приписано аппаратным сбоям. Возможно, в будущем будут проведены дополнительные исследования, чтобы оценить масштаб влияния этой ошибки. Однако уже сейчас ясно, что исправление повысит стабильность не только ChatGPT, но и многих других проектов, использующих GNU libunwind.
Выводы
Открытие и исправление двух независимых багов в инфраструктуре ChatGPT демонстрирует важность нетрадиционных подходов к отладке. Популяционный анализ сбоев позволил выявить ошибку, которая оставалась незамеченной 18 лет. Это подчеркивает, что даже в зрелых проектах могут скрываться редкие, но критичные дефекты. Для разработчиков и администраторов систем этот случай служит напоминанием о необходимости анализировать сбои в совокупности, а не по отдельности. Исправление бага в GNU libunwind — шаг к более надежному программному обеспечению для всех.