Ders 04 / 09
Kısa Ömürlü İş Yüklerinde İz
2 000 kısa ömürlü iş yükü 671 501 kayıt kalemi üretiyor, 642 504'ü dışarı yazılıyor: kayıp yalnızca yüzde 4,3. Aynı veride iş yükünün son kalemi 2 000 iş yükünün ancak 115'inde toplanabiliyor, hatalı çıkış sınıfının 92 iş yükünden hiçbir kalem çıkmıyor. Ayrıntı düzeyi sekiz kat artırıldığında dışarı yazılan kalem 4 272 000'e çıkıyor ama yetki kararı sorusunu cevaplayan iş yükü 1 218'den sıfıra iniyor. Bütün kalemleri toplayan ayarın bedeli 91 084 ek gönderim isteği ve 33 çekirdek-dakika ek yaşam süresi.
İçindekiler
Önceki dersin bütün hesabı bir varsayıma dayanıyordu: bir kayıt alanı yazıldıysa müdahale anında elde durur. Kalıcı bir hizmette bu doğrudur. Kısa ömürlü iş yüklerinde değildir. Bir görev konteyneri kırk saniye yaşayıp sonlandığında, ürettiği kalemlerin yalnız dışarı yazılabilmiş olanı sorgulanabilir; gerisi süreçle birlikte gider. Bulut ortamında kanıt toplamanın kalıcı sistemlerden farkı Bulut ve Sanallaştırma Güvenliği kursunda ölçülmüştü; burada tekrarlanmaz, girdi olur.
Bu ders yalnız uygulama izini ölçer: iş yükü ölmeden hangi uygulama kalemi dışarı yazılmış oluyor. Ölçünün adı toplanabilen kalem penceresidir ve tek bir sayıya indirgenemez, çünkü kaybolan kalemler akış içinde rastgele dağılmaz — hepsi sondadır.
- UM17. İş yükü kümesi kurgudur: 2 000 çalıştırma, dört ömür bandı. Ömürler tohumu görünen bir üreteçten gelir.
- UM18. Kalemler iş yükü içinde sabit hızda üretilir ve yerel bir tampona yazılır.
Gönderici her
araliksaniyede bir, en çokyiginkadar kalemi dışarı yazar. - UM19. İş yükü sonlandığında tamponda kalan her şey kaybolur. Son bir gönderim ancak kapanış süresi gönderim süresini karşılıyorsa yapılabilir; modelde gönderim 1,2 saniye, varsayılan kapanış 0,5 saniyedir.
- UM20. Soru, iş yükünün ömründeki göreli bir konumda üretilen kaleme bağlıdır. Kalem dışarı yazılmadıysa o soru o iş yükü için cevapsızdır; ölçü birimi yine cevaplanamayan sorudur.
- UM21. Süreler ve hızlar veridir, bu sayfada yapılmış bir ölçüm değildir.
Toplanabilen Kalem Penceresi
// iz.mjs — kisa omurlu is yuklerinde disari yazilabilen kalem penceresi olculur. // MODELDIR: is yukleri, omurler ve kalem hizlari kurgudur. export const TOHUM = 20260502, IS_YUKU = 2000; export const HIZ = 6, ARALIK = 5, YIGIN = 200, GONDERIM = 1.2, KAPANIS = 0.5; const uretec = (t) => { let s = t >>> 0; return () => (s = (s * 1664525 + 1013904223) >>> 0) / 4294967296; }; const r = uretec(TOHUM); // Sinif = is yukunun omur bandi. Hatali cikis en kisa yasayan ve en cok kaybedendir. export const SINIF = [ { ad: "kisa gorev", pay: 0.55, alt: 3, ust: 20 }, { ad: "toplu is", pay: 0.25, alt: 20, ust: 120 }, { ad: "istek isleyici", pay: 0.15, alt: 60, ust: 400 }, { ad: "hatali cikis", pay: 0.05, alt: 1, ust: 4 }, ]; const sinifSec = (u) => { let t = 0; for (const s of SINIF) { t += s.pay; if (u < t) return s; } return SINIF.at(-1); }; export const YUKLER = Array.from({ length: IS_YUKU }, () => { const s = sinifSec(r()); return { sinif: s.ad, omur: s.alt + r() * (s.ust - s.alt) }; }); // Tampon FIFO'dur: her gonderim en cok YIGIN kalem tasir. Is yuku olurken tamponda // kalan her sey gider; son gonderim ancak kapanis suresi gonderim suresini karsilarsa olur. export function kos(omur, hiz = HIZ, aralik = ARALIK, kapanis = KAPANIS) { const kalem = Math.max(1, Math.floor(omur * hiz)); let gonderilen = 0, istek = 0; const gonder = (t) => { const uretilen = Math.min(kalem, Math.floor(t * hiz) + 1); const g = Math.min(YIGIN, uretilen - gonderilen); if (g > 0) { gonderilen += g; istek++; } }; for (let t = aralik; t <= omur; t += aralik) gonder(t); if (kapanis >= GONDERIM) gonder(omur); return { kalem, gonderilen, kayip: kalem - gonderilen, istek }; } // Soru = [metin, kalemin is yuku omrundeki goreli konumu]. Kalem disari yazilmadiysa // o is yuku icin soru cevapsizdir. export const SORU = [ ["istek hangi hesaptan geldi", 0.00], ["hangi uc nokta cagrildi", 0.10], ["hangi bagimlilik cagrildi", 0.45], ["yetki karari neydi", 0.85], ["is yuku hangi hatayla sonlandi", 1.00], ]; export function toplu(hiz = HIZ, aralik = ARALIK, kapanis = KAPANIS) { let kalem = 0, gonderilen = 0, istek = 0; const soruSay = SORU.map(() => 0); for (const y of YUKLER) { const o = kos(y.omur, hiz, aralik, kapanis); kalem += o.kalem; gonderilen += o.gonderilen; istek += o.istek; SORU.forEach(([, p], j) => { if (Math.floor(p * (o.kalem - 1)) < o.gonderilen) soruSay[j]++; }); } return { kalem, gonderilen, kayip: kalem - gonderilen, istek, soruSay }; } export const gen = (B) => (h) => h.map((v, j) => (j ? String(v).padStart(B[j]) : String(v).padEnd(B[0]))).join(""); if (import.meta.url === `file://${process.argv[1]}`) { console.log(`model (tohum ${TOHUM}): ${IS_YUKU} is yuku, ${HIZ} kalem/s, gonderim ` + `araligi ${ARALIK} s, yigin ${YIGIN} kalem, kapanis suresi ${KAPANIS} s, ` + `gonderim suresi ${GONDERIM} s`); const y = gen([18, 8, 11, 12, 12, 11, 9]); console.log("\n" + y(["is yuku sinifi", "adet", "ort. omur", "uretilen", "gonderilen", "kayip", "oran"])); for (const s of SINIF) { const l = YUKLER.filter((w) => w.sinif === s.ad).map((w) => kos(w.omur)); const ku = l.reduce((t, o) => t + o.kalem, 0), g = l.reduce((t, o) => t + o.gonderilen, 0); const om = YUKLER.filter((w) => w.sinif === s.ad).reduce((t, w) => t + w.omur, 0); console.log(y([s.ad, l.length, (om / l.length).toFixed(1), ku, g, ku - g, (g / ku).toFixed(2)])); } const t = toplu(); console.log(`\ntoplam ${t.kalem} kalem uretildi, ${t.gonderilen} disari yazildi, ` + `${t.kayip} kayip (yuzde ${((t.kayip / t.kalem) * 100).toFixed(1)})`); const z = gen([32, 8, 14, 8]); console.log("\n" + z(["soru", "konum", "cevaplanan", "oran"])); SORU.forEach(([m, p], j) => console.log(z([m, p.toFixed(2), `${t.soruSay[j]}/${IS_YUKU}`, (t.soruSay[j] / IS_YUKU).toFixed(2)]))); }
model (tohum 20260502): 2000 is yuku, 6 kalem/s, gonderim araligi 5 s, yigin 200 kalem, kapanis suresi 0.5 s, gonderim suresi 1.2 s is yuku sinifi adet ort. omur uretilen gonderilen kayip oran kisa gorev 1091 11.5 74404 57738 16666 0.78 toplu is 536 71.2 228687 221405 7282 0.97 istek isleyici 281 217.8 367056 363361 3695 0.99 hatali cikis 92 2.5 1354 0 1354 0.00 toplam 671501 kalem uretildi, 642504 disari yazildi, 28997 kayip (yuzde 4.3) soru konum cevaplanan oran istek hangi hesaptan geldi 0.00 1757/2000 0.88 hangi uc nokta cagrildi 0.10 1757/2000 0.88 hangi bagimlilik cagrildi 0.45 1757/2000 0.88 yetki karari neydi 0.85 1218/2000 0.61 is yuku hangi hatayla sonlandi 1.00 115/2000 0.06
İki tablo aynı koşumun iki farklı okumasıdır ve birbirine hiç benzemez. Üstteki tabloda toplam kayıp yüzde 4,3’tür. Bu sayı bir gösterge panosunda “kayıt toplama sağlıklı” diye okunur; gerçekten de üretilen 671 501 kalemin 642 504’ü dışarı yazılmıştır. Kayıt hattında hiçbir arıza yoktur; gönderici çalışmakta, ağ ayakta, hedef yazılabilir durumdadır.
Alttaki tablo aynı veriyi soru başına okuyor ve başka bir şey söylüyor. İş yükünün ilk yarısında üretilen kalemler 2 000 iş yükünün 1 757’sinde toplanabiliyor. Yetki kararının yazıldığı kalem 1 218’inde, iş yükünün nasıl sonlandığını yazan son kalem yalnız 115’inde. Yani “iş yükü hangi hatayla sonlandı” sorusu iş yüklerinin yüzde 94’ünde cevapsızdır — kayıt yazıldığı hâlde. Kayıp kalem oranı ile cevaplanabilirlik oranı aynı şey değildir, çünkü kaybolan kalemler akış içinde rastgele dağılmaz; hepsi sondadır ve müdahalede en çok istenen kalemler de sondakilerdir.
Sınıf tablosu kaybın nerede yoğunlaştığını yazıyor. İstek işleyici sınıfı ortalama 218 saniye yaşar ve kalemlerinin yüzde 99’unu dışarı yazar. Hatalı çıkış sınıfı ortalama 2,5 saniye yaşar ve hiçbir kalemi dışarı çıkmaz: 92 iş yükü, 1 354 kalem, sıfır. Gönderim aralığı beş saniyedir; iki buçuk saniye yaşayan bir iş yükü ilk periyodik gönderime hiç ulaşmaz, kapanış süresi de gönderim süresini karşılamadığı için son gönderim yapılamaz. Bu sınıf toplam kalemin yalnız binde ikisidir, ama müdahalede en çok bakılan sınıftır: bir iş yükünün beklenmedik biçimde ve hızla sonlanması zaten incelemenin başlangıç nedenidir.
Toplam kayıp oranının yanıltmasının nedeni de bu tablodadır. Toplam, kalem sayısıyla ağırlıklandırılmış bir ortalamadır ve kalemlerin büyük bölümünü uzun yaşayan iş yükleri üretir: 281 istek işleyici tek başına 367 056 kalem yazar, 1 091 kısa görev ise 74 404. Uzun yaşayanın yüzde 99’luk oranı toplamı yukarı çeker, kısa yaşayanın yüzde 78’i ve hatalı çıkışın sıfırı toplamda kaybolur. İş yükü başına ölçülmeyen bir toplama oranı, en çok kalem üreten sınıfın oranını bütün ortamın oranı diye rapor eder. Aynı veri iş yükü başına okunduğunda 92 iş yükünün tamamen sessiz olduğu görülür ve bu sayı toplam oranın hiçbir yerinde yazmaz.
Ayrıntı Düzeyi ve Toplama Ayarları
// ayar.mjs — iki ayar ekseni kosturulur: ayrinti duzeyi (kalem/s) ve gonderim duzeni // (aralik, kapanis suresi). Olculen sey kalem sayisi degil cevaplanan sorudur. MODELDIR. import { HIZ, ARALIK, KAPANIS, IS_YUKU, SORU, toplu, gen } from "./iz.mjs"; const y = gen([10, 11, 12, 8, 14, 12, 17]); console.log(y(["ayrinti", "uretilen", "gonderilen", "kayip", "yetki (0.85)", "son (1.00)", "cevaplanan cift"])); for (const kat of [1, 2, 4, 8]) { const t = toplu(HIZ * kat); const cift = t.soruSay.reduce((a, b) => a + b, 0); console.log(y([`${kat}x`, t.kalem, t.gonderilen, ((t.kayip / t.kalem) * 100).toFixed(1) + "%", (t.soruSay[3] / IS_YUKU).toFixed(2), (t.soruSay[4] / IS_YUKU).toFixed(2), `${cift}/${SORU.length * IS_YUKU}`])); } const z = gen([9, 10, 12, 14, 12, 12, 16]); console.log("\n" + z(["aralik", "kapanis", "gonderilen", "yetki (0.85)", "son (1.00)", "istek", "ek cekirdek-sn"])); for (const kapanis of [KAPANIS, 1.5]) for (const aralik of [5, 2, 1]) { const t = toplu(HIZ, aralik, kapanis); console.log(z([aralik, kapanis, t.gonderilen, (t.soruSay[3] / IS_YUKU).toFixed(2), (t.soruSay[4] / IS_YUKU).toFixed(2), t.istek, (IS_YUKU * (kapanis - KAPANIS)).toFixed(0)])); } const taban = toplu(), yogun = toplu(HIZ * 8), genis = toplu(HIZ, 1, 1.5); console.log(`\nayrinti 8 kat artinca disari yazilan kalem ${taban.gonderilen}'den ` + `${yogun.gonderilen}'e cikiyor ama yetki karari sorusu ` + `${taban.soruSay[3]} is yukunden ${yogun.soruSay[3]} is yukune iniyor`); console.log(`en genis ayar (aralik 1 s, kapanis 1.5 s) ayni ayrintida son kalemi ` + `${taban.soruSay[4]} yerine ${genis.soruSay[4]} is yukunde disari yaziyor; ` + `bedeli ${genis.istek - taban.istek} ek gonderim istegi ve ` + `${(IS_YUKU * (1.5 - KAPANIS) / 60).toFixed(0)} cekirdek-dakika ek yasam suresi`);
ayrinti uretilen gonderilen kayip yetki (0.85) son (1.00) cevaplanan cift 1x 671501 642504 4.3% 0.61 0.06 6604/10000 2x 1344000 1283327 4.5% 0.59 0.03 6500/10000 4x 2688990 2564937 4.6% 0.58 0.01 6454/10000 8x 5378988 4272000 20.6% 0.00 0.00 5221/10000 aralik kapanis gonderilen yetki (0.85) son (1.00) istek ek cekirdek-sn 5 0.5 642504 0.61 0.06 21360 0 2 0.5 662111 0.89 0.15 55024 0 1 0.5 668090 1.00 0.31 111065 0 5 1.5 671501 1.00 1.00 23245 2000 2 1.5 671501 1.00 1.00 56715 2000 1 1.5 671501 1.00 1.00 112444 2000 ayrinti 8 kat artinca disari yazilan kalem 642504'den 4272000'e cikiyor ama yetki karari sorusu 1218 is yukunden 0 is yukune iniyor en genis ayar (aralik 1 s, kapanis 1.5 s) ayni ayrintida son kalemi 115 yerine 2000 is yukunde disari yaziyor; bedeli 91084 ek gonderim istegi ve 33 cekirdek-dakika ek yasam suresi
İlk tablo bu kursun ikinci kez gösterdiği olguyu veriyor. Ayrıntı düzeyi sekiz kat artırıldığında dışarı yazılan kalem 642 504’ten 4 272 000’e çıkar — altı buçuk kat daha çok kayıt. Aynı hareket yetki kararı sorusunu cevaplayan iş yükünü 1 218’den sıfıra indirir. Mekanizma son sütunda değil kayıp sütununda görünür: sekiz kat ayrıntıda üretim hızı saniyede 48 kaleme çıkar, oysa gönderici beş saniyede en çok 200 kalem taşır, yani saniyede 40. Üretim taşıma kapasitesini geçtiğinde tampon birikmeye başlar ve akışın sonu hiçbir zaman sıraya gelmez. Daha çok kayıt yazmak, taşıma kapasitesi sabitken en son yazılan kalemi kuyrukta daha da geriye iter; toplam kalem artar, cevaplanan soru azalır.
Bu kırılmanın altındaki üç satır aynı olgunun yumuşak hâlidir. Ayrıntı iki ve dört kat artırıldığında kapasite henüz aşılmaz; yine de cevaplanan soru–iş yükü çifti 6 604’ten 6 454’e iner. Kazanç yoktur, çünkü eklenen kalemler zaten toplanabilen pencerenin içine düşer; kaybedilen ise yine sondaki kalemdir.
İkinci tablo iki ayarın ne satın aldığını yazıyor. Gönderim aralığını beş saniyeden bir saniyeye indirmek yetki kararı sorusunu 0,61’den 1,00’e çıkarır, ama son kalem yine iş yüklerinin ancak yüzde 31’inde toplanır — çünkü sorun aralık değil, kapanış anındaki gönderimin hiç yapılamamasıdır. Kapanış süresi gönderim süresini karşılayacak kadar uzatıldığında beş saniyelik aralıkla bile bütün sorular her iş yükünde cevaplanır. Toplanabilen kalem penceresini belirleyen şey gönderim sıklığı değil, iş yükünün ölmeden önce bir gönderim tamamlayabilmesidir.
Bedel iki sütunda yazılıdır. Aralığı bire indirmek gönderim isteğini 21 360’tan 111 065’e çıkarır: beş kattan fazla ağ isteği, iş yükü başına elli beş istek. Kapanış süresini bir saniye uzatmak 2 000 çekirdek-saniye, yani 33 çekirdek-dakika ek yaşam süresi getirir ve her iş yükünün sonlanmasını geciktirir. İkisi birlikte 91 084 ek istek eder. Üçüncü bir bedel de tabloda görünmez ama önceki derslerin defterindedir: dışarı yazılan her kalem, bir önceki dersteki sabit saklama bütçesinin içine düşer ve saklama gününü kısaltır.
Özet
- Kısa ömürlü iş yüklerinde ölçü, yazılan kalem değil dışarı yazılabilen kalemdir; iş yükü ölürken tamponda kalan her şey kaybolur.
- Kayıp oranı ile cevaplanabilirlik oranı ayrı sayılardır: modelde kayıp yüzde 4,3 iken, iş yükünün son kalemi 2 000 iş yükünün yalnız 115’inde toplanabilir.
- Kayıp sınıflara eşit dağılmaz: ortalama 2,5 saniye yaşayan hatalı çıkış sınıfının 92 iş yükünden hiçbir kalem çıkmaz, oysa incelemenin başlangıç nedeni çoğu zaman bu sınıftır.
- Ayrıntı düzeyini artırmak cevabı düşürebilir: sekiz kat ayrıntıda dışarı yazılan kalem altı buçuk kat artarken yetki kararı sorusunu cevaplayan iş yükü 1 218’den sıfıra iner, çünkü üretim hızı taşıma kapasitesini aşar ve akışın sonu sıraya hiç gelmez.
- Pencereyi belirleyen şey gönderim sıklığı değil, iş yükünün ölmeden bir gönderim tamamlayabilmesidir: kapanış süresi uzatıldığında beş saniyelik aralık bile yeterlidir.
- Bedel ölçülür: 91 084 ek gönderim isteği, 33 çekirdek-dakika ek yaşam süresi ve dışarı yazılan her kalemin sabit saklama bütçesinden aldığı pay.
Sonraki Adım
Buraya kadar bütün kayıtlar, uyarılar ve kalemler kurumun kendi içinden geldi. Bir uygulamanın açığı çoğu zaman başka bir yerden duyulur: dışarıdan bakan biri onu bulur ve bildirir. Bu akış bir tespit hattı değildir, bir iş kuyruğudur; girdisi insan tarafından yazılmış bildirimler, çıktısı düzeltilmiş ya da reddedilmiş kalemlerdir ve ölçüsü kalem sayısı değil süredir. Sonraki ders dış bildirim kanalını ve ödül programını bu eksende ölçer: bildirimden doğrulamaya ve doğrulamadan düzeltmeye kaç gün geçiyor, gelen bildirimlerin kaçı yineleniyor ve kanalın açılması kuyruğu hangi noktada tıkıyor.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.