Bilgisayarımın Kendi Kendini Yeniden Başlattığı Gece
Bir gece, uzun bir işin tam ortasında, bilgisayarımın tamamı kendiliğinden kapanıp tekrar açıldı. Program değil — makinenin kendisi. Bir an bir süreç çalışıyordu; sonraki an karşımda tertemiz bir giriş ekranı vardı, sanki biri güç kablosunu çekip yeniden takmış gibi.
Önemli olduğundan emin olduğum tek kaynak konusunda günlerimi dikkatli olarak geçirmiştim. Çökme, izlemeyi hiç aklıma getirmediğim kaynaktan geldi.
Mesajsız çökme
En rahatsız edici kısmı, okunacak ne kadar az şey olmasıydı. Yığın izi yok, istisna yok, sonu işaretleyen bir günlük satırı yok. Sadece ani bir yeniden başlatma ve işletim sisteminin kendi kayıtlarına gömülmüş, bir omuz silkmenin dijital karşılığı: sistem temiz bir şekilde kapatılmadan yeniden başlatıldı.
Normal bir hata geride bir ceset bırakır. Bu, boş bir oda bıraktı. Ve mesajı olmayan bir hata kendine özgü bir tür ipucudur — genellikle arızanın programınızın altında bir yerde, her şeyi de yanında devirmeden önce açıklama yapmak için durmayan bir katmanda gerçekleştiği anlamına gelir.
Yanlış belleği bütçelemiştim
GPU üzerinde çok büyük bir iş yığını çalıştırıyordum ve o yığını özenle boyutlandırmıştım — GPU’nun belleğine karşı. Kartın ne kadar VRAM’i olduğunu biliyordum, her bir iş biriminin yaklaşık ne kadar tutacağını biliyordum ve tavanın güvenli bir şekilde altında kalmak için hesabı yapmıştım. Bana kalırsa bellek çözülmüş bir sorundu.
Yanlış bellek için çözülmüştü. Kartın VRAM’i baştan sona iyiydi; çökme anında ölçeğini izliyor olsaydım, kusursuz şekilde sakin görünürdü. Asıl çarptığım tavan ana makinenin sistem RAM’iydi — bilgisayarın geri kalanının üzerinde çalıştığı sıradan bellek — ve onu hiç bütçelememiştim, çünkü zihinsel modelimde kısıtlama o değildi, o kadar.
Ana makinenin RAM’i nereye gitti
Bir GPU’ya devasa bir iş yığını göndermek ana makine tarafında bedava değildir. GPU herhangi bir şey çalıştırabilmeden önce işin hazırlanması, kurulması ve karşıya devredilmesi gerekir — ve o hazırlık sistem RAM’inde yaşar. O kurulumun her bir parçası kendi başına mütevazıydı. GPU’yu doyuracak kadar büyük bir yığın boyunca çarpıldığında, mütevazı parçalar üst üste binerek devasa bir şeye dönüştü.
Sistem RAM’i doldu. İşletim sistemi, bellek azaldığında yaptığı şeyi yaptı — diske taştı ve sonra ondan da yetersiz kaldı. Ciddi bellek baskısı her zaman yakalanabilir bir istisnayla kendini duyurmaz. Başarısız bir tahsis, öldürülmüş bir süreç ya da kararsızlaşan bütün bir makine anlamına gelebilir. Benimki yeniden başlatacak kadar sert bir şekilde kararsızlaştı.
Bunu neden hiç öngöremedim
Geriye dönüp bakınca sinir bozucu olan şey, gerçekten de dikkatle izliyor olmamdı — sadece yanlış göstergeyi izliyordum. Gözlerim optimize ettiğim, üzerine kafa yorduğum ve kendimi zeki hissettiğim kaynak olan GPU’daydı. Tüm bu süre boyunca baskı, bakmak için hiçbir nedenim olmayan bir yerde birikiyordu, çünkü sorunun orada olmayacağına çoktan karar vermiştim.
Bu, artık tesadüf diyemeyeceğim kadar çok kez gördüğüm bir örüntü: düşündüğünüz kısıtlamayı enstrümante edersiniz ve düşünmediğinize karşı körleşirsiniz. Hata saklanmaz. Sınırın nerede olduğu konusunda kendinden emin olarak kendi inşa ettiğiniz bir kör noktada oturur.
Çözüm: duvarı bekle ve ondan sek
Onarım daha iyi bir hesaplama değildi. Güvenli boyutu önceden hesaplayabileceğim fikrinden vazgeçmekti. Makinenin hayatta kalabileceği yığının tam olarak ne kadar büyük olduğunu tahmin etmek yerine, makinenin bana söylemesine izin verdim: yığını dene ve eğer kurtarılabilir bir bellek hatasıyla karşılaşırsa, bunu geri çekilmek için bir sinyal olarak ele al — iş yükünü ihtiyatlıca azalt ve yeniden dene, sığana kadar küçült.
Mütevazı küçük bir döngü ve özenli aritmetiğimin hiç olamadığı kadar sağlam, tam da önceden her gizli maliyeti anlamış olmama bağlı olmadığı için. Artık duvarın tam olarak nerede olduğunu bilmeme gerek yok; kurtarılabilir bellek hataları için süreç, çalıştığı her donanımda elle yoklayarak işe yarar bir boyut bulabilir. O geceki gibi ana makine düzeyinde tükenme daha zor bir durum — yine de sadece bir yeniden deneme döngüsü değil, dışsal sınırlar ve izleme gerektirir.
Kaynak varsayımları olana dek sessizdir
Edindiğim ders özellikle GPU’larla pek ilgisi olmayan bir şey. O ders şu: kaynak varsayımları tam felaket oldukları ana kadar görünmezdir. Hayalini kurduğunuz sınır konusunda tam isabetli olabilir ve yine de kurmadığınız sınır yüzünden çökebilirsiniz — ve arıza geldiğinde çoğu zaman hiçbir açıklama olmadan gelir, çünkü kırılan katman, hata mesajlarınızın yaşadığı katmanın altındadır.
Bu yüzden kaynaklar konusunda kesin olmaya çalışmayı bıraktım ve onlar konusunda savunmacı olmaya çalışmaya başladım. Kesinlik bütün maliyetleri bildiğinizi varsayar. Savunmacılık en az birini kaçırdığınızı varsayar. Saatlerce, gözetimsiz, tam olarak kontrol etmediğiniz bir bellek üzerinde çalışması amaçlanan bir sistemde, ikinci varsayım tek güvenli olandır.
Çöken bir program size bir mesaj bırakır. Yeniden başlayan bir makine size bir sessizlik bırakır. O sessizliği, donanımımın bana söylediği en dürüst şeylerden biri olarak görmeye başladım: yanlış şeyi bütçeliyordun.
— Sinyal yok, getiri yok, yatırım tavsiyesi değildir.