Ders 12 / 14
Yönetilen Önbellek Servisi
Bellek içi katmanın hizmet olarak kiralanmasının ölçülmesi: iki ölçekleme ekseninin aynı isabeti ve aynı faturayı vermesi, yüzde yüz isabetin en pahalı satır çıkması, bir düğüm değiştiğinde giden üç milyon üç yüz yetmiş bin anahtarın satın alınan kapasiteyi yüzde üç yüz yirmi beş aşması, ısınmanın parça sayısıyla kısalmaması, ve başka alandaki önbelleğin yedi yüz yirmi iki birimlik aktarım kalemi yazıp önbelleksiz düzenden pahalıya gelmesi.
İçindekiler
Bir önceki ders erişim örüntüsünü genişletti: ikincil dizin ve değişim akışı, bölüm anahtarının kapattığı sorguların bir bölümünü geri açtı. Ama açılan her sorgu hâlâ veri katmanına iniyor.
Bellek içi depolar ve tahliye politikaları daha önce ölçüldü; bu ders o mekaniği tekrarlamaz. Burada bellek içi katman kiralanan bir hizmettir ve ölçülen üç şey ölçekleme biriminin ne olduğu, bir düğüm değiştiğinde ne gittiği ve önbelleğin nerede durduğunun faturaya ne yazdığıdır.
- YV25. Kurgu bölgesel ölçüm ağının okuma kümesi üç ailedir: sayaç son okuması (2,4 milyon anahtar, 180 bayt), fatura özeti (600 bin, 2.400 bayt), iş emri kaydı (4 milyon, 600 bayt); toplam 4,272 GB.
- YV26. Her aile üç popülerlik dilimiyle modellenir. Model önbelleği anahtar başına olasılık sırasına göre doldurur, ilk dokunuş ıskalarını saymaz, rastgelelik kullanmaz.
- YV27. Okuma ortalama dört yüz, tepede üç bin istek/s; ayrıca sürekli dört yüz istek/s yazma vardır ve yazma önbelleğe uğramaz. Bir ay 2.592.000 saniye sayılır.
- YV28. Fiyatlar kurgudur, para biriminin adı birimdir: önbellek düğümü GB başına ayda altmış birim; okuma kapasitesi yüz istek/s adımıyla satın alınır, adım ayda otuz birimdir. Sağlayıcı düğüm belleğinin yüzde yetmiş beşini kullanıma açar.
- YV29. Gecikmeler kurgudur: veri katmanı 6 ms, aynı alandaki yönetilen önbellek 0,8 ms, başka alandaki 1,9 ms, süreç içi 0,02 ms. Alanlar arası aktarım GB başına bir birimdir.
- YV30. Sayaç toplayıcısı dakikalık toplamayı önbellekte biriktirip beş saniyede bir boşaltır; önbellek kopyasının gecikmesi 0,25 saniyedir. İkisi de kurgudur.
// onbellek/onbellek.mjs — model: bellek ici katman hizmet olarak kiralandiginda ne degisiyor. // Tahliye politikalari M17/K06'da olculdu, tekrarlanmaz. Is kumesi populerlik dilimleriyle // modellenir, rastgelelik yok; fiyatlar kurgudur ve 1 GB = 1e9 bayt sayilir. const DILIM = [ // [aile, dilim, anahtar, bayt, erisim payi] ["sayac", "sicak", 150000, 180, 0.15], ["sayac", "ilik", 850000, 180, 0.20], ["sayac", "soguk", 1400000, 180, 0.16], ["fatura", "sicak", 18000, 2400, 0.10], ["fatura", "ilik", 140000, 2400, 0.09], ["fatura", "soguk", 442000, 2400, 0.04], ["isemri", "sicak", 80000, 600, 0.06], ["isemri", "ilik", 620000, 600, 0.10], ["isemri", "soguk", 3300000, 600, 0.10], ]; const SIRA = [...DILIM].sort((a, b) => b[4] / b[2] - a[4] / a[2]); // anahtar basina olasilik const doldur = (kap) => { // onbellek en cok istenen anahtardan baslayarak dolar let kalan = kap, anahtar = 0, isabet = 0; const tutulan = []; for (const [, , n, b, pay] of SIRA) { const alinan = Math.min(n, Math.floor(kalan / b)); if (alinan === 0) break; kalan -= alinan * b; anahtar += alinan; isabet += pay * alinan / n; tutulan.push([pay * alinan / n, pay / n]); // [tutulan pay, anahtar basina olasilik] } return { anahtar, isabet, tutulan }; }; const TEPE = 3000, YAZMA = 400, ORAN = 0.75, GB_UCRET = 60; const ucret = (inen) => Math.ceil((inen + YAZMA) / 100) * 30; const sutun = (E, sol = 1) => (h) => h.map((d, i) => String(d)[i < sol ? "padEnd" : "padStart"](E[i])).join(""); const y1 = sutun([14, 5, 16, 14, 11, 15, 10, 8, 15]); console.log(y1(["dugum x GB", "GB", "kullanilabilir", "anahtar(bin)", "isabet(%)", "inen(istek/s)", "kapasite", "dugum", "toplam(birim)"])); for (const [ad, d, g] of [["onbellek yok", 0, 0], ["1 x 1", 1, 1], ["1 x 2", 1, 2], ["2 x 1", 2, 1], ["1 x 4", 1, 4], ["1 x 8", 1, 8]]) { const o = d ? doldur(d * g * 1e9 * ORAN) : { anahtar: 0, isabet: 0 }; const inen = Math.round(TEPE * (1 - o.isabet)); const kap = ucret(inen), dug = d * g * GB_UCRET; console.log(y1([ad, d * g, (d * g * ORAN).toFixed(2), (o.anahtar / 1e3).toFixed(0), (o.isabet * 100).toFixed(1), inen, kap, dug, kap + dug])); } // --- Bir dugum degistiginde ------------------------------------------------------ // 2 GB duzen. Karma anahtar adini dagittigi icin her parca her dilimden esit pay alir. const D = doldur(2 * 1e9 * ORAN), INEN = Math.round(TEPE * (1 - D.isabet)) + YAZMA; const ALINAN = ucret(INEN - YAZMA) / 30 * 100, BEKLEYEN = YAZMA * 5, GECIKME = 0.25; const y2 = sutun([14, 18, 16, 15, 10, 15]); console.log("\n" + y2(["parca", "kaybolan anahtar", "kaybolan erisim", "inen(istek/s)", "asim(%)", "bekleyen kayit"])); for (const [p, kopyali] of [[1, 0], [2, 0], [4, 0], [8, 0], [16, 0], [4, 1]]) { const anahtar = Math.round((kopyali ? INEN * GECIKME : D.anahtar) / p); const pay = kopyali ? 0 : D.isabet / p; const inen = Math.round(TEPE * (1 - D.isabet + pay)) + YAZMA; console.log(y2([kopyali ? `${p} (kopyali)` : p, anahtar, (pay * 100).toFixed(1), inen, ((inen / ALINAN - 1) * 100).toFixed(0), Math.round((kopyali ? YAZMA * GECIKME : BEKLEYEN) / p)])); } const donen = (t) => D.tutulan.reduce((a, [pay, r]) => a + pay * (1 - Math.exp(-r * TEPE * t)), 0); const isinma = (oran) => { let alt = 1, ust = 1e6; for (let k = 0; k < 60; k++) { const t = Math.sqrt(alt * ust); if (donen(t) < oran * D.isabet) alt = t; else ust = t; } return ust.toFixed(0); }; console.log(`isinma, parca sayisindan bagimsiz: %50 ${isinma(0.5)} s, %90 ${isinma(0.9)} s`); // --- Onbellek nerede duruyor ----------------------------------------------------- const VERI_MS = 6, ALAN_UCRET = 1, AY = 2592000; // ms; alanlar arasi birim/GB; saniye/ay const ORT_BAYT = DILIM.reduce((a, [, , , b, pay]) => a + b * pay, 0); const y3 = sutun([10, 26, 11, 14, 11, 11, 10, 15], 2); const satir = (kume, ad, h, ms, okuma, bayt, tepe, yazma, onbellek, uzak) => { const inen = Math.round(tepe * (1 - h)); const kapasite = Math.max(1, Math.ceil((inen + yazma) / 100)) * 30; const aktarim = (uzak ? h * okuma * bayt / 1e9 : 0) * ALAN_UCRET; console.log(y3([kume, ad, (h * 100).toFixed(1), (ms + (1 - h) * VERI_MS).toFixed(2), onbellek, kapasite, aktarim.toFixed(0), (onbellek + kapasite + aktarim).toFixed(0)])); }; console.log("\n" + y3(["kume", "duzen", "isabet(%)", "gecikme(ms)", "onbellek", "kapasite", "aktarim", "toplam(birim)"])); const TAM = (ad, h, ms, onbellek, uzak) => satir("tam kume", ad, h, ms, 400 * AY, ORT_BAYT, TEPE, YAZMA, onbellek, uzak); TAM("onbellek yok", 0, 0, 0, false); TAM("surec ici 12 x 256 MB", doldur(256e6).isabet, 0.02, 0, false); TAM("yonetilen 2 GB ayni alan", D.isabet, 0.8, 2 * GB_UCRET, false); TAM("yonetilen 2 GB baska alan", D.isabet, 1.9, 2 * GB_UCRET, true); // Tarife tablosu: 20 bin anahtar x 2000 bayt = 40 MB, ayda 320 milyon okuma, tepe 900/s. const TAR = (ad, h, ms, onbellek, uzak) => satir("tarife", ad, h, ms, 320e6, 2000, 900, 0, onbellek, uzak); TAR("surec ici 12 x 40 MB", 1, 0.02, 0, false); TAR("yonetilen 1 GB ayni alan", 1, 0.8, GB_UCRET, false); TAR("yonetilen 1 GB baska alan", 1, 1.9, GB_UCRET, true);
dugum x GB GB kullanilabilir anahtar(bin) isabet(%) inen(istek/s) kapasite dugum toplam(birim) onbellek yok 0 0.00 0 0.0 3000 1020 0 1020 1 x 1 1 0.75 1476 63.8 1085 450 60 510 1 x 2 2 1.50 3370 87.0 390 240 120 360 2 x 1 2 1.50 3370 87.0 390 240 120 360 1 x 4 4 3.00 4880 93.6 193 180 240 420 1 x 8 8 6.00 7000 100.0 0 120 480 600 parca kaybolan anahtar kaybolan erisim inen(istek/s) asim(%) bekleyen kayit 1 3370000 87.0 3400 325 2000 2 1685000 43.5 2095 162 1000 4 842500 21.8 1442 80 500 8 421250 10.9 1116 40 250 16 210625 5.4 953 19 125 4 (kopyali) 49 0.0 790 -1 25 isinma, parca sayisindan bagimsiz: %50 539 s, %90 3514 s kume duzen isabet(%) gecikme(ms) onbellek kapasite aktarim toplam(birim) tam kume onbellek yok 0.0 6.00 0 1020 0 1020 tam kume surec ici 12 x 256 MB 34.7 3.94 0 720 0 720 tam kume yonetilen 2 GB ayni alan 87.0 1.58 120 240 0 360 tam kume yonetilen 2 GB baska alan 87.0 2.68 120 240 722 1082 tarife surec ici 12 x 40 MB 100.0 0.02 0 30 0 30 tarife yonetilen 1 GB ayni alan 100.0 0.80 60 30 0 90 tarife yonetilen 1 GB baska alan 100.0 1.90 60 30 640 730
İki Eksen, Tek Eğri
Yönetilen önbellek servisi iki ölçekleme kolu sunar: düğümü büyütmek ve düğüm eklemek. Birinci tablo ikisini yan yana koyuyor ve ilk okuma şudur: fark yok. İki GB’a bir düğümle de iki düğümle de varılıyor; ikisinde de önbellekte üç milyon üç yüz yetmiş bin anahtar, isabet yüzde seksen yedi, fatura üç yüz altmış birim. Ölçekleme birimi kararı isabet ve fiyat üzerinden verilemez.
Faturanın kendisi ikinci okumadır. Önbelleksiz düzen bin yirmi birim; bir GB isabeti yüzde altmış üç virgül sekize çıkarıp faturayı beş yüz ona, iki GB üç yüz altmışa indiriyor. Sonra eğri dönüyor: dört GB’da dört yüz yirmi, sekiz GB’da altı yüz. Yüzde yüz isabetli satır iki GB’lık satırdan yüzde altmış yedi pahalıdır; kalan yüz yirmi birim önbelleğe hiç uğramayan dört yüz istek/s yazmaya gidiyor ve onu düşürmenin yolu önbellek değildir.
Kullanılabilir sütunu üçüncü okumadır: sekiz GB satın alındığında altı GB kullanılıyor, aradaki dörtte bir sağlayıcının defterine gidiyor. İş kümesi 4,272 GB olduğuna göre onu tümüyle bellekte tutmak için gereken düğüm dört GB değil, sekiz GB’dır.
Bir Düğüm Değiştiğinde
Düğüm değişimi olağan bir olaydır — sürüm yükseltmesi, yama penceresi ya da arızalı düğümün yerine konması — ve önbellek kalıcı değildir: değişen düğümün belleği boş gelir.
Tek parçalı düzende üç milyon üç yüz yetmiş bin anahtarın tamamı gidiyor. İnen istek yedi yüz doksandan üç bin dört yüze çıkıyor ve satın alınan sekiz yüz istek/s kapasitenin yüzde üç yüz yirmi beş üstüne oturuyor. Bu bir çökme değil, kısılmadır: veri katmanı fazlasını geri çevirir, pano boş döner.
Parça sayısı dalganın yüksekliğini düşürüyor: dört parçada aşım yüzde seksen, on altı parçada yüzde on dokuz. Sayı düşüyor ama hiçbir parça sayısında sıfırlanmıyor. Son satır tek çözümü gösteriyor: her parçaya bir kopya eklendiğinde düğüm değişimi devralmaya dönüşüyor ve giden anahtar kırk dokuza — çeyrek saniyelik kopya gecikmesinde yazılmış anahtarlara — iniyor. Bedeli birinci tabloda okunur: düğüm ücreti yüz yirmiden iki yüz kırka, toplam üç yüz altmıştan dört yüz seksene çıkar.
Son sütun bu dersin geri alınamayan kalemidir. Toplayıcı dakikalık toplamayı önbellekte biriktirip beş saniyede bir yazıyor; her an iki bin kayıt yalnızca bellektedir ve dört parçalı düzende bir düğüm gittiğinde bunların beş yüzü kaybolur. Önbellekteki bir kopya geri getirilebilir, önbellekteki bir asıl getirilemez.
Isınma satırı dalganın uzunluğunu veriyor: erişim payının yarısı beş yüz otuz dokuz, yüzde doksanı 3.514 saniyede geri geliyor. Bu süre parça sayısından bağımsızdır: karma anahtar adını dağıttığı için her parça her popülerlik diliminden aynı oranda pay alır ve bir parçanın ısınma eğrisi bütünün eğrisiyle aynıdır. Bölmek dalganın yüksekliğini düşürür, uzunluğunu düşürmez. Dört parçalı düzende veri katmanı bir saate yakın süre satın alınanın üstünde yük taşır; o pencerenin ne zaman açılacağı senin kararın değildir.
Önbellek Nerede Duruyor
Üçüncü tablonun ilk dört satırı aynı okumayı dört düzende karşılıyor. Yönetilen önbellek aynı alanda durduğunda hem en ucuz hem en hızlıdır: üç yüz altmış birim, 1,58 ms.
Süreç içi önbellek satırı hizmet olmanın ne getirdiğini gösteriyor. On iki uygulama örneğinin her biri iki yüz elli altı MB ayırıyor — toplam üç GB — ve isabet yüzde otuz dört virgül yedide kalıyor; yönetilen önbellek bir buçuk GB kullanarak yüzde seksen yediye çıkıyor. Fark bellek miktarında değil, havuzun tekliğinde: on iki ayrı önbellek aynı anahtarların on iki kopyasını tutar ve her biri yalnız kendi gördüğü isteklerle ısınır.
Dördüncü satır bu dersin aktarım kalemidir. Önbellek başka bir alana konduğunda isabet değişmiyor ve faturaya yedi yüz yirmi iki birimlik yeni bir kalem yazılıyor: ayda bir milyar otuz altı milyon sekiz yüz bin okumanın yüzde seksen yedisi, ortalama sekiz yüz bayt yanıt, GB başına bir birim. Önbellek düğümünün kendisi yüz yirmi birimdir; yanlış alana koymanın bedeli düğümün altı katıdır ve toplam bin seksen iki birim, yani önbelleksiz düzenden pahalı.
Kazandırmadığı Durum
Son üç satır bölge tarife tablosunu ölçüyor: kırk MB, ayda üç yüz yirmi milyon okuma, her düzene tümüyle sığan bir küme. Süreç içi önbellek otuz birime ve 0,02 milisaniyeye mal oluyor; aynı alandaki yönetilen önbellek doksan birim ve 0,80 ms — üç kat pahalı, kırk kat yavaş. Başka alanda yedi yüz otuz birim, yani yirmi dört katı.
Yönetilen önbellek burada hiçbir şey kazandırmıyor: küme zaten her sürecin belleğine sığdığı için paylaşılan havuz gereksizdir, ağ üzerinden erişim saf bedeldir. Kural şudur: yönetilen önbellek, iş kümesi tek sürecin belleğine sığmadığında kazandırır. Süreç içi düzenin bedeli tabloda yok: on iki kopya, on iki ayrı tazelik penceresidir.
Devredilen Karar
Kiralanan kümede kararlar şöyle bölünüyor:
| Grup | Sende | Sağlayıcıda | Yaratılışta sabit |
|---|---|---|---|
| sürüm | motor sürümü, yama penceresi | yamanın zorunlu olduğu an | — |
| bakım | yedekleme açık mı | değişim zamanı, düğüm yenileme, yedeğin yeri | — |
| ölçekleme | düğüm boyutu, parça sayısı, kopya sayısı | kullanılabilir bellek oranı | parça sayısı |
| veri | tahliye politikası, anahtar adlandırması, yaşam süresi | değişimde giden veri | — |
| ağ | kümenin alanı | istemcinin düştüğü düğüm | kümenin alanı |
On yedi kalemin onu sende, yedisi sağlayıcıda, ikisi yaratılışta sabit. Bakım grubunun dört kaleminin üçü devredilmiştir; ikinci tablonun bir saatlik ısınma penceresi buraya bağlanır — pencerenin ne zaman açılacağına karar veren sen değilsin.
Motor sürümünü sen seçiyorsun ama seçim tek yönlüdür: yükseltilen bir küme eski sürüme dönmez. Ölçeklemede sabitlenen kalem parça sayısıdır; değiştirildiğinde bütün anahtarlar yeniden dağıtılır ve dağıtım boyunca isabet düşer. Birinci tablonun “aynı isabet, aynı fiyat” sonucu bu yüzden yanıltıcıdır: iki kol aynı yere çıkar ama biri geri dönülebilir, diğeri değildir. Kümenin alanı da sabittir ve yedi yüz yirmi iki birimlik kalem doğrudan buna bağlıdır.
Özet
- İki GB’a hangi yoldan varılırsa varılsın isabet yüzde seksen yedi, fatura üç yüz altmış birim: ölçekleme birimi kararı isabetten ve fiyattan okunamaz.
- Fatura eğrisi dönüyor: önbelleksiz bin yirmi, bir GB’da beş yüz on, iki GB’da üç yüz altmış, dört GB’da dört yüz yirmi, sekiz GB’da altı yüz birim. Yüzde yüz isabet en pahalı satırdır.
- Tek parçalı bir düğüm değişimi inen isteği satın alınan kapasitenin yüzde üç yüz yirmi beş üstüne çıkarıyor; on altı parçada bu yüzde on dokuza iner ama sıfırlanmaz. Isınma her düzende 3.514 saniyedir. Geri alınamayan kalem yazma-arkası kipte bekleyen kayıtlardır.
- Önbelleği başka alana koymak yedi yüz yirmi iki birimlik aktarım kalemi yazıp toplamı önbelleksiz düzenin üstüne çıkarıyor. Kırk MB’lık tarife tablosunda süreç içi önbellek otuz, yönetilen önbellek doksan birim tutuyor: iş kümesi tek sürece sığdığında yönetilen önbellek kazandırmaz.
Sonraki Adım
Bu derste aktarım tek bir sütundu ve tek bir fiyatı vardı: alanlar arası, GB başına bir birim. O tek sütun, yerleşim kararı yanlış olduğunda faturanın en büyük kalemi oldu.
Ölçüm ağının geri kalanında aynı sütun defalarca yazılıyor: toplayıcı veri katmanına yazıyor, veri katmanı okuma kopyasına çoğaltıyor, yedekler gönderiliyor, günlükler akıyor, pano yanıtları genel ağa çıkıyor. Her akış, kaynağının ve hedefinin nerede durduğuna göre farklı fiyatlanıyor: aynı alan, komşu alan, uzak bölge ya da internet.
Sonraki ders bu kursun para dersidir: aynı mimari üç yerleşimde koşturulup çıkış ücreti kalem kalem çıkarılır, ardından kopya sayısı, günlük ve yedek gönderimi, kenar kullanımı ve sıkıştırma kararlarının bu ücrete etkisi sayılır.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.