Ders 06 / 18
Saklama ve Maliyet
Üç saklama basamağı taranır ve her basamakta yanıtlanabilen soru sayısı ile bayt birlikte sayılır: soru başına maliyet basamak basamak çıkarılır, bir basamağın marjinal bedeli bin katı fark eder ve en ucuz basamağın hangi soruları hangi nedenle kaybettiği adıyla yazılır.
İçindekiler
Buraya kadarki beş ölçümde saklama süresi hep sabit tutuldu. Ölçüt hattı otuz gün, günlük hattı bir saat üzerinden fiyatlandı ve her ders tek bir ayrıntı düzeyinde ölçüldü. Gerçek bir hat böyle işlemez: veri yaşlandıkça çözünürlüğü düşürülür, etiketleri seyreltilir, satırları atılır ve sonunda özete iner.
Bu ders o basamakları tarar. Ölçü değişmez — her basamakta yanıtlanabilen soru sayısı ile bayt birlikte sayılır ve soru başına maliyet basamak basamak çıkarılır. Sonunda iki sayı yan yana durur: bir basamağı eklemenin marjinal bedeli ve o basamağın kapattığı sorunun adı.
Sayılar bölgesel ölçüm ağının hattındandır ve kurgudur; ölçülen şey node ile kurulmuş
bir modeldir ve girdileri bu konunun önceki derslerinden gelir.
OG31. Üç basamağın yaş aralığı, çözünürlüğü, düşürdüğü etiketler ve tuttuğu günlük satır
türleri kurgudur ve önceden yazılıdır.
OG32. Ölçüt seri sayısı ikinci dersin gerçekleşen kümesinden alınır: 6.888 seri. Özet
basamağında ornek etiketi servis düzeyine toplanır, dilim etiketi tümüyle düşürülür.
OG33. Günlük hacmi dördüncü dersin akışından türer: taban 232 satır/saniye, gecelik iş 540.000
satır; hata satırı kırpma sınırındaki 512 bayttır.
OG34. Her sorunun ufku ikinci dersten, çözünürlük gereksinimi üçüncü dersten, gereken günlük
satır türü dördüncü ve beşinci derslerden gelir.
OG35. Bir basamak bir soruyu yanıtlar sayılır: yaş aralığı sorunun ufkunu kapsıyorsa,
çözünürlüğü yeterliyse, gereken etiketi düşürmemişse ve gereken satır türünü tutuyorsa.
OG36. S12 hiçbir basamakta yanıtlanmaz; gerektirdiği veri hiçbir basamağın içeriğinde yoktur.
Üç Basamak ve Ayrım Ölçütleri
// basamak.mjs — saklama basamaklari, her basamakta yanitlanan soru ve soru basina maliyet. export const OLCUT = { // olcut: [ornek tabani, servis tabani, oteki etiket carpani, dilim] "istek-sayisi": [29, 4, 4 * 5, 1], "istek-suresi": [29, 4, 4, 12], "kuyruk-boyu": [29, 4, 4 * 3, 1], "islenen-okuma": [20, 2, 4 * 11 * 5, 1], "is-adimi-suresi": [6, 3, 4 * 6, 1], "is-islenen-kayit": [6, 3, 4, 1], }; export const seri = (ozet) => Object.values(OLCUT).reduce((t, [a, b, c, d]) => t + (ozet ? b : a) * c * (ozet ? 1 : d), 0); // ozette ornek servise, dilim tumuyle dusurulur export const GUNLUK_SATIR = { istek: 232 * 0.86 * 86400, hata: 232 * 0.02 * 86400, "is-adimi": 232 * 0.12 * 86400 + 540000 }; // gunde satir; gecelik is 540.000 satir export const SATIR_BAYT = { istek: 180, hata: 512, "is-adimi": 240 }; // basamak: [ad, bas gun, bit gun, cozunurluk sn, ozet mi, tuttugu gunluk satir turleri] export const BASAMAK = [["ham", 0, 7, 15, false, ["istek", "hata", "is-adimi"]], ["seyreltilmis", 7, 90, 300, false, ["hata", "is-adimi"]], ["ozet", 90, 395, 3600, true, []]]; // soru: [kimlik, ufuk gun, gereken cozunurluk sn, gereken etiketler, gereken satir turu] export const SORU = [["S1", 1, 300, ["servis"], null], ["S2", 1, 15, ["dilim"], null], ["S3", 1, 3600, ["ortam", "sonuc"], null], ["S4", 30, 3600, ["surum"], null], ["S5", 7, null, [], "is-adimi"], ["S6", 7, null, [], "is-adimi"], ["S7", 365, 3600, ["bolge", "sonuc"], null], ["S8", 7, 300, ["ornek"], null], ["S9", 7, 300, ["ornek"], "is-adimi"], ["S10", 1, null, [], "hata"], ["S11", 1, 300, ["kuyruk"], null], ["S12", 1, null, [], "izleme"]]; export const DUSEN = ["ornek", "dilim"]; // ozet basamaginda dusurulen etiketler export const uygun = (b, s, yasSay = true) => { // basamak soruyu yanitliyor mu const [, bas, bit, coz, ozet, turler] = b, [, ufuk, gerCoz, gerEt, gerTur] = s; if (yasSay && !(bas <= ufuk && ufuk <= bit)) return false; if (gerCoz !== null && coz > gerCoz) return false; if (ozet && gerEt.some((e) => DUSEN.includes(e))) return false; return gerTur === null || turler.includes(gerTur); }; export const gb = (b) => (b / 1024 ** 3).toFixed(2);
Bir basamağı tanımlayan dört ölçüt vardır ve dördü de bir soruyu kapatabilir: yaş aralığı (sorunun ufkunu kapsıyor mu), çözünürlük (üçüncü dersteki sorgu penceresi ölçümü), düşürülen etiket (ikinci dersteki etiket merdiveni) ve tutulan satır türü (dördüncü dersteki katman kaybı). Basamak tasarımı bu dört kaleme aynı anda karar vermektir.
Basamak Basamak Bayt ve Soru
// maliyet.mjs — basamak basamak bayt, yanitlanan soru ve soru basina maliyet. import { OLCUT, seri, GUNLUK_SATIR, SATIR_BAYT, BASAMAK, SORU, DUSEN, uygun, gb } from "./basamak.mjs"; const olcutBayt = (b) => { const [, bas, bit, coz, ozet] = b; return seri(ozet) * Math.floor(86400 / coz) * (bit - bas) * 16 + seri(ozet) * 120; }; const gunlukBayt = (b) => (b[2] - b[1]) * b[5].reduce((t, tur) => t + GUNLUK_SATIR[tur] * SATIR_BAYT[tur], 0); console.log(`olcut serisi: ham/seyreltilmis ${seri(false).toLocaleString("tr-TR")},` + ` ozet ${seri(true).toLocaleString("tr-TR")} (dusurulen etiket: ${DUSEN.join(", ")})`); console.log("\nbasamak gun cozunurluk olcut GB gunluk GB toplam GB yas araliginda ayrinti duzeyi GB/soru"); const satirlar = []; for (const b of BASAMAK) { const o = olcutBayt(b), g = gunlukBayt(b), t = o + g; const yas = SORU.filter((s) => uygun(b, s)), ayr = SORU.filter((s) => uygun(b, s, false)); satirlar.push([b, t, yas, ayr]); console.log(`${b[0].padEnd(14)}${`${b[1]}-${b[2]}`.padEnd(9)}${`${b[3]} sn`.padStart(10)}` + `${gb(o).padStart(10)}${gb(g).padStart(11)}${gb(t).padStart(11)}${`${yas.length}/12`.padStart(16)}` + `${`${ayr.length}/12`.padStart(16)}${gb(t / (yas.length || 1)).padStart(9)}`); } console.log("\nbirikimli (basamaklar ust uste konunca)"); console.log("basamaklar toplam GB yanitlanan GB/soru marjinal GB/yeni soru yeni acilan"); let toplam = 0, once = []; for (let i = 0; i < satirlar.length; i++) { const ekle = satirlar[i][1], ad = BASAMAK.slice(0, i + 1).map((b) => b[0]).join(" + "); toplam += ekle; const y = [...new Set(satirlar.slice(0, i + 1).flatMap(([, , yas]) => yas))]; const yeni = y.filter((s) => !once.includes(s)); console.log(`${ad.padEnd(26)}${gb(toplam).padStart(9)}${`${y.length}/12`.padStart(13)}` + `${gb(toplam / y.length).padStart(10)}${(yeni.length ? gb(ekle / yeni.length) : "-").padStart(24)} ` + (yeni.map(([k]) => k).join(" ") || "-")); once = y; } const ucuz = satirlar[satirlar.length - 1]; const kayip = SORU.filter((s) => !ucuz[3].includes(s) && s[0] !== "S12"); console.log(`\nen ucuz basamak: ${ucuz[0][0]}, ${gb(ucuz[1])} GB, ayrinti duzeyiyle ${ucuz[3].length}/12 soru` + `, soru basina ${gb(ucuz[1] / ucuz[3].length)} GB`); console.log("kaybettigi sorular ve nedeni"); for (const s of kayip) { const neden = [ucuz[0][3] > (s[2] ?? Infinity) && `cozunurluk ${ucuz[0][3]} sn`, s[3].some((e) => DUSEN.includes(e)) && `${s[3].filter((e) => DUSEN.includes(e)).join("/")} etiketi dusuruldu`, s[4] && !ucuz[0][5].includes(s[4]) && `${s[4]} satirlari tutulmuyor`].filter(Boolean); console.log(` ${s[0].padEnd(4)} ${neden.join("; ")}`); }
olcut serisi: ham/seyreltilmis 6.888, ozet 668 (dusurulen etiket: ornek, dilim) basamak gun cozunurluk olcut GB gunluk GB toplam GB yas araliginda ayrinti duzeyi GB/soru ham 0-7 15 sn 4.14 26.18 30.31 9/12 11/12 3.37 seyreltilmis 7-90 300 sn 2.45 70.51 72.96 5/12 10/12 14.59 ozet 90-395 3600 sn 0.07 0.00 0.07 1/12 3/12 0.07 birikimli (basamaklar ust uste konunca) basamaklar toplam GB yanitlanan GB/soru marjinal GB/yeni soru yeni acilan ham 30.31 9/12 3.37 3.37 S1 S2 S3 S5 S6 S8 S9 S10 S11 ham + seyreltilmis 103.28 10/12 10.33 72.96 S4 ham + seyreltilmis + ozet 103.35 11/12 9.40 0.07 S7 en ucuz basamak: ozet, 0.07 GB, ayrinti duzeyiyle 3/12 soru, soru basina 0.02 GB kaybettigi sorular ve nedeni S1 cozunurluk 3600 sn S2 cozunurluk 3600 sn; dilim etiketi dusuruldu S5 is-adimi satirlari tutulmuyor S6 is-adimi satirlari tutulmuyor S8 cozunurluk 3600 sn; ornek etiketi dusuruldu S9 cozunurluk 3600 sn; ornek etiketi dusuruldu; is-adimi satirlari tutulmuyor S10 hata satirlari tutulmuyor S11 cozunurluk 3600 sn
İki sütun ayrı şeyleri ölçer ve ayrımı görmek bu tablonun anahtarıdır. Yaş aralığında sütunu, o basamağın kapsadığı yaş penceresine ufku düşen soruları sayar; ayrıntı düzeyi sütunu, yaş hiç gözetilmeseydi o basamağın ayrıntısıyla kaç sorunun yanıtlanabileceğini. Ham basamak ayrıntı düzeyiyle on bir soruyu taşır ama yalnız dokuzunu yanıtlar, çünkü sürüm karşılaştırması ile mevsimsel bölge karşılaştırmasının ufku yedi günün dışındadır. Ayrıntıyı tutmak yetmez; ayrıntının yeterince eski veriyle birlikte durması gerekir.
Bayt dağılımı da beklenenden farklıdır. Ham basamağın 30,31 gigabaytının 26,18’i günlüktür, ölçüt yalnız 4,14. Seyreltilmiş basamakta istek satırları atılmasına rağmen günlük hâlâ 70,51 gigabayt tutar — çünkü seksen üç günlük bir pencerede hata ve iş adımı satırları da birikir. Özet basamak her iki tarafta da neredeyse bedavadır: üç yüz beş günlük saklama 0,07 gigabayta iner.
Marjinal Maliyetin Tersine Dönmesi
Birikimli tablo kararı taşıyan sayıyı verir. Ham basamak dokuz soruyu 30,31 gigabayta açar — soru başına 3,37. Seyreltilmiş basamak eklendiğinde toplam 103,28 gigabayta çıkar ve yanıtlanan soru dokuzdan ona çıkar: yetmiş üç gigabayt, tek bir soru. Marjinal maliyet 72,96 gigabayt/sorudur, ham basamağın yirmi bir katı.
Özet basamak eklendiğinde toplam 103,35 gigabayt olur ve yanıtlanan soru on birdir. Marjinal maliyet 0,07 gigabayt/sorudur — seyreltilmiş basamağın bin katı ucuz. Aradaki oran bu dersin en keskin sayısıdır: iki basamak da tam olarak bir soru açar ve biri ötekinden bin kat pahalıdır.
Farkın nedeni basamağın uzunluğu değil, ne tuttuğudur. Seyreltilmiş basamak seksen üç gün
boyunca günlük satırı ve tam etiketli seriyi tutar; açtığı tek soru ise yalnız surum etiketiyle
saatlik çözünürlük ister. Yani otuz günlük sürüm karşılaştırması için tutulan verinin neredeyse
tamamı o soru tarafından kullanılmaz. Aynı soru, özet basamağın ayrıntı düzeyiyle de
yanıtlanabilirdi.
Bu, basamak tasarımının asıl kararını gösterir: seyreltilmiş basamağın çözünürlüğünü ve satır seçimini soruların gerektirdiği en düşük düzeye indirmek, tek bir sorunun bedelini yetmiş üç gigabayttan gigabayt mertebesine düşürür. Basamağın süresini kısaltmak ise S4’ü tümüyle kapatır ve hiçbir şey kazandırmaz.
En Ucuz Basamağın Kaybettiği Sorular
Özet basamak ayrıntı düzeyiyle üç soruyu 0,07 gigabayta yanıtlar — soru başına 0,02 gigabayt, bütün hattın en ucuz sayısı. Yalnız bu sayıya bakan bir karar her şeyi özete indirirdi. Kaybedilenler listede adıyla durur ve her birinin nedeni ayrı bir tasarım kalemidir.
Çözünürlük 3600 saniyeye çıktığı için S1 (hangi servis yavaşladı), S11 (iş emri kuyruğu
neden birikti) ve kısmen S8 düşer; üçüncü derste ölçülmüştü, bir saatlik pencerede doksan
saniyelik bir bozulma ne ortalamada ne yüzdelikte görünür. dilim etiketi düşürüldüğü için S2
düşer: dağılım kovası olmadan üst dilim hesaplanamaz. ornek etiketi servise toplandığı için
S8 ve S9 düşer — hangi örneğin yeniden başladığı ve hangi koşumun yavaş olduğu artık
sorulamaz. Günlük satırları hiç tutulmadığı için S5, S6 ve S10 düşer.
Sekiz sorunun sekizi de sessizce kapanır. Özet basamakta bu sorgular hata vermez; boş sonuç ya da tek bir toplam değer döner. Beşinci dersteki kırpma bulgusuyla aynı biçimdir: kaybın işareti, kaybın kendisiyle birlikte kaybolur.
Basamak Düzenleri Yan Yana
Basamakların tek tek bedeli bilindiğine göre düzenin kendisi karşılaştırılabilir: aynı on iki soruluk küme hangi düzende kaç gigabayta yanıtlanıyor?
// politika.mjs — basamak duzenleri karsilastirilir: ayni soru kumesi kac gigabayta yanitlaniyor. import { seri, GUNLUK_SATIR, SATIR_BAYT, BASAMAK, SORU, uygun, gb } from "./basamak.mjs"; const bicim = (ad, bas, bit) => { // bir basamagi baska yas araligina tasi const b = BASAMAK.find((x) => x[0] === ad); return [ad, bas, bit, b[3], b[4], b[5]]; }; const bayt = (b) => seri(b[4]) * Math.floor(86400 / b[3]) * (b[2] - b[1]) * 16 + seri(b[4]) * 120 + (b[2] - b[1]) * b[5].reduce((t, tur) => t + GUNLUK_SATIR[tur] * SATIR_BAYT[tur], 0); const POLITIKA = [ ["yalniz ham, 7 gun", [bicim("ham", 0, 7)]], ["yalniz ham, 30 gun", [bicim("ham", 0, 30)]], ["yalniz ham, 395 gun", [bicim("ham", 0, 395)]], ["uc basamak 7 / 90 / 395", [bicim("ham", 0, 7), bicim("seyreltilmis", 7, 90), bicim("ozet", 90, 395)]], ["ham 7 + ozet 395 (orta yok)", [bicim("ham", 0, 7), bicim("ozet", 7, 395)]], ["ham 30 + ozet 395", [bicim("ham", 0, 30), bicim("ozet", 30, 395)]], ]; console.log("politika toplam GB yanitlanan GB/soru yanitsiz kalan"); const olc = POLITIKA.map(([ad, bs]) => { const t = bs.reduce((s, b) => s + bayt(b), 0); const y = SORU.filter((s) => bs.some((b) => uygun(b, s))); console.log(`${ad.padEnd(31)}${gb(t).padStart(9)}${`${y.length}/12`.padStart(13)}${gb(t / y.length).padStart(10)} ` + SORU.filter((s) => !y.includes(s)).map(([k]) => k).join(" ")); return [ad, t, y.length]; }); const [, ucT, ucY] = olc[3], [, ortasiz, ortasizY] = olc[4]; console.log(`\norta basamagin katkisi: ${gb(ucT - ortasiz)} GB fazla, ${ucY - ortasizY} yeni soru`); console.log(`her seyi ham tutmanin bedeli: ${gb(olc[2][1] - ortasiz)} GB fazla,` + ` ${olc[2][2] - ortasizY} yeni soru`);
politika toplam GB yanitlanan GB/soru yanitsiz kalan yalniz ham, 7 gun 30.31 9/12 3.37 S4 S7 S12 yalniz ham, 30 gun 129.92 10/12 12.99 S7 S12 yalniz ham, 395 gun 1710.56 11/12 155.51 S12 uc basamak 7 / 90 / 395 103.35 11/12 9.40 S12 ham 7 + ozet 395 (orta yok) 30.41 11/12 2.76 S12 ham 30 + ozet 395 130.00 11/12 11.82 S12 orta basamagin katkisi: 72.94 GB fazla, 0 yeni soru her seyi ham tutmanin bedeli: 1680.16 GB fazla, 0 yeni soru
Dört düzen aynı on bir soruyu yanıtlar ve aralarında elli altı kat fiyat farkı vardır. En ucuzu orta basamağı hiç kurmayan düzendir: yedi günlük ham, sonrasında doğrudan özet. Toplam 30,41 gigabayt, soru başına 2,76.
Üç basamaklı düzenin orta katmanı 72,94 gigabayt fazla tutar ve sıfır yeni soru açar. Nedeni
dördüncü bölümde görülmüştü: seyreltilmiş basamağın tek katkısı S4’tü ve S4, surum etiketiyle
saatlik çözünürlük istediği için özet basamağın ayrıntısıyla da yanıtlanır. Orta basamak yalnız
“yedi gün az, doksan gün iyi olur” sezgisiyle kurulmuştur; soru kümesine karşı sayıldığında
karşılığı yoktur.
“Her şeyi ham tut” düzeni aynı on bir soruyu 1710,56 gigabayta yanıtlar — 1680 gigabayt fazla, sıfır yeni soru. Soru başına maliyeti 155,51 gigabayttır, en ucuz düzenin elli altı katı. Bu iki satır bu kursun kuralını sayıya bağlar: hiçbir soruyu yanıtlamayan veri, ne kadar özenle toplanırsa toplansın, maliyettir.
Özet
- Bir basamağı dört kalem tanımlar ve dördü de soru kapatabilir: yaş aralığı, çözünürlük, düşürülen etiket ve tutulan satır türü.
- Ham basamak ayrıntı düzeyiyle 11/12 soruyu taşır ama yaş aralığı yüzünden 9/12’sini yanıtlar; ayrıntıyı tutmak yetmez, yeterince eski veriyle birlikte durması gerekir.
- Bayt günlük tarafında toplanır: ham basamağın 30,31 GB’ının 26,18’i günlük, 4,14’ü ölçüt; seyreltilmiş basamakta istek satırları atılmasına rağmen günlük 70,51 GB tutar.
- Marjinal maliyet tersine döner: seyreltilmiş basamak bir soruyu (S4) 72,96 GB’a açar, özet basamak bir soruyu (S7) 0,07 GB’a — bin kat fark, ikisi de tam bir soru.
- En ucuz basamak (özet) 3/12 soruyu 0,02 GB/soruya yanıtlar ve sekiz soruyu adıyla, sessizce
kaybeder: çözünürlükten S1, S11;
dilimetiketinden S2;orneketiketinden S8, S9; günlük satırlarından S5, S6, S10. Sorgular hata vermez, boş ya da tek toplam değer döner. - Düzen karşılaştırmasında dört farklı düzen aynı 11/12’yi yanıtlar: en ucuzu orta basamağı hiç kurmayandır (30,41 GB, 2,76 GB/soru). Orta basamak 72,94 GB fazla tutup sıfır soru açar; “her şeyi ham tut” 1680 GB fazla tutup sıfır soru açar.
Sonraki Adım
Bu konu veriyi uçtan uca ele aldı: nasıl toplandığı, hangi etiketlerle saklandığı, hangi toplulaştırmayla sorulduğu, günlük hattının hangi katmanında ne kaybettiği, metnin nasıl aranabilir alana çevrildiği ve yaşlandıkça hangi basamakta ne kadara mal olduğu. On iki sorunun on biri bir yerde yanıtlanır hâle geldi ve her yanıtın fiyatı bilinir.
Geriye tek bir soru kaldı ve hiçbir basamakta, hiçbir etiket kümesinde, hiçbir günlük satırında görünmedi: bir faturanın hangi okumadan üretildiği. Bunu sormak, tek bir işlemin okuma toplayıcıdan doğrulayıcıya, oradan faturalamaya ve iş emrine giden yolunu istemektir. Ölçüt onu taşıyamaz, çünkü işlem kimliğinin kardinalitesi sınırsızdır; günlük satırı taşıyamaz, çünkü her servis kendi kimliğini üretir ve satırlar birbirine bağlanamaz. Toplanan yüz gigabaytın hiçbir baytı o yolu göstermez. Sonraki konu bu boşluktan başlar: bir isteğin servisler arasındaki yolunu görünür kılmak neyi gerektirir ve hangi soruları açar.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.