İçeriğe geç
academia.sh

Ders 14 / 20

Kenar Çalışma Zamanı Modeli

Yalıtılmış çalışma birimi, konteyner ve sanal makineyle aynı ölçütlerde karşılaştırılır: başlangıç gecikmesi ve bellek tabanı mertebe olarak, sunulan arayüz genişliği kalem kalem. Soğuk başlangıcın kaybolması sayılır, karşılığında gelen yedi eksik kalem ve dolaşma bedeli de.

İçindekiler

Olaylar yönlendirildi, akışlar kuruldu, uzun süren işler adım adım koşturuldu. Ama bütün bu düzenek hâlâ tek bir bölgede duruyor. Kurgudaki bölgesel ölçüm ağında saha ekipleri ve şube uçları bölgeye dağılmıştır; kullanıcıya yakın olan tek şey önbellekti ve önbellek yalnız daha önce üretilmiş bir yanıtı saklar. Yeni bir yanıt üretmek gerektiğinde istek yine bölgeye gidiyor.

Bu kurs hesabın kendisini uca taşır. İlk soru şudur: uçta ne koşar? Bölgede koşan şey bir konteynerdir ve konteynerin bedeli ölçülmüştür. Aynı bedel yüzlerce uç noktada, her uçta onlarca farklı uygulama için ödenemez. Uçta koşan şeyin adı yalıtılmış çalışma birimidir ve bu ders onu bilinen ölçeğe ekler.

KE1. Bütün sayılar model girdisidir, ölçülmüş bir kurulumdan gelmez; anlamlı olan iki düzey arasındaki mertebe farkıdır. KE2. Arayüz kalemleri ikili değer alır: sunulur ya da sunulmaz; kısıtlı biçimde sunulan bir kalem “sunulmaz” sayılır. KE3. Konteyner ve sanal makine satırlarının başlangıç ve bellek değerleri önceki ölçümün girdileridir; bu ders onları yeniden ölçmez, yalnız üçüncü satırı ekler.

Ölçeğin Ucundaki Satır

Yalıtım düzeyleri daha önce beş ölçütle karşılaştırıldı ve bedeli üç kalemde ödendi. Çalışma birimi o ölçeğin bir alt basamağıdır: kendi çekirdeğini taşımaz, kendi dosya sistemini de taşımaz. Ayırdığı şey tek bir dildeki yorumlayıcı bağlamıdır — değişken uzayı, yığın ve nesne kümesi ayrıdır, altındaki süreç ortaktır. Yeni ölçüt bu yüzden sunulan arayüz genişliğidir: çalışma zamanının uygulamaya kaç kalem sunduğu.

// olcum-agi/birim.mjs — yalitilmis calisma biriminin uc duzeyli olcege eklenmesi
// MODEL: butun sayilar bildirilen model girdisidir. Anlamli olan iki duzey
// arasindaki mertebe farkidir, tek bir hucredeki deger degil.

export const DUZEY = {
  "sanal makine": { baslangicMs: 25_000, bellekTabaniMB: 512 },
  "konteyner": { baslangicMs: 300, bellekTabaniMB: 12 },
  "calisma birimi": { baslangicMs: 3, bellekTabaniMB: 3 },
};

// Calisma zamaninin uygulamaya sundugu arayuz kalemleri ve hangi duzeyde var.
export const ARAYUZ = {
  "istek/yanit isleme":      ["sanal makine", "konteyner", "calisma birimi"],
  "zamanlayici":             ["sanal makine", "konteyner", "calisma birimi"],
  "giden ag istegi":         ["sanal makine", "konteyner", "calisma birimi"],
  "sifreleme temelleri":     ["sanal makine", "konteyner", "calisma birimi"],
  "akis isleme":             ["sanal makine", "konteyner", "calisma birimi"],
  "bellek ici veri yapisi":  ["sanal makine", "konteyner", "calisma birimi"],
  "dosya sistemi":           ["sanal makine", "konteyner"],
  "yerel disk kaliciligi":   ["sanal makine", "konteyner"],
  "uzun sureli surec":       ["sanal makine", "konteyner"],
  "alt surec baslatma":      ["sanal makine", "konteyner"],
  "ham yuva":                ["sanal makine", "konteyner"],
  "yerel ikili eklenti":     ["sanal makine", "konteyner"],
  "cekirdek ayari":          ["sanal makine"],
};

export const ADLAR = Object.keys(DUZEY);
export const KALEM = Object.keys(ARAYUZ);
export const sunulan = (d) => KALEM.filter((k) => ARAYUZ[k].includes(d));
const mertebe = (n) => "10^" + Math.round(Math.log10(n));

if (import.meta.main) {
console.log("bedel ve arayuz genisligi (model girdisi)");
console.log("duzey".padEnd(16) + "baslangic".padEnd(11) + "mertebe".padEnd(9) +
  "bellek tabani".padEnd(15) + "mertebe".padEnd(9) + "arayuz");
for (const d of ADLAR) {
  const v = DUZEY[d];
  console.log(d.padEnd(16) + `${v.baslangicMs} ms`.padEnd(11) + mertebe(v.baslangicMs).padEnd(9) +
    `${v.bellekTabaniMB} MB`.padEnd(15) + mertebe(v.bellekTabaniMB).padEnd(9) +
    `${sunulan(d).length}/${KALEM.length}`);
}

console.log("\narayuz kalemi (+ sunulur, - sunulmaz)");
console.log("kalem".padEnd(24) + ADLAR.map((d) => d.padEnd(16)).join(""));
for (const k of KALEM)
  console.log(k.padEnd(24) + ADLAR.map((d) => (ARAYUZ[k].includes(d) ? "+" : "-").padEnd(16)).join(""));

const eksik = KALEM.filter((k) => !ARAYUZ[k].includes("calisma birimi"));
console.log(`\ncalisma biriminde eksik olan ${eksik.length} kalem:`);
for (const k of eksik) console.log("  - " + k);
}
bedel ve arayuz genisligi (model girdisi)
duzey           baslangic  mertebe  bellek tabani  mertebe  arayuz
sanal makine    25000 ms   10^4     512 MB         10^3     13/13
konteyner       300 ms     10^2     12 MB          10^1     12/13
calisma birimi  3 ms       10^0     3 MB           10^0     6/13

arayuz kalemi (+ sunulur, - sunulmaz)
kalem                   sanal makine    konteyner       calisma birimi  
istek/yanit isleme      +               +               +               
zamanlayici             +               +               +               
giden ag istegi         +               +               +               
sifreleme temelleri     +               +               +               
akis isleme             +               +               +               
bellek ici veri yapisi  +               +               +               
dosya sistemi           +               +               -               
yerel disk kaliciligi   +               +               -               
uzun sureli surec       +               +               -               
alt surec baslatma      +               +               -               
ham yuva                +               +               -               
yerel ikili eklenti     +               +               -               
cekirdek ayari          +               -               -               

calisma biriminde eksik olan 7 kalem:
  - dosya sistemi
  - yerel disk kaliciligi
  - uzun sureli surec
  - alt surec baslatma
  - ham yuva
  - yerel ikili eklenti
  - cekirdek ayari

Başlangıç mertebeleri iki basamaklı adımlarla iner: 10^4, 10^2, 10^0. Sanal makineden konteynere geçerken iki mertebe, konteynerden çalışma birimine geçerken yine iki mertebe kazanılır. Bellek tabanı da 10^3, 10^1, 10^0 sırasını izler. Buraya kadar tablo tanıdıktır — daha ucuz bir yalıtım düzeyi eklenmiştir.

Üçüncü sütun tabloyu tersine çevirir. Arayüz genişliği 13/13, 12/13 ve 6/13’tür. Sanal makine her kalemi sunar; konteynerin kaybettiği tek kalem çekirdek ayarıdır, çünkü çekirdek paylaşılır. Çalışma birimi ise on üç kalemden yedisini birden kaybeder. Bu, ölçek üzerinde sürekli bir azalma değil, bir kırılmadır: konteyner bir mertebe ucuzlarken bir kalem verir, çalışma birimi iki mertebe ucuzlarken yedi kalem verir.

Soğuk Başlangıcın Ortadan Kalkması

Başlangıç gecikmesinin 10^0 mertebesine inmesi tek bir şeyi değiştirir ve o şey büyüktür. Sunucusuz bir işlevin en tanıdık kusuru, sıfırdan başlayan bir örneğin ilk çağrıyı geciktirmesidir. O gecikme uygulama süresinin yanında bir gürültü değil, onu bastıran bir kalemdir. Aşağıdaki koşum aynı çağrı dizisini üç düzeyde koşturur ve gecikmenin yüzdelik dilimlere nasıl düştüğünü sayar.

KE4. Soğuk çağrı oranı %6’dır ve deseni sabittir; rastgelelik yoktur. KE5. Uygulamanın kendi işlem süresi 12 ms’dir ve düzeye göre değişmez; ağ gecikmesi bu modele girmez. KE6. Dolaşma bedeli istek başına eklenen ağ turu sayısıyla ölçülür; bir turun kaç milisaniye ettiği sonraki dersin konusudur.

// olcum-agi/kazanc.mjs — baslangic gecikmesinin yuzdelik dilime yansimasi ve
// eksik arayuzun is yukune cevrilmesi. MODEL: cagri dagilimi deterministiktir.
import { DUZEY, ADLAR, sunulan } from "./birim.mjs";

const CAGRI = 10_000, SOGUK_YUZDE = 6, ISLEM_MS = 12, ESIK_MS = 100;
const soguk = (i) => (i * SOGUK_YUZDE) % 100 < SOGUK_YUZDE;   // desen: tohumsuz, sabit
const dilim = (a, p) => a[Math.min(a.length - 1, Math.ceil((p / 100) * a.length) - 1)];

console.log(`${CAGRI} cagri, %${SOGUK_YUZDE} soguk, islem ${ISLEM_MS} ms (model)`);
console.log("duzey".padEnd(16) + "p50".padEnd(11) + "p95".padEnd(11) + "p99".padEnd(11) +
  "ortalama ek".padEnd(14) + `${ESIK_MS} ms asan`);
for (const d of ADLAR) {
  const g = [];
  for (let i = 0; i < CAGRI; i++) g.push(ISLEM_MS + (soguk(i) ? DUZEY[d].baslangicMs : 0));
  g.sort((x, y) => x - y);
  const ek = g.reduce((t, v) => t + v - ISLEM_MS, 0) / CAGRI;
  console.log(d.padEnd(16) + `${dilim(g, 50)} ms`.padEnd(11) + `${dilim(g, 95)} ms`.padEnd(11) +
    `${dilim(g, 99)} ms`.padEnd(11) + `${ek.toFixed(1)} ms`.padEnd(14) +
    String(g.filter((v) => v > ESIK_MS).length));
}

// Soguk orani sifira indirmek: onceden isitilmis ornek tutmanin bellek bedeli.
const SICAK = 40;
console.log(`\nsoguk orani sifirlamak icin ${SICAK} ornek sicak tutulursa`);
for (const d of ADLAR)
  console.log("  " + d.padEnd(16) + `${String(DUZEY[d].bellekTabaniMB * SICAK).padStart(6)} MB bos duran taban`);

const IS = {
  "istek yonlendirme":    ["istek/yanit isleme"],
  "baslik duzenleme":     ["istek/yanit isleme"],
  "oturum dogrulama":     ["istek/yanit isleme", "sifreleme temelleri"],
  "okuma bicim cevirimi": ["istek/yanit isleme", "akis isleme"],
  "gecelik toplu isleme": ["uzun sureli surec", "dosya sistemi", "yerel disk kaliciligi"],
  "fatura belgesi":       ["dosya sistemi", "yerel ikili eklenti"],
  "gunluk arsivleme":     ["yerel disk kaliciligi", "dosya sistemi"],
  "cihaz kalici baglantisi": ["ham yuva", "uzun sureli surec"],
};
const kosar = (is, d) => IS[is].every((k) => sunulan(d).includes(k));

console.log("\nis yuku duzeyde kosar mi");
console.log("is yuku".padEnd(26) + ADLAR.map((d) => d.padEnd(16)).join(""));
for (const is of Object.keys(IS))
  console.log(is.padEnd(26) + ADLAR.map((d) => (kosar(is, d) ? "kosar" : "kosmaz").padEnd(16)).join(""));
for (const d of ADLAR)
  console.log("  " + d.padEnd(16) + `${Object.keys(IS).filter((is) => kosar(is, d)).length}/${Object.keys(IS).length} is yuku`);

// Eksik kalemin etrafindan dolasmanin bedeli: istek basina eklenen ag turu.
const DOLASMA = {
  "dosya sistemi": [1, "okuma/yazma nesne deposuna cikar"],
  "yerel disk kaliciligi": [1, "durum dis anahtar-deger deposunda tutulur"],
  "uzun sureli surec": [3, "is parcalanir, her parca durumu disaridan okur"],
  "alt surec baslatma": [2, "cagri bolgedeki bir uca devredilir"],
  "ham yuva": [2, "baglanti bolgede sonlanir, kenar yalniz yonlendirir"],
  "yerel ikili eklenti": [0, "saf dil karsiligi yazilir, islem suresi artar"],
  "cekirdek ayari": [0, "ayar yok; is bu duzeyde tutulamaz"],
};
console.log("\neksik kalemin etrafindan dolasma (istek basina ek ag turu)");
let toplam = 0;
for (const [k, [tur, yol]] of Object.entries(DOLASMA)) {
  toplam += tur;
  console.log("  " + k.padEnd(24) + `+${tur} tur   ` + yol);
}
console.log(`  ${"yedi kalemin toplami".padEnd(24)}+${toplam} tur`);
10000 cagri, %6 soguk, islem 12 ms (model)
duzey           p50        p95        p99        ortalama ek   100 ms asan
sanal makine    12 ms      25012 ms   25012 ms   1500.0 ms     600
konteyner       12 ms      312 ms     312 ms     18.0 ms       600
calisma birimi  12 ms      15 ms      15 ms      0.2 ms        0

soguk orani sifirlamak icin 40 ornek sicak tutulursa
  sanal makine     20480 MB bos duran taban
  konteyner          480 MB bos duran taban
  calisma birimi     120 MB bos duran taban

is yuku duzeyde kosar mi
is yuku                   sanal makine    konteyner       calisma birimi  
istek yonlendirme         kosar           kosar           kosar           
baslik duzenleme          kosar           kosar           kosar           
oturum dogrulama          kosar           kosar           kosar           
okuma bicim cevirimi      kosar           kosar           kosar           
gecelik toplu isleme      kosar           kosar           kosmaz          
fatura belgesi            kosar           kosar           kosmaz          
gunluk arsivleme          kosar           kosar           kosmaz          
cihaz kalici baglantisi   kosar           kosar           kosmaz          
  sanal makine    8/8 is yuku
  konteyner       8/8 is yuku
  calisma birimi  4/8 is yuku

eksik kalemin etrafindan dolasma (istek basina ek ag turu)
  dosya sistemi           +1 tur   okuma/yazma nesne deposuna cikar
  yerel disk kaliciligi   +1 tur   durum dis anahtar-deger deposunda tutulur
  uzun sureli surec       +3 tur   is parcalanir, her parca durumu disaridan okur
  alt surec baslatma      +2 tur   cagri bolgedeki bir uca devredilir
  ham yuva                +2 tur   baglanti bolgede sonlanir, kenar yalniz yonlendirir
  yerel ikili eklenti     +0 tur   saf dil karsiligi yazilir, islem suresi artar
  cekirdek ayari          +0 tur   ayar yok; is bu duzeyde tutulamaz
  yedi kalemin toplami    +9 tur

Üç düzeyin p50 değeri aynıdır: 12 ms. Ortanca çağrı sıcak bir örneğe düşer ve başlangıç gecikmesini hiç görmez. Fark p95’te ortaya çıkar, çünkü soğuk çağrılar %6’lık dilimi doldurur ve en yavaş %6 orada başlar. Sanal makinede p95 25.012 ms, konteynerde 312 ms, çalışma biriminde 15 ms‘dir. Ortalama ek gecikme sırasıyla 1.500,0 / 18,0 / 0,2 ms’dir.

Son sütun kararı verir. 100 ms’lik bir eşik konduğunda sanal makine ve konteyner aynı sayıyı üretir: 600 çağrı. İki düzey arasında 80 kat fark olmasına karşın ikisi de eşiği aşar; soğuk başlangıç konteynerde küçülür ama ortadan kalkmaz. Çalışma biriminde eşiği aşan çağrı sayısı 0‘dır. Soğuk başlangıç burada iyileştirilmemiş, sorun olmaktan çıkmıştır — 3 ms’lik bir başlangıç, 12 ms’lik bir işlemin yanında ölçülmeye değmez.

Bu kazanç, konteynerde onu satın almanın bedeliyle birlikte okunur. Soğuk oranı sıfıra indirmenin yolu örnekleri önceden ısıtmaktır ve kırk örnek sıcak tutulduğunda boş duran bellek tabanı sanal makinede 20.480 MB, konteynerde 480 MB’dır. Çalışma biriminde bu satır anlamsızdır: ısıtma yapılmaz, çünkü ısıtılacak bir şey yoktur.

Eksik Arayüz ve Etrafından Dolaşmanın Bedeli

Devredilen karar burada nettir: çalışma zamanının kurulumu, sürümü, kapasitesi ve yerleştirmesi gitmiştir. Karşılığında gelen kısıt bir sayıdır — 13 kalemden 7’si yoktur. Kalem kalem: dosya sistemi yok, yerel disk kalıcılığı yok, uzun süreli süreç yok, alt süreç başlatma yok, ham yuva yok, yerel ikili eklenti yok, çekirdek ayarı yok. Son madde en geniş sonucu doğurur: yerel ikili eklentiye dayanan bir kütüphane bu düzeyde çalışmaz, uygulama onu doğrudan çağırmasa bile bağımlılık zincirinin bir yerinde duruyorsa paket yüklenmez.

İş yükü tablosu bunu kurgudaki ağa çevirir. Sekiz iş yükünün dördü çalışma biriminde koşar: istek yönlendirme, başlık düzenleme, oturum doğrulama, okuma biçim çevirimi. Dördü koşmaz: gecelik toplu işleme, fatura belgesi üretimi, günlük arşivleme, cihazla kalıcı bağlantı. Oran 4/8’dir ve bu, aynı ağın işlerinin yarısının uçta duramayacağı anlamına gelir. Konteyner ve sanal makine sekizini de koşturur; ayrım iş yükünün türünde değil, hangi kalemi istediğindedir — koşan dört iş de yalnız istek işleme, şifreleme ve akış kalemlerine dokunur.

Kısıtın etrafından dolaşmak mümkündür ve bedeli son tabloda toplanır. Dosya sistemi yerine nesne deposu kullanmak erişim başına +1 ağ turu, yerel disk yerine dış anahtar–değer deposu +1 tur, uzun süreli süreci parçalayıp durumu dışarıdan okumak +3 tur, alt süreç ve ham yuva işini bölgeye devretmek ikişer tur ekler. Yedi kalemin toplamı +9 turdur. İki kalemde tur sayısı sıfırdır ama bedel yok değildir: yerel ikili eklentinin saf dil karşılığı işlem süresini uzatır, çekirdek ayarının ise karşılığı yoktur — o iş bu düzeyde tutulamaz.

Dokuz turun anlamı burada henüz eksiktir, çünkü bir turun kaç milisaniye ettiği uçtan nereye gidildiğine bağlıdır. Uçtan uca yakın bir depoya gidilen tur ile bölgeye gidilen tur aynı kalem değildir; ilk tablo kazanç olarak 300 ms’yi silerken, dolaşma turlarının her biri o kazancın bir parçasını geri alabilir. Kenarda hesap yapmanın gerçek hesabı bu iki sayının farkıdır.

Özet

  • Yalıtılmış çalışma birimi bilinen ölçeğin bir alt basamağıdır: başlangıç mertebeleri 10^4, 10^2 ve 10^0; bellek tabanı mertebeleri 10^3, 10^1 ve 10^0. Ayırdığı şey çekirdek ya da dosya sistemi değil, tek bir dildeki yorumlayıcı bağlamıdır.
  • Üçüncü ölçüt tabloyu tersine çevirir: sunulan arayüz genişliği 13/13, 12/13 ve 6/13’tür. Konteyner bir kalem verip bir mertebe kazanır, çalışma birimi yedi kalem verip iki mertebe.
  • Soğuk başlangıç ortadan kalkar: p95 değeri 25.012, 312 ve 15 ms; 100 ms eşiğini aşan çağrı sayısı 600, 600 ve 0’dır. Sıcak havuz tutmanın kırk örneklik bedeli 20.480 ve 480 MB iken çalışma biriminde ısıtılacak bir şey yoktur.
  • Karşılığında gelen kısıt kalem kalem yazılır: dosya sistemi, yerel disk, uzun süreli süreç, alt süreç, ham yuva, yerel ikili eklenti ve çekirdek ayarı yoktur. Kurgudaki sekiz iş yükünün yalnız 4’ü bu düzeyde koşar.
  • Kısıtın etrafından dolaşmanın bedeli istek başına ağ turudur: yedi kalem için toplam +9 tur. İki kalemde tur eklenmez ama bedel işlem süresine ya da işin taşınmasına yazılır.

Sonraki Adım

Bu ders uçta ne koşabileceğini yazdı ama koşan şeyin nerede durduğunu hiç ölçmedi. Dört iş yükü uçta koşabiliyorsa, aynı iş bölgede de kaynakta da koşabilir — üç yer arasındaki seçim neye göre yapılır? Bir isteğin uçta karara bağlanmasıyla bölgeye taşınması arasındaki fark kaç ağ turudur ve o turlar kaç milisaniye eder? Yönlendirme kararı uçta verildiğinde kaynağa hiç gitmeyen isteklerin oranı ne olur, aynı karar kimlik doğrulaması ya da A/B ayrımı olduğunda bu oran nasıl değişir? Sonraki ders bir istek kümesini üç yerde ayrı ayrı işletir, her yerleşimin tur sayısını ve gecikmesini çıkarır, ve uçta yapılamayan işi adıyla yazar.

İ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