Ara

Yenilikçi Hacker’dan Bellek Gecikmesine Dev Çözüm: Performans Uçurumu Yaratıyor Ama Bedeli Ağır!

Teknoloji dünyasında çığır açabilecek bir yöntem, bellek erişimindeki en kötü senaryo gecikmelerini %93'e varan oranlarda azaltmayı başarıyor. Ancak bu etkileyici gelişmenin ciddi yan etkileri de bulunuyor. Kullanıcı adı LaurieWired olan bir araştırmacı tarafından geliştirilen bu yeni yaklaşım, özellikle "kuyruk gecikmesi" olarak adlandırılan, nadir yaşanan ancak yüksek maliyetli bellek erişim gecikmelerine karşı hassas olan belirli iş yükleri ve kullanım senaryoları için büyük önem taşıyor. TailSlayer adını taşıyan bu proje, temel olarak bellek erişimlerini daha güvenli hale getirerek DRAM yenileme duraklamalarını engellemeye dayanıyor.

Hepimizin kullandığı DRAM (Dinamik Rastgele Erişim Belleği) teknolojisinin temel bir dezavantajı bulunuyor: Sürekli olarak yenilenmesi gerekiyor. DRAM'in veriyi depoladığı hücreler, doğası gereği sızdıran küçük kapasitörlerdir. Bu nedenle, verinin doğru şekilde saklanabilmesi için bu kapasitörlerin şarjlarının sürekli olarak doldurulması gerekir. Bu işleme "DRAM Refresh" denir. Yenileme döngüsünün sıklığı sisteme ve kullanılan DRAM türüne göre değişiklik gösterse de, genellikle mikrosaniye düzeyinde ölçülür. Bu da, göz kırpma süreniz boyunca belleğinizin yüzlerce kez yenilendiği anlamına gelir.

DRAM yenileme işlemleri, bellek erişimleriyle senkronize olarak gerçekleşmez. Bu durum, sisteminizin o anda yenilenmekte olan belleğe erişmeye çalışması riskini doğurur. Böyle bir durumda, istek yenileme döngüsü tamamlanana kadar beklemek zorunda kalır. Bu da yüzlerce nanosaniyelik bir gecikmeye neden olabilir. Mutlak değerler açısından uzun bir süre olmasa da, modern çip hızlarında 200 nanosaniyelik bir gecikme bile, bir CPU çekirdeğinin herhangi bir işlem yapamadığı binlerce döngüye denk gelebilir.

Çoğu kullanım durumu için bu durum büyük bir sorun teşkil etmez. Çünkü bu tür gecikmelerle başa çıkmak için çeşitli stratejiler geliştirilmiştir. DRAM'in icat edildiği 1960'lardan beri bilinen bu sorun, sayısız akıllı insan tarafından çözümler üretilerek aşılmıştır. Ancak, bellek gecikmesindeki tutarsızlıklara son derece duyarlı olan bazı özel iş yükleri için bu DRAM yenileme duraklamaları, tam da bu tür davranışların önemli bir kaynağıdır.

Peki, bu soruna ne gibi bir çözüm getirilebilir? LaurieWired, muhtemelen "ilginç olduğu için" gibi nedenlerle bu probleme odaklanmış durumda. İlk fikirleri, DRAM yenilemelerini tahmin etmeye ve bunlarla senkronize olmaya çalışmaktı; ancak bu, çeşitli nedenlerle tamamen imkansız hale geldi. Sonraki fikri paralellik üzerineydi, ancak CPU önbelleği ve yeniden sıralama tamponları (bu tür sorunları büyük ölçüde ortadan kaldıran CPU özellikleri) nedeniyle bu da engellendi.

Araştırmacının asıl atılımı, bu işlemlerin hepsini tek bir CPU çekirdeğinde yapmak zorunda olmadığını fark etmesiyle gerçekleşti. Sonunda, çalışma kümesini bellek adresleme sınırları boyunca tamamen kopyalamayı seçti. Her kopyanın farklı bir fiziksel bellek kanalında ve bağımsız zamanlama davranışına sahip olmasını sağladı. Ardından, işlemleri iki farklı CPU çekirdeğinde eşzamanlı olarak çalıştırdı ve her biri farklı bir bellek kanalına erişti. Böylece, hangisinin önce bittiğini görerek ilk sonucu alabiliyordu. Bir çekirdek DRAM yenileme aralığına denk gelse bile, diğer çekirdeğin de aynı anda denk gelme olasılığı oldukça düşüktü. Bu yöntem, ev tipi Ryzen masaüstü sistemindeki DRAM erişimlerinin kuyruk gecikmesini yarıdan fazla azaltmayı başardı ki bu oldukça etkileyici bir rakam.

Amazon AWS örneklerinde sunucu kiralayarak, üst düzey AMD, Intel ve Arm sunucu donanımlarında testler yapma imkanı buldu. Bu makinelerde çok daha büyük sonuçlar elde etmesinin birkaç nedeni vardı: Daha yavaş CPU saat hızlarına, daha yavaş belleğe ve daha muhafazakar bellek zamanlamalarına sahiptiler, bu da duraklamaların performans için daha da kötüleştiği anlamına geliyordu. Ancak asıl fark, mevcut bellek kanallarının sayısında ortaya çıktı. Bir EPYC Turin işlemcisi, on iki bellek kanalına sahiptir ve bu on iki kanalın tümünde stratejisini uygulayarak, en kötü durum bellek gecikmesini (kuyruk gecikmesini) inanılmaz bir şekilde %89 oranında düşürmeyi başardı.

Bu akıllı araştırmacı, Intel ve Arm donanımlarında daha da iyi sonuçlar elde etti. Intel'in Sapphire Rapids ve Diamond Rapids ailesinden Xeon işlemcilerinde %93.3'e varan kazançlar elde etmeyi başardı. Başka bir deyişle, P99.99 bellek gecikmesini 1697ns'den 113ns'ye düşürdü. Grafiklerdeki en düşük değerin yaklaşık 105ns olduğu düşünüldüğünde, Xeon'un inanılmaz derecede deterministik bellek gecikmesi elde ettiği söylenebilir.

TailSlayer'dan "belirli iş yüklerinin" fayda sağladığını birkaç kez belirttim. Bellek gecikmesindeki determinizmin kesinlikle kritik olduğu en bariz alan, yüksek frekanslı alım satım (HFT) dünyasıdır. Hifizikli algoritmaların birbirleriyle saniyeden daha kısa sürelerde alım satım yapma yarışı gibi düşünebilirsiniz. HFT firmaları, borsanın eşleştirme motoruna yakın konumlandırılmış sunucular için astronomik paralar harcayarak, özel donanımlar, fiber optik yerine mikrodalga bağlantılar ve aşırı optimize edilmiş kodlarla saniyelerin kesirlerini kazanmaya çalışır.

Bu sistemler o kadar sıkı toleranslarla çalışır ki, bir bellek erişimi DRAM yenileme döngüsüne denk gelirse, elde edilecek fırsat büyük ihtimalle kaçırılır ve bu da firmaya milyonlarca dolara mal olabilir. Bu nedenle, HFT dünyası, bu tür teknolojilerin kullanılabileceği en bariz yerdir ve neredeyse tek mantıklı yeridir. DRAM yenileme duraklamalarını ortadan kaldırmaktan fayda sağlayan başka iş yükleri de elbette mevcuttur; yüksek sorgu/saniye (QPS) mikroservisleri, eşleştirme motorları, gerçek zamanlı sıralama yapıları, eşzamanlı kuyruk kullanan her şey ve hatta özellikle yüksek hassasiyetle çalışan simülatörler veya oyun sunucuları bile bu kapsama girebilir.

Birçok okuyucunun da fark edeceği gibi, TailSlayer'ı bu iş yüklerinin çoğu için kullanmanın en büyük dezavantajı, Laurie'nin yönteminin, üzerinde işlem yaptığınız her bellek kanalı için uygulamanın çalışma kümesini tam olarak kopyalamasını gerektirmesidir. Bu, gecikme determinizmi için bellek kapasitesini ve CPU çekirdeklerini feda etmek anlamına gelir. Bu durum, herhangi bir uygulama için bellek gereksinimlerini, yaptığınız güven sayısıyla çarpmak demektir. Bazı görevler için - yine HFT örneğinde olduğu gibi - gerçek bellek gereksinimleri oldukça mütevazıdır ve bu nedenle bellek kullanımında on iki kat artışı, P99.99 bellek gecikmesinde 15 kat düşüş karşılığında kabul etmek mantıklıdır. Ancak çoğu iş yükü için bu durum geçerli değildir.

LaurieWired, 54 dakikalık videosunda bu konuya değiniyor. Genel olarak, TailSlayer'ı geliştirmiş olmaktan duyduğu memnuniyeti dile getirirken, aynı zamanda sınırlı kullanışlılığı konusunda da oldukça açık sözlü. Videosu, bellek karıştırma davranışının tersine mühendisliğini yapmak ve x86-64 CPU'ların sunduğu donanım sayaçlarının aynı seviyesini sunmayan Arm tabanlı Amazon Graviton CPU'larında yöntemi çalışır hale getirmek gibi yaptığı araştırmaları ayrıntılı olarak ele alıyor. Konuya ilgi duyanlar için videoyu izlemesi şiddetle tavsiye edilir. Alternatif olarak, demo kodunu incelemek için GitHub deposuna göz atabilirsiniz.

Önceki Haber
Tesla'da Floppy Disk Devri: 3.5 İnçlik Sürücüyle MP3 Çalma Başarısı!
Sıradaki Haber
Crimson Desert'a Zorluk Seçenekleri ve Boss Tekrar Karşılaşmaları Geliyor!

Benzer Haberler: