Cloudflare neden popüler olmayan öğeleri bile bellekte önbelleğe alıyor?
(blog.cloudflare.com)Cloudflare, önbellek stratejisini değiştirerek SSD yazma yükünü %25'e kadar azaltma deneyimini blogunda paylaştı. (İngilizce) Yaygın kanının aksine Cloudflare, erişim sıklığı yüksek olmayan öğeleri bile bilerek bellekte önbelleğe alarak bu hedefe ulaştı.
SSD'ler yazmaya karşı hassas depolama ortamlarıdır. SSD'lerde veriyi saklayan flash bellek hücrelerinin yeniden yazılabilirlik sayısı sınırlıdır; ayrıca bir kez yazılmış içeriği silip yeniden yazmak görece uzun sürmekle kalmaz, okuma işlemlerini de beraberinde yavaşlatır. Bu nedenle SSD'lerde özellikle yazma işlemlerini azaltmak önemli bir optimizasyondur.
Cloudflare, sunucularında çok sayıda yüksek performanslı NVMe SSD kullanan bir şirket olduğu için doğal olarak bu konu üzerine düşündü. Cloudflare bir CDN şirketi; CDN de özünde büyük bir ağ önbelleği sayılabilir. Cloudflare sunucularının SSD'lerine yazılan içerikler de sonuçta önbelleğe alınmış öğelerdir ve gözlemler, bunların arasında önbelleğe alındıktan sonra bir daha hiç erişilmeyen içeriklerin (namıdiğer “one-hit wonder”) oldukça fazla olduğunu gösterdi. Bu yüzden böyle öğeleri SSD'ye yazmamak daha iyi olacaktır. Yalnızca 1 kez erişilen öğeleri SSD'ye yazmama yaklaşımı denendiğinde, SSD gecikmesinin neredeyse %5 azaldığı gibi cesaret verici bir sonuç elde edildi.
Sorun, bu fikrin gerçek hizmet ölçeğinde nasıl uygulanabileceğiydi. İlk erişimde önbelleğe almamak, ancak ikinci erişimden itibaren önbelleğe almak; veri kaynağına yapılan erişim miktarının 2 katına çıkması anlamına gelir. Doğal olarak bunun çeşitli maliyetleri olacaktır ve bu da amaca ters düşer. Bu yüzden Cloudflare, önbellek yazımını iki aşamalı olarak katmanlandırdı. Önce tüm öğeler "kısa süreli önbellek" olan belleğe alınır, ardından birden fazla kez erişilen öğeler "kalıcı önbellek" olan SSD'ye "terfi ettirilerek" yazılır. Böylece erişim sıklığı düşük öğeler doğal olarak önbellekten düşer. Okuma tarafı için ayrıca bir şey yapmaya gerek yoktu. Çünkü SSD'den okunan veriler zaten işletim sistemi tarafından iyi şekilde önbelleğe alınıyordu.
Elbette bu yaklaşımın gerçek hizmete uygulanması dikkatli ve muhafazakâr biçimde yapılıyor. Bu fikir temelde çok fazla bellek tüketecektir; bu da işletim sisteminin mevcut önbelleğiyle rekabete girebilir ya da sunucu süreci kesintisiz dağıtım yöntemiyle güncellenirken geçici bellek yetersizliği yaratıp sonuçta hizmet kalitesini düşürebilir. Bu nedenle söz konusu fikir, yalnızca yeni eklenen belleği yeterli olan sunucularda uygulanacak şekilde kademeli olarak devreye alınıyor.
Uygulamanın sonuçları olumlu. Önbellek kapasitesi ayarlanarak yapılan uygulamada SSD yazmaları %20'den en fazla %25'e kadar azaldı ve bu da gecikmenin düşmesine yol açtı. Bundan sonra Cloudflare'ın bu tekniği daha fazla sunucuya yayması, terfi algoritmasını geliştirip "tenzil" mekanizmasını da eklemesi ve yalnızca SSD'yi değil HDD'leri de kapsayan katmanlı bir yapı kurması planlanıyor.
Bu fikri görünce akla ilk gelen şey Java'nın çöp toplama tekniği oldu. Çoğu çöp toplama yaklaşımının temel varsayımı, yani sözde [çoğu nesne yalnızca çok kısa bir süre kullanılır] anlamına gelen 'weak generational hypothesis', tam da bunu söyler. Yukarıdaki içerik de bu ilkenin dönüştürülmüş bir uygulaması gibi görünüyor.
3 yorum
Güzel yazı için teşekkürler.
Cloudflare blogunda, fark edilmeden okunabilecek epey fazla yazı yayımlanıyor gibi görünüyor.
İyi bir şirket teknik blogu nasıl işletilir? https://tr.news.hada.io/topic?id=1698
Sanırım Cloudflare'da blog yazmak şirket içi kültürün bir parçası hâline gelmiş.
Çok ilginçti, teşekkürler.
Vay.. tek seferde çeviri bile yapmışsınız haha Güzel içeriği paylaştığınız için teşekkürler.