İçeriğe geç
academia.sh

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
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.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat