Ders 29 / 30
Küme Gözlemlenebilirliği
Küme ölçeğinde günlük, ölçüt ve iz toplamanın bedeli sayılır: kaç kaynak, kaynak başına kaç seri, saklama süresiyle çarpıldığında kaç kayıt ve kaç bayt. Etiket kardinalitesi arttığında seri sayısının çarpımsal büyümesi gösterilir; örnekleme ve toplulaştırma uygulandığında kazanılan bayt ile kaybedilen ayrıntı birlikte ölçülür.
İçindekiler
Bir önceki dersin bütün sayıları tek bir hattın seksen turluk izinden çıktı ve o izi tutan şey ölçümdü: tur başına üç kalem, toplam iki yüz kırk okuma. Kümede bir değil onlarca kaynak vardır ve her birinin denetleyicisi aynı okumayı yapar. Ölçümün kendisi de bir yük olur.
Bu ders ölçütün ne olduğunu tartışmaz — sayaç, ölçer ve dağılım M16/K07’de kuruldu ve burada yalnız adlarıyla geçer. Ölçülen tek şey küme ölçeğinde toplama bedelidir: kaç kaynak, kaynak başına kaç seri, saklama süresiyle çarpıldığında kaç kayıt ve kaç bayt. Devredilen karar da buradan çıkar: hangi sorunun sonradan yanıtlanabilir kalacağına toplama anında karar verilir ve bu karar geri alınamaz, çünkü toplanmayan ayrıntı hiçbir yerde durmaz.
Ölçüm yine bölgesel ölçüm ağı üzerindedir ve kurgudur; gerçek küme koşturulmaz, sayılan şey
node ile kurulmuş bir modeldir.
OI49. Küme envanteri kurgudur: beş uygulamaya ait 34 kapsül ve 9 düğüm.
OI50. Ölçüt türleri M16/K07’de kuruldu; burada yalnız adıyla anılır.
OI51. Bir kayıt 16 bayttır (zaman damgası 8, değer 8), bir seri künyesi 120 bayttır; örnekleme
aralığı 15 saniye, saklama süresi 30 gündür.
OI52. Seri sayısı, kaynak sayısı ile ölçüt başına etiket kardinalitelerinin çarpımının
toplamıdır.
OI53. Gecikme sinyali kendi üretecimizle üretilir, tohum 20260801; on iki ani önceden
yazılıdır.
OI54. On iki işletim sorusu ve her birinin gerektirdiği etiket önceden yazılıdır.
Küme Ölçeğinde Seri Aritmetiği
// kume.mjs — kume envanteri, olcut tanimlari ve seri / kayit / bayt aritmetigi. export const KAYNAK = { kapsul: 34, dugum: 9 }; // bes uygulama, 34 kapsul, 9 dugum export const ORNEKLEME_SN = 15, SAKLAMA_GUN = 30; export const KAYIT_BAYT = 16, SERI_BAYT = 120; // zaman damgasi 8 + deger 8; seri kunyesi 120 export const OLCUT = { // ad: [tur, { etiket: kardinalite }] kapsul: [ ["istek-sayisi", "sayac", { yol: 12, yontem: 3, sonuc: 4 }], ["istek-suresi", "dagilim", { yol: 12, kova: 12 }], ["kuyruk-boyu", "olcer", {}], ["islenen-okuma", "sayac", { hat: 4 }], ["bellek-kullanimi", "olcer", {}], ], dugum: [ ["dugum-cpu", "olcer", { cekirdek: 8 }], ["dugum-bellek", "olcer", {}], ["disk-io", "sayac", { aygit: 3, yon: 2 }], ], }; export const seriSayisi = (olcut, kaynak = KAYNAK) => Object.entries(olcut).reduce((t, [tur, liste]) => t + kaynak[tur] * liste.reduce((s, [, , e]) => s + Object.values(e).reduce((c, k) => c * k, 1), 0), 0); export const etiketDusur = (olcut, ad) => Object.fromEntries(Object.entries(olcut).map(([t, l]) => [t, l.map(([a, tur, e]) => [a, tur, Object.fromEntries(Object.entries(e).filter(([k]) => k !== ad))])])); export const kayit = (seri, aralik = ORNEKLEME_SN, gun = SAKLAMA_GUN) => seri * Math.floor(86400 / aralik) * gun; export const bayt = (seri, aralik = ORNEKLEME_SN, gun = SAKLAMA_GUN) => kayit(seri, aralik, gun) * KAYIT_BAYT + seri * SERI_BAYT; export const gb = (b) => (b / 1024 ** 3).toFixed(1); // etiket eklemek: ilgili olcutun seri sayisini carpar export const etiketEkle = (olcut, hedef, ad, kardinalite) => Object.fromEntries(Object.entries(olcut).map(([t, l]) => [t, l.map(([a, tur, e]) => hedef.includes(a) ? [a, tur, { ...e, [ad]: kardinalite }] : [a, tur, e])]));
// olc.mjs — kume olceginde toplama bedeli ve etiket kardinalitesinin carpimsal buyumesi. import { KAYNAK, OLCUT, ORNEKLEME_SN, SAKLAMA_GUN, seriSayisi, kayit, bayt, gb, etiketEkle } from "./kume.mjs"; const seri = seriSayisi(OLCUT); const carp = (l) => l.reduce((s, [, , e]) => s + Object.values(e).reduce((c, k) => c * k, 1), 0); console.log(`kaynak ${KAYNAK.kapsul + KAYNAK.dugum} (kapsul ${KAYNAK.kapsul}, dugum ${KAYNAK.dugum})` + ` kapsul basina seri ${carp(OLCUT.kapsul)} dugum basina seri ${carp(OLCUT.dugum)} toplam seri ${seri}`); console.log(`ornekleme ${ORNEKLEME_SN} sn, saklama ${SAKLAMA_GUN} gun` + ` -> kayit ${kayit(seri).toLocaleString("tr-TR")} bayt ${gb(bayt(seri))} GB`); console.log("\netiket eklendikce (yalniz adi gecen olcutlere)"); console.log("eklenen etiket toplam seri carpan kayit GB"); const yaz = (ad, oo) => { const s = seriSayisi(oo); console.log(`${ad.padEnd(34)} ${String(s).padStart(9)} ${(s / seri).toFixed(1).padStart(6)}` + ` ${kayit(s).toLocaleString("tr-TR").padStart(13)} ${gb(bayt(s)).padStart(7)}`); return oo; }; let o = yaz("taban", OLCUT); o = yaz("+ bolge (7) istek olcutlerine", etiketEkle(o, ["istek-sayisi", "istek-suresi"], "bolge", 7)); o = yaz("+ sayac-tipi (23) islenen-okumaya", etiketEkle(o, ["islenen-okuma"], "sayac-tipi", 23)); o = yaz("+ surum (4) butun kapsul olcutlerine", etiketEkle(o, OLCUT.kapsul.map(([a]) => a), "surum", 4)); yaz("+ istek-kimligi (5000) sureye", etiketEkle(o, ["istek-suresi"], "istek-kimligi", 5000)); const gun = SAKLAMA_GUN * 86400; // uc sinyalin ayni kumede otuz gunluk bedeli const SINYAL = [["olcut (15 sn ornekleme)", kayit(seri) * 16], ["gunluk (kapsul basina 12 satir/sn, 180 bayt)", KAYNAK.kapsul * 12 * 180 * gun], ["iz (220 istek/sn, 6 aralik, 260 bayt)", 220 * 6 * 260 * gun], ["iz (yuzde bir orneklemeyle)", (220 * 6 * 260 * gun) / 100]]; console.log("\nuc sinyalin otuz gunluk toplama bedeli"); for (const [ad, b] of SINYAL) console.log(` ${ad.padEnd(44)} ${gb(b).padStart(9)} GB`);
kaynak 43 (kapsul 34, dugum 9) kapsul basina seri 294 dugum basina seri 15 toplam seri 10131 ornekleme 15 sn, saklama 30 gun -> kayit 1.750.636.800 bayt 26.1 GB etiket eklendikce (yalniz adi gecen olcutlere) eklenen etiket toplam seri carpan kayit GB taban 10131 1.0 1.750.636.800 26.1 + bolge (7) istek olcutlerine 68883 6.8 11.902.982.400 177.4 + sayac-tipi (23) islenen-okumaya 71875 7.1 12.420.000.000 185.1 + surum (4) butun kapsul olcutlerine 287095 28.3 49.610.016.000 739.3 + istek-kimligi (5000) sureye 685590007 67672.5 118.469.953.209.600 1765416.5 uc sinyalin otuz gunluk toplama bedeli olcut (15 sn ornekleme) 26.1 GB gunluk (kapsul basina 12 satir/sn, 180 bayt) 177.3 GB iz (220 istek/sn, 6 aralik, 260 bayt) 828.5 GB iz (yuzde bir orneklemeyle) 8.3 GB
Kırk üç kaynak, kapsül başına iki yüz doksan dört seri, düğüm başına on beş seri — toplam on bin yüz otuz bir seri. Otuz günlük saklamada bir milyar yedi yüz elli milyon kayıt ve yirmi altı gigabayt. Bu, hiçbir etiketin eklenmediği taban durumdur ve kaynak sayısı otuz dörtte kaldığı sürece doğrusal büyür: kapsül sayısı ikiye katlanırsa seri de ikiye katlanır.
Etiket eklemek doğrusal değildir. Bölge etiketinin yedi değeri iki ölçüte eklendiğinde seri on
binden altmış dokuz bine çıkar — kaynak sayısı değişmemiştir, eklenen bilgi yedi ayrı değerdir, ama
sonuç 6,8 katıdır. Nedeni tek satırdadır: bir ölçütün seri sayısı etiketlerinin kardinalitelerinin
çarpımıdır. istek-sayisi ölçütü zaten on iki yol, üç yöntem ve dört sonuç taşıyordu; yedi
bölge eklenince yüz kırk dört seri bin sekiz yüz seriye çıkar.
Son iki satır sınırı gösterir. Sürüm etiketi bütün kapsül ölçütlerine eklendiğinde toplam yirmi sekiz katına, yedi yüz otuz dokuz gigabayta çıkar. İstek kimliği — beş bin ayrı değer — tek bir ölçüte eklendiğinde seri altı yüz seksen beş milyona, saklama bir buçuk petabayt mertebesine çıkar. Bu satır bir öneri değil, bir sınır işaretidir: sınırsız kardinaliteli bir alan etiket olarak kullanıldığında ölçüt deposu kayıt deposuna dönüşür.
Üç sinyalin karşılaştırması da bedelin nerede yattığını gösterir. Aynı kümede ölçüt yirmi altı, günlük yüz yetmiş yedi, iz sekiz yüz yirmi sekiz gigabayttır. İz en pahalısıdır, çünkü tek tek isteği taşır; yüzde bir örneklemeyle sekiz gigabayta iner ve o an her yüz istekten doksan dokuzunun yolu kaybolur.
Örnekleme ve Toplulaştırma
// orneklem.mjs — ornekleme ve toplulastirmada kaybedilen ayrinti ile kazanilan bayt birlikte sayilir. import { KAYNAK, OLCUT, seriSayisi, etiketDusur, bayt, gb } from "./kume.mjs"; const uretec = (t) => () => (t = (t * 1103515245 + 12345) % 2147483648) / 2147483648; const rast = uretec(20260801); // tohum gorunur const ANI = [180, 420, 655, 900, 1210, 1480, 1755, 2010, 2290, 2640, 2980, 3310]; const sn = Array.from({ length: 3600 }, (_, i) => 118 + Math.round(rast() * 8) + (ANI.some((a) => i >= a && i < a + 20) ? 780 : 0)); console.log(`bir saatlik gecikme sinyali: 3600 saniye, ${ANI.length} ani (her biri 20 sn, +780 ms)`); console.log("aralik ornek yakalanan ani gorulen tepe seri basina kayit/gun toplam GB"); const seri = seriSayisi(OLCUT); for (const k of [1, 15, 60, 300]) { const idx = [...sn.keys()].filter((i) => i % k === 0); const yakalanan = ANI.filter((a) => idx.some((i) => i >= a && i < a + 20 && sn[i] > 500)).length; const tepe = Math.max(...idx.map((i) => sn[i])); console.log(`${String(k).padStart(4)} sn ${String(idx.length).padStart(7)}` + `${String(`${yakalanan}/${ANI.length}`).padStart(14)}${String(`${tepe} ms`).padStart(15)}` + `${String(Math.floor(86400 / k)).padStart(24)}${gb(bayt(seri, k)).padStart(12)}`); } const SORU = [["hangi yol yavasladi", ["yol"]], ["hangi yontem hata veriyor", ["yontem"]], ["hangi sonuc kodu artti", ["sonuc"]], ["gecikmenin ust dilimi", ["kova"]], ["hangi hat geride kaldi", ["hat"]], ["hangi kapsul bellek tuketiyor", ["kaynak"]], ["hangi cekirdek doldu", ["cekirdek"]], ["toplam istek sayisi", []], ["hangi uygulama yavas", []], ["hangi kapsul yeniden basladi", ["kaynak"]], ["hangi yolda hangi sonuc", ["yol", "sonuc"]], ["disk yonu okuma mi yazma mi", ["yon"]]]; console.log("\ntoplulastirma seri GB yanitlanan soru kaybedilen ayrinti"); const duzey = [["yok", [], KAYNAK], ["kova dusuruldu", ["kova"], KAYNAK], ["+ yol dusuruldu", ["kova", "yol"], KAYNAK], ["+ kapsul uygulamaya toplandi", ["kova", "yol", "kaynak"], { kapsul: 5, dugum: 9 }]]; for (const [ad, dusen, kaynak] of duzey) { const o = dusen.filter((d) => d !== "kaynak").reduce((x, d) => etiketDusur(x, d), OLCUT); const s = seriSayisi(o, kaynak); const yanit = SORU.filter((q) => q[1].every((e) => !dusen.includes(e))).length; console.log(`${ad.padEnd(30)} ${String(s).padStart(5)} ${gb(bayt(s)).padStart(5)}` + `${String(`${yanit}/${SORU.length}`).padStart(15)} ${dusen.length ? dusen.join(", ") : "-"}`); }
bir saatlik gecikme sinyali: 3600 saniye, 12 ani (her biri 20 sn, +780 ms) aralik ornek yakalanan ani gorulen tepe seri basina kayit/gun toplam GB 1 sn 3600 12/12 906 ms 86400 391.3 15 sn 240 12/12 905 ms 5760 26.1 60 sn 60 5/12 903 ms 1440 6.5 300 sn 12 1/12 903 ms 288 1.3 toplulastirma seri GB yanitlanan soru kaybedilen ayrinti yok 10131 26.1 12/12 - kova dusuruldu 5643 14.5 11/12 kova + yol dusuruldu 781 2.0 9/12 kova, yol + kapsul uygulamaya toplandi 230 0.6 7/12 kova, yol, kaynak
Örnekleme tablosu iki sütunu yan yana koyar. On beş saniyelik aralık, saniyelik toplamanın on beşte biri kadar bayt tutar — üç yüz doksan bir gigabayt yerine yirmi altı — ve on iki aninin on ikisini de yakalar, çünkü ani yirmi saniye sürüyor ve on beş saniyelik ızgara her yirmi saniyelik pencereye en az bir kez düşüyor. Buraya kadar örnekleme bedava görünür.
Altmış saniyeye çıkıldığında bayt dörtte birine, altı buçuk gigabayta iner ve yakalanan ani on ikiden beşe düşer. Üç yüz saniyede bayt bir virgül üç gigabayttır ve on iki aniden yalnız biri görünür. Kaybın nereden geldiği açıktır: örnekleme aralığı olayın süresini geçtiği anda olayın görünürlüğü rastlantıya kalır. Görülen tepe değeri üç aralıkta da dokuz yüz milisaniye civarındadır — yani yakalanan ani ölçüldüğünde doğru ölçülür, kaybolan şey büyüklük değil, anilerin kaçının hiç görünmediğidir. Ölçütün ortalaması hâlâ doğrudur ve hâlâ yanıltıcıdır.
Toplulaştırma tablosu aynı ikiliği etiket tarafında kurar. Dağılım kovası düşürüldüğünde seri on binden beş bin altı yüz kırk üçe iner, on iki sorunun on biri yanıtlanabilir kalır — kaybedilen tek soru gecikmenin üst dilimidir. Yol etiketi de düşürüldüğünde seri yedi yüz seksen bire, bayt iki gigabayta iner ve iki soru daha kapanır. Kapsüller uygulamaya toplandığında seri iki yüz otuza, bayt altı yüz megabayta iner; artık hangi kapsülün belleği tükettiği ya da hangisinin yeniden başladığı sorulamaz.
Üç adımın getirisi eşit değildir. İlk adım 11,6 gigabayt kazandırır ve bir soruya mal olur; ikinci adım 12,5 gigabayt kazandırır ve iki soruya; üçüncü adım yalnız 1,4 gigabayt kazandırır ve yine iki soruya. Soru başına kazanç 11,6’dan 6,3’e, oradan 0,7 gigabayta iner. Ucuz olan, çarpımın büyük çarpanını düşürmektir — on iki kovalı dağılım ve on iki yollu ayrım. O iki çarpan gittikten sonra kalan seriler zaten azdır ve her ek toplulaştırma neredeyse bedava bayt karşılığında soru kapatır.
Devrin Bilançosu
| Ölçü | Değer |
|---|---|
| kaynak | 43 (34 kapsül, 9 düğüm) |
| kapsül / düğüm başına seri | 294 / 15 |
| toplam seri, kayıt, bayt (15 sn, 30 gün) | 10.131 / 1,75 milyar / 26,1 GB |
| bir etiket (7 değer) iki ölçüte eklenince | seri 6,8 kat, bayt 177,4 GB |
| sınırsız kardinaliteli etiket (5000 değer) | seri 67.672 kat |
| ölçüt / günlük / iz (30 gün) | 26,1 / 177,3 / 828,5 GB |
| örnekleme 15 → 60 sn | bayt 26,1 → 6,5 GB, yakalanan ani 12/12 → 5/12 |
| toplulaştırma üç adım | bayt 26,1 → 0,6 GB, yanıtlanan soru 12/12 → 7/12 |
Devredilen karar şudur: hangi sorunun sonradan yanıtlanabileceğine, soru sorulmadan önce karar verilir. Gereken bilgi kalemleri de sayılıdır — hangi ölçüt, hangi etiketler, hangi aralık, ne kadar saklama. Bilginin maliyeti dört sayının çarpımıdır ve çarpımdaki tek bir kalemin değişmesi sonucu kat kat büyütür.
Sistemin bilmediği şeyin ne yaptığı da tablodadır ve bu kez sessizdir. Altmış saniyelik örnekleme kurulduğunda hiçbir uyarı çıkmaz; yedi ani hiç görünmediği için görünmedikleri de görünmez. Kapsül etiketi düşürüldüğünde sorgu hata vermez, yalnız uygulama düzeyinde bir sayı döndürür. Bu iki kayıp, kararın devredildiği andan aylar sonra ve ancak o soru gerçekten sorulduğunda fark edilir; o an geriye dönüp toplanmamış veriyi almanın yolu yoktur.
Özet
- 43 kaynak, kapsül başına 294 ve düğüm başına 15 seri; toplam 10.131 seri, 30 günde 1,75 milyar kayıt ve 26,1 GB.
- Bir ölçütün seri sayısı etiket kardinalitelerinin çarpımıdır: 7 değerli bir etiket iki ölçüte eklenince toplam 6,8 kat, 4 değerli bir etiket bütün kapsül ölçütlerine eklenince 28,3 kat büyür.
- 5000 değerli bir alan etiket yapıldığında seri 67.672 kata çıkar; sınırsız kardinalite ölçüt deposunu kayıt deposuna çevirir.
- Aynı kümede 30 günlük bedel ölçütte 26,1, günlükte 177,3, izde 828,5 GB; yüzde bir örnekleme izi 8,3 GB’a indirir ve her 100 isteğin 99’unun yolunu siler.
- Örnekleme 15’ten 60 saniyeye çıkınca bayt 26,1’den 6,5 GB’a, yakalanan ani 12/12’den 5/12’ye iner; üç toplulaştırma adımı baytı 0,6 GB’a indirirken yanıtlanan soruyu 12/12’den 7/12’ye düşürür.
Sonraki Adım
Buraya kadarki bütün ölçümler tek küme üzerindeydi: tek bir denetim düzlemi, tek bir kaynak envanteri, tek bir seri deposu. Bölgesel ölçüm ağının üretimi iki bölgede koşuyor ve her bölgenin kendi kümesi var — aynı dağıtım paketi, aynı kaynak türü, aynı denetleyici, ayrı denetim düzlemleri. Bir sonraki ders bu çoğalmanın bedelini sayar: aynı istenen durumun kaç kümeye kaç ayrı yoldan ulaştığı, kümeler arasındaki sapmanın nasıl ölçüldüğü, ve bir kararın tek kümede değil küme kümesinde verilmesi gerektiğinde hangi bilgi kaleminin kimden geleceği.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.