Ders 10 / 12
Sunucusuz Güvenlik
Kısa ömürlü iş yüklerinde kanıtın toplanabildiği pencerenin ölçülmesi: 400 çağrının ortanca ömrü 447 ms, uyarıya bağlı elle toplama 400 çağrının hiçbirine, otomatik toplama 15'ine yetişiyor. Ortam içinden sürekli akıtma 3.600 kanıt kaleminin 3.541'ini alıyor; 60 saniyelik tutma aynı sonucu çalışma süresinin 34 katı ortam-saniyeyle veriyor. Kimliğin geçerlilik süresi ise ömrün 8.054 katıdır ve açık kalem-saniyenin yüzde yüzü iş yükü sonlandıktan sonra geçiyor.
İçindekiler
Önceki dersin bütün ölçümü iş yükünün ayakta olduğunu varsaydı: konakta duruyordu, kimliği kullanılabiliyordu, komşusu sayılabiliyordu. Bir iş yükü sınıfı bu varsayımı sağlamaz. Bir işlev çalıştırma ortamında iş yükü yüz milisaniye ile birkaç saniye arasında yaşar, işi biter ve ortam geri alınır. Uyarı geldiğinde bakılacak bir süreç, açılacak bir kabuk ve imajı alınacak bir disk yoktur.
Bu dersin ölçtüğü şey o yüzden penceredir: iş yükü kaç saniye yaşıyor ve kanıt kalemlerinin
kaçı, o pencere kapanmadan toplanmazsa geri gelmiyor. Kısa ömürlü iş yüklerinin çalışma zamanı
kısıtları, soğuk başlangıç ve ölçekleme davranışı Sunucusuz ve Kenar Bilişim kursunda ölçüldü;
burada tekrarlanmaz. Ölçüm bölgesel ölçüm ağı üzerindedir, kurgudur ve node ile yazılmış bir
modeldir; üreteç kendi yazılmıştır, tohum çıktıda görünür.
BT19. Model 400 çağrıdan oluşur; ömürler üç banttan üretilir ve milisaniye cinsindendir (kurgu). BT20. Dokuz kanıt kalemi üç sınıfa ayrılır: beşi yalnız iş yükü yaşarken alınabilir, üçü sonradan da alınabilir, biri iş yükünün kendi kaydıdır ve ancak sonlanmadan önce boşaltılmışsa teslim edilir. BT21. Toplama gecikmesi , uyarıdan toplamanın başlamasına kadar geçen süredir; tutma , çağrı bittikten sonra ortamın canlı bırakıldığı süredir. BT22. Yaşarken alınabilen kalemler ancak ise toplanır. BT23. Her çağrı kendi kısa ömürlü kimliğini alır; belirtecin geçerlilik süresi saniyedir (kurgu). BT24. Açık kalem-saniye, kimliğin eriştiği kalem sayısı ile belirtecin geçerli kaldığı sürenin çarpımıdır. Erişilen kalem sayısı birinci dersteki yürüyüşten alınmıştır.
Kanıtın Toplanabildiği Pencere
// omur.mjs — kisa omurlu is yuklerinde kanitin toplanabildigi pencere. MODELDIR. // Bolgesel olcum agi KURGUDUR. Uretec kendi yazilmistir; tohum asagida gorunur. export const TOHUM = 20260805; const uretec = (t) => { let s = t >>> 0; return () => (s = (s * 1664525 + 1013904223) >>> 0) / 4294967296; }; // Kanit kalemi: ad|sinif. yasarken: is yuku ayaktayken alinabilir; sonradan: sonra da alinabilir; // bosaltma: is yukunun kendi kaydi, ancak sonlanmadan once bosaltilmissa teslim edilir. export const KANIT = ` bellek-icerigi|yasarken surec-listesi|yasarken acik-baglanti|yasarken ortam-degiskeni-degeri|yasarken gecici-dosya|yasarken cagri-ust-verisi|sonradan yonetim-duzlemi-kaydi|sonradan islev-surumu|sonradan islev-kendi-kaydi|bosaltma`.trim().split(/\s{2,}|\n/).map((x) => x.trim().split("|")) .map(([ad, sinif]) => ({ ad, sinif })); const r = uretec(TOHUM); // 400 cagri: omur milisaniye cinsinden, uc bant. Bosaltma bayragi kaydin teslim edilip // edilmedigini soyler (kurgu oran). export const CAGRI = Array.from({ length: 400 }, () => { const u = r(); const omur = u < 0.72 ? 80 + Math.floor(r() * 520) : u < 0.94 ? 600 + Math.floor(r() * 3400) : 4000 + Math.floor(r() * 41000); return { omur, bosaltildi: r() > 0.14 }; }); export const YASARKEN = KANIT.filter((k) => k.sinif === "yasarken").length; export const SONRADAN = KANIT.filter((k) => k.sinif === "sonradan").length; // Bir ayarda kac kanit kalemi toplaniyor. T: toplama gecikmesi (ms), H: cagri sonrasi tutma (ms). export function topla(T, H) { let canli = 0, kalem = 0; for (const c of CAGRI) { const pencere = c.omur + H; if (T < pencere) { canli++; kalem += YASARKEN; } kalem += SONRADAN + (c.bosaltildi ? 1 : 0); } return { canli, kalem, tam: CAGRI.length * KANIT.length, ortamSaniye: Math.round((CAGRI.length * H) / 1000) }; } 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]}`) { const sirali = [...CAGRI].map((c) => c.omur).sort((a, b) => a - b); const yuzde = (p) => sirali[Math.floor(p * sirali.length)]; console.log(`model (tohum ${TOHUM}): ${CAGRI.length} cagri, ${KANIT.length} kanit kalemi ` + `(${YASARKEN} yasarken, ${SONRADAN} sonradan, 1 bosaltmaya bagli)`); console.log(`omur (ms): ortanca ${yuzde(0.5)}, %90 ${yuzde(0.9)}, %99 ${yuzde(0.99)}, ` + `en uzun ${sirali.at(-1)}; toplam yasam ${Math.round(sirali.reduce((a, b) => a + b) / 1000)} sn`); const yz = gen([30, 10, 10, 18, 16, 18]); console.log("\n" + yz(["ayar", "gecikme", "tutma", "kanit alinabilen", "toplanan kalem", "bedel"])); const AYAR = [ ["uyari + elle toplama", 300000, 0, "-"], ["otomatik toplama", 10000, 0, "-"], ["otomatik toplama + tutma", 10000, 60000, "ortam-saniye"], ["otomatik toplama + uzun tutma", 2000, 300000, "ortam-saniye"], ["ortam icinden surekli akitma", 0, 0, "cagri basina 8 ms"], ]; for (const [ad, T, H, bedel] of AYAR) { const s = topla(T, H); console.log(yz([ad, `${T / 1000} sn`, `${H / 1000} sn`, `${s.canli}/${CAGRI.length} cagri`, `${s.kalem}/${s.tam}`, H ? `${s.ortamSaniye} ortam-sn` : bedel])); } const elle = topla(300000, 0), oto = topla(10000, 0), akit = topla(0, 0); console.log(`\nelle toplama ${elle.canli}/${CAGRI.length} cagride yetisiyor, otomatik toplama ` + `${oto.canli}/${CAGRI.length}; ikisi arasindaki fark ${oto.kalem - elle.kalem} kalem`); console.log(`ortam icinden akitma ${akit.canli}/${CAGRI.length} cagriya yetisir ve ` + `${akit.kalem}/${akit.tam} kalem toplar: eksik kalan ${akit.tam - akit.kalem} kalem, ` + `sonlanmadan once bosaltilmamis kendi kaydidir`); const tut = topla(10000, 60000); console.log(`60 sn tutma kanit alinabilen cagriyi ${oto.canli} -> ${tut.canli} cikariyor; ` + `bedeli ${tut.ortamSaniye} ortam-saniyedir, yani calisma suresinin ` + `${Math.round(tut.ortamSaniye / (sirali.reduce((a, b) => a + b) / 1000))} kati`); }
model (tohum 20260805): 400 cagri, 9 kanit kalemi (5 yasarken, 3 sonradan, 1 bosaltmaya bagli) omur (ms): ortanca 447, %90 3249, %99 29130, en uzun 40604; toplam yasam 703 sn ayar gecikme tutma kanit alinabilen toplanan kalem bedel uyari + elle toplama 300 sn 0 sn 0/400 cagri 1541/3600 - otomatik toplama 10 sn 0 sn 15/400 cagri 1616/3600 - otomatik toplama + tutma 10 sn 60 sn 400/400 cagri 3541/3600 24000 ortam-sn otomatik toplama + uzun tutma 2 sn 300 sn 400/400 cagri 3541/3600 120000 ortam-sn ortam icinden surekli akitma 0 sn 0 sn 400/400 cagri 3541/3600 cagri basina 8 ms elle toplama 0/400 cagride yetisiyor, otomatik toplama 15/400; ikisi arasindaki fark 75 kalem ortam icinden akitma 400/400 cagriya yetisir ve 3541/3600 kalem toplar: eksik kalan 59 kalem, sonlanmadan once bosaltilmamis kendi kaydidir 60 sn tutma kanit alinabilen cagriyi 15 -> 400 cikariyor; bedeli 24000 ortam-saniyedir, yani calisma suresinin 34 kati
Ortanca çağrı 447 milisaniye yaşıyor; çağrıların onda dokuzu 3,2 saniyenin altında bitiyor. Bu dağılımda uyarıya bağlı elle toplama — beş dakikalık bir gecikmeyle — 400 çağrının hiçbirine yetişmiyor. Sıfır. Otomatik toplama gecikmeyi on saniyeye indirdiğinde 15 çağrıya yetişiyor, yani %3,75’ine; kazandırdığı 75 kanıt kalemi, toplam 3.600 kalemin %2’sinden azdır.
Yetişilemeyen Kalem
Sayının bu kadar sert olması, gecikmenin kısaltılmasıyla düzelen bir sorun olmadığını gösteriyor. On saniyelik gecikme zaten hızlı bir tepkidir ve yine de çağrıların %96’sını kaçırıyor; iki saniyeye inmek de yetmez, çünkü ortanca ömür yarım saniyedir. Toplama gecikmesini kısaltmak bu iş yükü sınıfında çalışmayan bir kaldıraçtır.
Birinci dersteki kör önek burada başka bir biçime giriyor. Orada kaydın gecikmesi yürüyüşün ilk adımlarını görünmez kılıyordu ama adımlar sonradan kayıtta duruyordu; burada gecikme, kanıtın hiç var olmamasına yol açıyor. Uyarının 5 dakika sonra gelmesi kaydı geciktirmiyor, toplanacak şeyi ortadan kaldırıyor. Toplanan 1.541 kalem yalnızca sonradan da alınabilen üç sınıftan ve boşaltılmış kendi kayıtlarından geliyor; yaşarken alınabilen 2.000 kalemin tamamı kayıp.
Çalışan iki kaldıraç var ve ikisi de pencereyi uzatmıyor, pencereyi kaldırıyor. Birincisi tutmadır: çağrı bittikten sonra ortam altmış saniye canlı bırakılırsa kanıt alınabilen çağrı 15’ten 400’e çıkıyor ve toplanan kalem 1.616’dan 3.541’e. Bedeli 24.000 ortam-saniyedir — 400 çağrının toplam çalışma süresi 703 saniyeyken, tutma 34 katı kadar ortam-saniye tüketiyor. Üstelik tutmayı 300 saniyeye çıkarmak hiçbir ek kalem getirmiyor ve bedeli 120.000 ortam-saniyeye çıkarıyor: aynı sonucun beş katı fiyatı.
İkincisi ortam içinden sürekli akıtmadır: yaşarken alınabilen kalemler, iş yükü koşarken dışarı yazılır. Aynı 3.541 kalemi çağrı başına 8 milisaniyelik ek gecikmeyle veriyor. Eksik kalan 59 kalem her üç ayarda da aynıdır ve tek bir sınıftan gelir — sonlanmadan önce boşaltılmamış kendi kaydı. Onu ne tutma ne akıtma kurtarır; kaydın sonlanmadan önce boşaltılmasını iş yükünün kendisi yapmak zorundadır.
Yarıçap Penceresi Kanıt Penceresinden Uzun
// belirtec.mjs — is yukunun omru ile aldigi kimligin gecerlilik suresi karsilastirilir. MODELDIR. import { CAGRI } from "./omur.mjs"; // Kimligin eristigi kalem sayisi, birinci derste kosturulan yuruyusten alinmistir: MODEL girdisi. const ERISIM = { toplama: 5, daraltilmis: 2 }; const TOPLAM_OMUR = CAGRI.reduce((t, c) => t + c.omur, 0) / 1000; // saniye // Bir ayarda acik kalem-saniye: her cagri icin kalem sayisi x belirtecin gecerli kaldigi sure. // Iptal secenegi belirteci is yuku sonlanir sonlanmaz gecersiz kilar. function olc({ V, iptal = false, dar = false }) { const kalem = ERISIM[dar ? "daraltilmis" : "toplama"]; let acik = 0, oluAcik = 0; for (const c of CAGRI) { const sure = iptal ? c.omur / 1000 : V; acik += kalem * sure; oluAcik += kalem * Math.max(0, sure - c.omur / 1000); } return { acik: Math.round(acik), oluAcik: Math.round(oluAcik), kalem, pay: `%${Math.round(100 * oluAcik / acik)}` }; } const gen = (B) => (h) => h.map((v, j) => j ? String(v).padStart(B[j]) : String(v).padEnd(B[0])) .join(""); const yz = gen([32, 12, 8, 18, 10, 28]); console.log(`${CAGRI.length} cagri, toplam calisma ${TOPLAM_OMUR.toFixed(0)} sn; her cagri ` + `kendi kisa omurlu kimligini aliyor`); console.log("\n" + yz(["ayar", "gecerlilik", "kalem", "acik kalem-saniye", "olu pay", "bedel"])); const AYAR = [ ["varsayilan belirtec", { V: 3600 }, "yok"], ["gecerlilik 900 sn", { V: 900 }, "yenileme 4 kat"], ["gecerlilik 300 sn", { V: 300 }, "yenileme 12 kat"], ["is yuku bitince iptal", { V: 3600, iptal: true }, `${CAGRI.length} iptal cagrisi`], ["iptal + daraltilmis kimlik", { V: 3600, iptal: true, dar: true }, "1 mesru is yeniden yazilir"], ]; for (const [ad, a, bedel] of AYAR) { const s = olc(a); console.log(yz([ad, a.iptal ? "omur kadar" : `${a.V} sn`, s.kalem, s.acik, s.pay, bedel])); } const varsayilan = olc({ V: 3600 }), iptalli = olc({ V: 3600, iptal: true }); const dar = olc({ V: 3600, iptal: true, dar: true }); const ortanca = [...CAGRI].map((c) => c.omur).sort((a, b) => a - b)[CAGRI.length >> 1]; console.log(`\nkanit penceresi ile yaricap penceresi ayni olcekte degil: ortanca cagri ` + `${ortanca} ms yasiyor, aldigi belirtec 3600 sn gecerli — ` + `${Math.round(3600000 / ortanca)} kat`); console.log(`varsayilan ayarda acik kalem-saniyenin ${varsayilan.pay}'i is yuku sonlandiktan ` + `SONRA gecen suredir; gecerliligi 300 sn yapmak bu payi ${olc({ V: 300 }).pay} yapiyor`); console.log(`is yuku bitince iptal acik kalem-saniyeyi ${varsayilan.acik} -> ${iptalli.acik} ` + `indiriyor, yani ${Math.round(varsayilan.acik / iptalli.acik)} kat; bedeli cagri basina bir ` + `iptal cagrisidir`); console.log(`kimligi daraltmak (5 -> 2 kalem) ayni pencereyi ${iptalli.acik} -> ${dar.acik} ` + `indiriyor; iki denetim carpim halinde calisir, toplam ` + `${Math.round(varsayilan.acik / dar.acik)} kat`);
400 cagri, toplam calisma 703 sn; her cagri kendi kisa omurlu kimligini aliyor ayar gecerlilik kalem acik kalem-saniye olu pay bedel varsayilan belirtec 3600 sn 5 7200000 %100 yok gecerlilik 900 sn 900 sn 5 1800000 %100 yenileme 4 kat gecerlilik 300 sn 300 sn 5 600000 %99 yenileme 12 kat is yuku bitince iptal omur kadar 5 3514 %0 400 iptal cagrisi iptal + daraltilmis kimlik omur kadar 2 1405 %0 1 mesru is yeniden yazilir kanit penceresi ile yaricap penceresi ayni olcekte degil: ortanca cagri 447 ms yasiyor, aldigi belirtec 3600 sn gecerli — 8054 kat varsayilan ayarda acik kalem-saniyenin %100'i is yuku sonlandiktan SONRA gecen suredir; gecerliligi 300 sn yapmak bu payi %99 yapiyor is yuku bitince iptal acik kalem-saniyeyi 7200000 -> 3514 indiriyor, yani 2049 kat; bedeli cagri basina bir iptal cagrisidir kimligi daraltmak (5 -> 2 kalem) ayni pencereyi 3514 -> 1405 indiriyor; iki denetim carpim halinde calisir, toplam 5125 kat
Tablo dersin asıl sayısını veriyor. İş yükü 447 milisaniye yaşıyor, aldığı belirteç 3.600 saniye geçerli: 8.054 kat. Kanıt penceresi milisaniyeyle ölçülürken yarıçap penceresi saatle ölçülüyor ve ikisi aynı olayın iki yüzü. Varsayılan ayarda açık kalem-saniyenin tamamına yakını — yuvarlanmış haliyle yüzde yüzü — iş yükü sonlandıktan sonra geçen süredir. Ortada koşan bir şey yokken geçerli bir kimlik bilgisi duruyor.
İki Pencerenin Ayrılması
Geçerlilik süresini kısaltmak doğru yönde ama yavaş bir kaldıraçtır: 3.600 saniyeden 300 saniyeye inmek açık kalem-saniyeyi on iki kat düşürüyor, ölü payı ise %100’den ancak %99’a iniyor ve karşılığında belirteç yenileme sayısı on iki katına çıkıyor. Oran değişmiyor çünkü sorun sürenin uzunluğu değil, sürenin iş yükünün ömrüne bağlı olmamasıdır.
Bağlamak işe yarıyor. İş yükü sonlanır sonlanmaz belirtecin iptal edilmesi açık kalem-saniyeyi 7.200.000’den 3.514’e indiriyor — 2.049 kat — ve ölü payı sıfırlıyor. Bedeli çağrı başına bir iptal çağrısıdır, yani günde 400 ek yönetim düzlemi çağrısı. Son satır ikinci kaldıracı ekliyor: kimliğin eriştiği kalem sayısını 5’ten 2’ye indirmek pencereyi 1.405’e çekiyor. İki denetim çarpım halinde çalışıyor; birlikte 5.125 kat. Bedeli bir meşru işin yeniden yazılmasıdır.
Dersin iki tablosu böylece aynı cümleye çıkıyor: kısa ömürlü iş yükünde kanıt penceresi kendiliğinden kapanır, yarıçap penceresi kendiliğinden kapanmaz. Birincisini açık tutmak için ödeme yapılır, ikincisini kapatmak için karar verilir.
Özet
- 400 çağrının ortanca ömrü 447 ms, %90’ı 3,2 saniyenin altında; dokuz kanıt kaleminin beşi yalnız iş yükü yaşarken alınabiliyor.
- Beş dakikalık gecikmeyle elle toplama 400 çağrının hiçbirine yetişmiyor; on saniyelik otomatik toplama 15’ine yetişiyor ve toplam 3.600 kalemin %2’sinden azını kazandırıyor.
- Ortamı 60 saniye tutmak kanıt alınabilen çağrıyı 400’e çıkarır ve 3.541 kalem toplar; bedeli 24.000 ortam-saniye, yani toplam çalışma süresinin 34 katıdır ve 300 saniyeye çıkarmak hiçbir ek kalem getirmez.
- Ortam içinden sürekli akıtma aynı 3.541 kalemi çağrı başına 8 ms ek gecikmeyle verir; her üç ayarda da eksik kalan 59 kalem, sonlanmadan önce boşaltılmamış kendi kaydıdır.
- Belirtecin geçerlilik süresi ortanca ömrün 8.054 katıdır ve varsayılan ayarda açık kalem-saniyenin tamamına yakını iş yükü sonlandıktan sonra geçer.
- Süreyi kısaltmak oranı değiştirmez (300 saniyede ölü pay hâlâ %99); iş yükü bitince iptal pencereyi 2.049 kat, kimliği daraltmak birlikte 5.125 kat indirir.
Sonraki Adım
Buraya kadar her ders tek bir yanlış kalemi seçip yarıçapını ölçtü: aşırı yetkili bir rol, açık bir kova, tutulmayan bir ortam, uzun ömürlü bir belirteç. Bunlar tek tek ölçüldü ama birbirine nasıl bağlandıkları yazılmadı. Sonraki ders bu bağları kalıp düzeyinde toplar: hangi kalem yanlışsa hangi yol açılıyor, o yol boyunca hangi kayıt düşüyor ve hangi denetim yolu kapatıyor.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.