İçeriğe geç
academia.sh

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; dilim etiketinden S2; ornek etiketinden 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.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat