OpenAI Mühendisleri 18 Yıllık GNU libunwind Hatasını ve Donanım Arızasını Nasıl Buldu?
OpenAI mühendisleri, ChatGPT altyapısındaki Rockset hizmetinde meydana gelen nadir çökmeleri büyük ölçekli çekirdek dökümü analizi ile çözdü. İki farklı sorun tespit edildi: bir Azure sunucusunda sessiz donanım bozulması ve 18 yıllık bir GNU libunwind yarış koşulu.
Gizemli Çökmelerin Başlangıcı
OpenAI mühendisleri, ChatGPT'nin veri altyapısının kritik bir bileşeni olan Rockset hizmetinde birkaç ay önce açıklanamayan çökmeler gözlemledi. Rockset, 2024 yılında OpenAI tarafından satın alınmış, C++ ile yazılmış bulut tabanlı bir veri sistemidir ve ChatGPT'nin sohbet geçmişinde arama yapmasına olanak tanır. Çökmeler sırasında normal C++ fonksiyonları tamamlanıp geçersiz bir adrese dönüyordu. Bazı durumlarda yığındaki dönüş adresi NULL iken, bazılarında yığın işaretçisi (stack pointer, %rsp) 8 bayt kaymıştı. Bu tür hatalar, uygulama kodunda son derece nadirdir ve 'imkansız' olarak nitelendirilir. Mühendisler, bu çökmelerin kaynağını bulmak için kapsamlı bir araştırma başlattı. İlk yaklaşımları, bir doktor gibi tek bir çökmeyi derinlemesine incelemekti, ancak bu yöntem yetersiz kaldı.
İki Ayrı Sorunun Keşfi
Başlangıçta tüm çökmelerin tek bir nedenden kaynaklandığı düşünülüyordu. Ekip, çekirdek dökümlerini (core dump) otomatik olarak analiz eden bir veri hattı oluşturarak büyük bir veri seti elde etti. ChatGPT tarafından yazılan bir betik, her çekirdek dökümünün ön ekinden kayıtları çıkardı, bilinen yanlış pozitifleri filtreledi ve çökmeleri 'return-to-null' (NULL'a dönüş) veya 'misaligned-stack' (kaymış yığın) olarak etiketledi. Bu veri seti, çökmelerin aslında iki farklı popülasyondan oluştuğunu ortaya çıkardı. 'Return-to-null' çökmeleri birçok bölgeye yayılmışken, 'misaligned-stack' çökmeleri yalnızca tek bir Azure bölgesinde ve belirli bir tarihten sonra ortaya çıkıyordu. Daha detaylı inceleme, misaligned-stack çökmelerinin tek bir fiziksel sunucudaki donanım arızasından kaynaklandığını gösterdi. Bu sunucuda CPU matematik işlemlerini doğru yapmıyordu. Sunucu hizmet dışı bırakıldığında, bu tür çökmeler tamamen durdu. OpenAI, benzer durumların tekrarlanmasını önlemek için sinyal işleyiciyi iyileştirdi ve sanal makinelerin geri dönüştürülmesi yerine yeniden kullanılmasını sağlayan bir kontrol düzlemi değişikliği yaptı.
18 Yıllık GNU libunwind Hatası
Donanım kaynaklı çökmeler ayrıştırıldıktan sonra, kalan 'return-to-null' çökmeleri incelendi. Bu çökmelerin, C++ istisna işleme (exception handling) sırasında meydana geldiği tespit edildi. OpenAI, GNU libunwind kütüphanesinin bir sürümünü kullanıyordu ve bu kütüphanede 18 yıllık bir yarış koşulu (race condition) bulunuyordu. _Ux86_64_setcontext fonksiyonunda, yığın işaretçisi (%rsp) güncellendikten sonra, sinyal teslimi (signal delivery) sırasında yığında geçici olarak saklanan verilerin üzerine yazılabiliyordu. Bu, dönüş adresinin NULL olmasına ve çökmelere yol açıyordu. Yarış penceresi sadece bir talimat genişliğindeydi (yaklaşık 100 pikosaniye), ancak Rockset'in yüksek istisna ve sinyal oranı bu hatayı operasyonel olarak görünür kılmıştı. Rockset, saniyede binlerce istisna atıyor ve her birkaç milisaniyede bir SIGUSR2 sinyali alıyordu. Bu, günde bir düzineden fazla çökmeye neden oluyordu. Hata, GNU libunwind'in x86_64 desteği eklediği ilk sürümden beri mevcuttu, ancak daha önce hiçbir sistemde bu kadar yüksek istisna ve sinyal oranı bir araya gelmemişti.
Çözüm ve Alınan Dersler
OpenAI, hemen GNU libunwind yerine libgcc'nin unwind kütüphanesine geçerek sorunu çözdü. libgcc, daha az kilit çekişmesi (lock contention) ile büyük sanal makinelerde daha iyi performans sağlıyordu. Ayrıca, GNU libunwind projesine hatayı düzelten bir yama gönderildi ve diğer unwind kütüphanelerinin benzer bir sorun içermediği doğrulandı. Bu deneyim, büyük ölçekli sistemlerde hata ayıklamanın en önemli adımının yüksek kaliteli veri toplamak olduğunu gösterdi. Ekip, otomatik analiz araçları ve derin enstrümantasyon sayesinde 'imkansız' görünen sorunları çözülebilir hale getirdi. OpenAI, bu süreçte dinamik bağlama, DWARF unwind meta verileri, Linux sinyal teslimi ve System V ABI gibi konularda derin teknik bilgiler edindi.
Neden Önemli?
Bu vaka, Türkiye'deki yapay zeka ve yazılım şirketleri için kritik dersler içeriyor. Büyük ölçekli sistemlerde, nadir görülen hataların birden fazla kaynağı olabilir ve bunları ayırt etmek için kapsamlı veri analizi şarttır. OpenAI'nin kullandığı epidemiyolojik yaklaşım, sadece birkaç örneğe odaklanmak yerine tüm popülasyonu incelemeyi öneriyor. Türk teknoloji firmaları, özellikle C++ gibi düşük seviyeli dillerle çalışırken, kütüphane güncellemelerini ve donanım sağlığını düzenli olarak izlemeli, otomatik hata raporlama sistemleri kurmalıdır. Ayrıca, açık kaynak kütüphanelerdeki uzun süreli hataların belirli koşullar altında ortaya çıkabileceği unutulmamalıdır. Türkiye'deki girişimler, bu tür derinlemesine hata ayıklama yeteneklerini geliştirerek, küresel rekabette önemli bir avantaj elde edebilir.