İçeriğe geç
academia.sh

Ders 20 / 20

Kenar Sınırları

Kenarın üç eşiği on iki işlik bir kümeye uygulanır; parçalamanın bedeli ek tur ve hata noktasıyla, kenarın kazandırmadığı üç durum sayıyla çıkarılır. Kurs kapanışı yirmi dersin devredilen kararını ve kısıtını toplar.

İçindekiler

Bir önceki ders kaynaklara erişimi bildirimsel hâle getirdi. Sınanmayan bir şey kaldı: kenarda ne kadar iş yapılabileceği. İstek işlendi, durum tutuldu, kuyruk kuruldu, kaynak bağlandı — hepsinin kenara sığdığı varsayıldı. Bu ders üç eşiği bir iş kümesine uygular ve sığmayanı sığdırmanın faturasını çıkarır.

Ölçüm bölgesel ölçüm ağı üzerindedir ve kurgudur; eşikler, iş kümesi ve kullanıcı grupları node ile kurulmuş bir modeldir ve fiyatlar kurgu birimdir.

KE37. Üç eşik kurgudur: istek başına 50 ms işlem, 128 MB bellek, ve ilk derste sayılan eksik arayüz kalemleri. KE38. İş kümesi on iki iştir; her iş için işlem süresi, tepe bellek ve istenen kalemler yazılı. KE39. Parçalanan iş eşiğin %80’ini kullanır; parçalar arasında ara durum depoya yazılır (64 ms) ve okunur (2 ms). Hata noktası adım artı geçiş sayısıdır. KE40. Uyumluluğa takılan iş parçalanamaz; merkeze düşer, kenar yalnız yönlendirir. KE41. Altı kullanıcı grubu için uçta sonlanan ve doğrudan merkeze giden istek turu yazılıdır; uçtan geçip merkeze giden istek ikisinin toplamını öder. KE42. Sürekli sunucu aynı işi 0,55 katsayıyla yapar; işlevde soğuk oran %2, soğuk ek 900 ms’dir.

Üç Eşik, On İki İş

// sinir.mjs — kenar calisma zamaninin uc esigi ve kurgu is kumesi (model).
export const ESIK = { islem: 50, bellek: 128 };     // istek basina ms islem, MB bellek
export const YOK = ["dosya sistemi", "yerel disk", "uzun surec", "ham yuva", "ikili eklenti"];
export const ISLER = [                              // islem ms, bellek MB, istenen arayuz kalemleri
  { ad: "istek yonlendirme", islem: 3, bellek: 6 },
  { ad: "baslik duzenleme", islem: 2, bellek: 4 },
  { ad: "oturum dogrulama", islem: 9, bellek: 12 },
  { ad: "tarife arama", islem: 6, bellek: 22 },
  { ad: "okuma bicim cevirimi", islem: 18, bellek: 40 },
  { ad: "sayac imza dogrulama", islem: 34, bellek: 48 },
  { ad: "anomali esigi", islem: 62, bellek: 90 },
  { ad: "tuketim egrisi", islem: 140, bellek: 260 },
  { ad: "gunluk arsivleme", islem: 40, bellek: 96, ister: ["dosya sistemi", "yerel disk"] },
  { ad: "fatura belgesi", islem: 220, bellek: 180, ister: ["dosya sistemi", "ikili eklenti"] },
  { ad: "gecelik uzlastirma", islem: 40000, bellek: 700, ister: ["uzun surec", "dosya sistemi"] },
  { ad: "cihaz kalici baglantisi", islem: 5, bellek: 30, ister: ["ham yuva", "uzun surec"] },
];
export const PAY = 0.8;                             // parcanin kullanabildigi esik payi
export const ARA_SABIT = 20;                        // parca basina sabit bellek, MB
export const YAZMA = 64, OKUMA = 2, GERI_DUSUS = 60; // depoya yazma/okuma, kenar-bolge turu, ms

export function denetle(i) {                        // uc esik ayri ayri uygulanir
  const asan = [];
  if (i.islem > ESIK.islem) asan.push("sure");
  if (i.bellek > ESIK.bellek) asan.push("bellek");
  const eksik = (i.ister ?? []).filter((k) => YOK.includes(k));
  if (eksik.length) asan.push("uyumluluk");
  return { ...i, asan, eksik };
}
export function parcala(i) {                        // yalniz sure/bellek asan is parcalanabilir
  const kullanilabilir = ESIK.islem * PAY;
  const adim = Math.ceil(i.islem / kullanilabilir);
  const tepeBellek = Math.ceil(i.bellek / adim) + ARA_SABIT;
  return { adim, tepeBellek, ekTur: (adim - 1) * 2, ekSure: (adim - 1) * (YAZMA + OKUMA),
    hata: 2 * adim - 1 };
}
export const sut = (...s) => console.log(s.map((x, i) => String(x).padEnd(i ? 13 : 24)).join("").trimEnd());
// esik.mjs — uc esik is kumesine uygulanir; kac is kenarda kosuyor ve parcalamanin bedeli nedir.
import { ESIK, YOK, ISLER, PAY, denetle, parcala, GERI_DUSUS, sut } from "./sinir.mjs";

console.log(`esikler: islem ${ESIK.islem} ms/istek, bellek ${ESIK.bellek} MB, ` +
  `kenarda olmayan arayuz kalemi ${YOK.length}\n`);
sut("is", "islem", "bellek", "eksik kalem", "sonuc");
const d = ISLER.map(denetle);
for (const i of d) sut(i.ad, `${i.islem} ms`, `${i.bellek} MB`, i.eksik.length,
  i.asan.length ? `${i.asan.join(" + ")} asiyor` : "kosar");
const say = (e) => d.filter((i) => i.asan.includes(e)).length;
const kosan = d.filter((i) => !i.asan.length);
console.log(`\n${ISLER.length} isten ${kosan.length} tanesi kenarda kosuyor; ` +
  `sure ${say("sure")}, bellek ${say("bellek")}, uyumluluk ${say("uyumluluk")} isi durduruyor ` +
  `(bir is birden cok esige takilabilir)\n`);

const bolunebilir = d.filter((i) => i.asan.length && !i.asan.includes("uyumluluk"));
const dusen = d.filter((i) => i.asan.includes("uyumluluk"));
sut("parcalanan is", "adim", "tepe bellek", "ek tur", "ek sure", "hata noktasi");
let ekTur = 0, ekSure = 0, hata = 0;
for (const i of bolunebilir) {
  const p = parcala(i);
  ekTur += p.ekTur; ekSure += p.ekSure; hata += p.hata;
  sut(i.ad, p.adim, `${p.tepeBellek} MB`, p.ekTur, `${p.ekSure} ms`, p.hata);
}
console.log(`\nparcalama ${bolunebilir.length} isi kenara sokuyor: esik payi %${PAY * 100}, ` +
  `toplam ${ekTur} ek tur, ${ekSure} ms ek sure, ${hata} hata noktasi (parcalanmadan is basina 1)`);
console.log(`parcalanamayan ${dusen.length} is merkeze duser (${dusen.map((i) => i.ad).join(", ")}); ` +
  `bedeli istek basina ${GERI_DUSUS} ms kenar-bolge turu, kenar yalniz yonlendirir`);
console.log(`son durum: ${kosan.length + bolunebilir.length}/${ISLER.length} kenarda, ` +
  `${dusen.length}/${ISLER.length} merkezde`);
esikler: islem 50 ms/istek, bellek 128 MB, kenarda olmayan arayuz kalemi 5

is                      islem        bellek       eksik kalem  sonuc
istek yonlendirme       3 ms         6 MB         0            kosar
baslik duzenleme        2 ms         4 MB         0            kosar
oturum dogrulama        9 ms         12 MB        0            kosar
tarife arama            6 ms         22 MB        0            kosar
okuma bicim cevirimi    18 ms        40 MB        0            kosar
sayac imza dogrulama    34 ms        48 MB        0            kosar
anomali esigi           62 ms        90 MB        0            sure asiyor
tuketim egrisi          140 ms       260 MB       0            sure + bellek asiyor
gunluk arsivleme        40 ms        96 MB        2            uyumluluk asiyor
fatura belgesi          220 ms       180 MB       2            sure + bellek + uyumluluk asiyor
gecelik uzlastirma      40000 ms     700 MB       2            sure + bellek + uyumluluk asiyor
cihaz kalici baglantisi 5 ms         30 MB        2            uyumluluk asiyor

12 isten 6 tanesi kenarda kosuyor; sure 4, bellek 3, uyumluluk 4 isi durduruyor (bir is birden cok esige takilabilir)

parcalanan is           adim         tepe bellek  ek tur       ek sure      hata noktasi
anomali esigi           2            65 MB        2            66 ms        3
tuketim egrisi          4            85 MB        6            198 ms       7

parcalama 2 isi kenara sokuyor: esik payi %80, toplam 8 ek tur, 264 ms ek sure, 10 hata noktasi (parcalanmadan is basina 1)
parcalanamayan 4 is merkeze duser (gunluk arsivleme, fatura belgesi, gecelik uzlastirma, cihaz kalici baglantisi); bedeli istek basina 60 ms kenar-bolge turu, kenar yalniz yonlendirir
son durum: 8/12 kenarda, 4/12 merkezde

Üç eşik on iki işin altısını geçirir; kalan altıda süre dördünü, bellek üçünü, uyumluluk dördünü durdurur ve iki iş üçüne birden takılır.

İkinci tablo parçalamanın ne satın aldığını yazar. Süre ve belleğe takılan iki iş bölünebilir ve bölünme belleği de böler: tüketim eğrisinin tepe belleği 260 MB’dan 85 MB’a iner. Bedel sekiz ek tur, 264 milisaniye ve on hata noktasıdır — parçalanmadan her iş tek noktaydı. Uyumluluğa takılan dört iş parçalanamaz, çünkü eksik olan süre değil bir arayüz kalemidir.

Kenarın Kazandırmadığı Yer

// katman.mjs — kenarin kazandirmadigi durumlar ve ayni isin uc katmanda karsilastirilmasi.
import { ISLER, parcala, sut } from "./sinir.mjs";

const GRUP = [                                      // tur sureleri ms, model girdisi
  { ad: "sube-a", istek: 2600, ucta: 8, dogrudan: 124 },
  { ad: "sube-b", istek: 2100, ucta: 12, dogrudan: 116 },
  { ad: "sube-c", istek: 1800, ucta: 18, dogrudan: 80 },
  { ad: "merkez-kampus", istek: 1500, ucta: 22, dogrudan: 14 },
  { ad: "veri-merkezi-ici", istek: 1200, ucta: 28, dogrudan: 6 },
  { ad: "sube-d", istek: 800, ucta: 14, dogrudan: 132 },
];   // merkeze giden istek ucdan gectigi icin dogrudan yola ucun turunu ekler
const N = GRUP.reduce((t, g) => t + g.istek, 0);
const ort = (f) => GRUP.reduce((t, g) => t + g.istek * f(g), 0) / N;

const kaybeden = GRUP.filter((g) => g.dogrudan <= g.ucta);
const kn = kaybeden.reduce((t, g) => t + g.istek, 0);
console.log(`${N} istek, ${GRUP.length} grup: ucta sonlanan iste agirlikli kazanc ` +
  `${ort((g) => g.dogrudan - g.ucta).toFixed(1)} ms, merkeze giden iste kayip ` +
  `${ort((g) => g.ucta).toFixed(1)} ms`);
console.log(`${kaybeden.length}/${GRUP.length} grup (${kn} istek, %${(100 * kn / N).toFixed(0)}) ` +
  `kaynaga zaten yakin: kenar onlara ${kaybeden.map((g) => g.dogrudan - g.ucta).join(" ve ")} ms yaziyor\n`);

const YAZMA = 64, BOLGE_YAZMA = 10, SUNUCU_KAT = 0.55;
const yaz = ort((g) => g.ucta) + YAZMA, yazB = ort((g) => g.dogrudan) + BOLGE_YAZMA;
console.log(`tutarli yazma: kenardan ${yaz.toFixed(1)} ms, bolgeden ${yazB.toFixed(1)} ms; kazanc ` +
  `${(yazB - yaz).toFixed(1)} ms, ucta sonlananin %` +
  `${(100 * (yazB - yaz) / ort((g) => g.dogrudan - g.ucta)).toFixed(0)}'i — ${YAZMA} ms hic eksilmiyor`);
const ag = ISLER.find((i) => i.ad === "tuketim egrisi"), ap = parcala(ag), sn = ag.islem * SUNUCU_KAT;
console.log(`agir hesap (${ag.islem} ms): kenarda ${ap.adim} parcada ${ag.islem + ap.ekSure} ms, ` +
  `sunucuda ${Math.round(sn)} ms — ${((ag.islem + ap.ekSure) / sn).toFixed(1)} kat\n`);

const IS = ISLER.find((i) => i.ad === "okuma bicim cevirimi");
const AYLIK = 12_000_000, SOGUK_ORAN = 0.02, SOGUK_EK = 900;
const BIRIM = { kenar: 0.0000003, islev: 0.0000012, sunucu_saat: 0.096 };   // kurgu birim
const eszaman = Math.ceil((AYLIK / 2_592_000) * (IS.islem / 1000));
const uc = ort((g) => g.ucta), bl = ort((g) => g.dogrudan);
const KATMAN = [
  ["kenar calisma zamani", uc + IS.islem, "50 ms / 128 MB / 5 eksik kalem", AYLIK * BIRIM.kenar],
  ["islev calistirma ortami", bl + IS.islem + SOGUK_ORAN * SOGUK_EK, "900 sn / 3008 MB / soguk",
    AYLIK * BIRIM.islev],
  ["surekli sunucu", bl + IS.islem * SUNUCU_KAT, "kapasite elde / olcekleme elle",
    Math.max(1, Math.ceil(eszaman / 40)) * 730 * BIRIM.sunucu_saat],
];
console.log(`ayni is "${IS.ad}", ayda ${AYLIK / 1e6} milyon istek; birimler kurgudur`);
sut("katman", "gecikme", "aylik birim", "kisit");
for (const [ad, ms, kisit, birim] of KATMAN)
  sut(ad, `${ms.toFixed(1)} ms`, birim.toFixed(2), kisit);
const [k, i, s] = KATMAN.map((x) => x[3]);
console.log(`kenar isleve gore ${(i / k).toFixed(1)} kat, sunucuya gore ${(s / k).toFixed(0)} kat ucuz; ` +
  `ama bu satir yalnizca uc esige sigan ${ISLER.length - 4}/${ISLER.length} is icin yazilabilir`);
10000 istek, 6 grup: ucta sonlanan iste agirlikli kazanc 68.8 ms, merkeze giden iste kayip 15.6 ms
2/6 grup (2700 istek, %27) kaynaga zaten yakin: kenar onlara -8 ve -22 ms yaziyor

tutarli yazma: kenardan 79.6 ms, bolgeden 94.4 ms; kazanc 14.8 ms, ucta sonlananin %21'i — 64 ms hic eksilmiyor
agir hesap (140 ms): kenarda 4 parcada 338 ms, sunucuda 77 ms — 4.4 kat

ayni is "okuma bicim cevirimi", ayda 12 milyon istek; birimler kurgudur
katman                  gecikme      aylik birim  kisit
kenar calisma zamani    33.6 ms      3.60         50 ms / 128 MB / 5 eksik kalem
islev calistirma ortami 120.4 ms     14.40        900 sn / 3008 MB / soguk
surekli sunucu          94.3 ms      70.08        kapasite elde / olcekleme elle
kenar isleve gore 4.0 kat, sunucuya gore 19 kat ucuz; ama bu satir yalnizca uc esige sigan 8/12 is icin yazilabilir

Üç durum kenarın kazandırmadığı yerleri sayar. Altı grubun ikisi — 2.700 istek, %27 — bölgeye uçtan daha yakındır ve kenar onlara 8 ile 22 milisaniye yazar. Tutarlı yazmada sıralama merkezde olduğu için 64 milisaniye hiç eksilmez: kazanç 68,8’den 14,8 milisaniyeye iner. Ağır hesapta 140 milisaniyelik iş kenarda 338, sunucuda 77 milisaniye tutar.

Son tablo üç katmanı aynı iş üzerinde yan yana koyar. Eşiklere sığan iş için kenar üç ölçütte de kazanır: 33,6 milisaniye ve aylık 3,60 kurgu birim — işlevin dörtte biri, sunucunun on dokuzda biri. Koşulu son cümlededir: yalnızca on iki işin sekizi için yazılabilir.

Özet

  • Üç eşik on iki işin 6’sını geçirdi; süre 4, bellek 3, uyumluluk 4 işi durdurdu.
  • Parçalama 2 işi daha kenara soktu ve tepe belleği 260 MB’dan 85 MB’a indirdi; bedel 8 ek tur, 264 ms ve iş başına 1 yerine toplam 10 hata noktasıdır. Uyumluluğa takılan 4 iş parçalanamaz ve merkeze düşer: 8/12 kenarda, 4/12 merkezde.
  • Kenar üç yerde kazandırmaz: 2.700 istek (%27) bölgeye zaten yakın, tutarlı yazmada kazanç 68,8’den 14,8 ms’ye iner, 140 ms’lik hesap kenarda 338, sunucuda 77 ms sürer.
  • Sığan iş için kenar 33,6 ms ve 3,60 birimle işlevin 4, sunucunun 19 katı ucuzdur — ama kümenin yalnız 8/12’si için.

Kurs Kapanışı

Ders Devredilen karar Karşılığında gelen kısıt Dolaşmanın bedeli
İH-01 Sunucusuz kavramı kapasite, 8 karar eşzamanlılık 200 11.520 boşta örnek-dk
İH-02 Çağırma modelleri yeniden deneme 5.487 eş düşen kayıt tekilleştirme %5,5
İH-03 Soğuk başlangıç havuz ömrü soğuk çağrı 1.300 ms ısıtma %50 fatura
İH-04 Kaynak sınırları bellek kademesi 12’den 6’sı sığmaz 246 çağrı, 245 kayıt
İH-05 Takma adlar trafik dağıtımı %1 payda +100 ms 15 yapay çağrı
İH-06 Paylaşılan katmanlar bağımlılık yeri alt uç 745 → 2.093 6 yeniden yayım
İH-07 Uymayan işler sürekli kapasite 5’ten 2’si uymaz 13 hata noktası
OS-01 Olay veri yolu yönlendirme 433 sessiz düşme 781 boşa uyandırma
OS-02 Kuyruk ve konu tüketici ölçekleme 5 ayar kalemi 1 ileti 7 istek
OS-03 Orkestrasyon akış durumu 1.119 geçiş, 280 birim üçe bölünürse 840 birim
OS-04 Zamanlanmış tetikleme saat 3.600 yinelenen fatura koşum başına kapsam sorgusu
OS-05 Geçit servisi geçit işletimi 102 yapılandırma kalemi 48.469 yeniden çağrı
OS-06 Bildirim servisleri gönderim 25 gün kısılma 630 olay, 6,3 birim
KE-01 Çalışma zamanı kurulum ve sürüm 13’ten 7 kalem yok istek başına +9 tur
KE-02 İstek işleme yerleşim 7’den 3’ü uçta olmaz +64 ms, 640 sn
KE-03 Kenar depolama çoğaltma 12.857 bayat okuma okuma 2 → 62 ms
KE-04 Durum nesneleri eşzamanlılık tavan 166,7 istek/sn anahtar bölünür, 6 okuma
KE-05 Kenar kuyrukları eşzamansız iş 438 yanlış endeks 2.400 ek yazma
KE-06 Bağlamalar bağlantı kurma 9 türden 5’i 45 satır kod, 124 ms
KE-07 Kenar sınırları işlem ve bellek 12’den 6’sı sığar 8 ek tur, 10 hata

Kursun kuralı yirmi satırda da aynıdır: kapasite yönetimini devretmek onu ortadan kaldırmaz; kısıt olarak geri gelir ve tasarımı o kısıt belirler. Üçüncü sütun dört aileye ayrılır: sekiz satırda kısıt sayılı bir üst sınırdır (eşzamanlılık, süre, bellek, arayüz kalemi, istek/sn), üç satırda başlangıç bedelidir, dört satırda görünmeyen bir yapılandırma yüzeyidir (kural, beş kalem, akış tanımı, 102 kalem), beş satırda sessiz kayıp ya da yinelenen iştir. Dördüncü sütun ise hiçbir satırda kısıtın birimiyle yazılmaz: süre sınırı çağrıya, saklama süresi ikinci bir kopyaya, eksik arayüz ağ turuna çevrilir.

Dört kurstur her katman kiralandı: makine, ağ, veri ve hesabın kendisi. Her kiralama bir karar devretti, karşılığında sayılabilir bir kısıt verdi. Ama bütün bu hesapların kime ait olduğu, kimin neye erişebildiği ve faturanın kime çıktığı hiç sorulmadı. M23/K05 Bulut Yönetişimi, Güvenlik ve Maliyet bu soruyla başlar.

İ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