Ders 13 / 16
Gösterge Tabloları ve Uyarılar
Toplanan ölçütün karara çevrilmesi: gösterge tablosu ile uyarının ayrı sorular yanıtladığının gösterilmesi, bir ay boyunca eşik ve pencere çiftlerinin taranarak yanlış uyarı ile kaçırılan olayın sayılması, eşiği yükseltmenin olay kaçırdığının ve pencereyi uzatmanın yalnız kısa gürültüyü kestiğinin ölçülmesi ve eşiğin K01'in aylık kesinti bütçesinden tüketim hızı olarak türetilmesi.
İçindekiler
Önceki iki ders neyin, hangi biçimde ve ne bedele toplanacağını kararlaştırdı. Toplanan sayı henüz kimseye bir şey söylemiyor. İki yoldan biriyle karara dönüşür: bir yerde çizilir ve ona bakan biri okur, ya da bir eşiği aşınca bakmayan birini çağırır. İki yol aynı sayıyı kullanır ve aynı eşikle çalışmaz.
Bu ders ikisini ayırır, sonra çağıran yolun tek parametresini — eşiği — bir tarama ile sınar ve nereden geldiğini Sistem Tasarımına Giriş kursunun aylık kesinti bütçesine bağlar.
İki Ayrı Soru
Bir gösterge tablosu (dashboard) zaten bakmakta olan birinin sorusunu yanıtlar. Sorusu şudur: şu an olağan mı, ve olağan değilse hangi yönde. Bu yüzden her panelin yanında beklenen aralık yazılır; aralıksız bir çizgi grafiği yalnız bir şeklin yukarı ya da aşağı gittiğini gösterir ve karar taşımaz.
Bir uyarı (alert) bakmayan birini çağırır. Sorusu başkadır: şimdi bir şey yapılmalı mı. Buradan tek kural çıkar — her uyarı bir eyleme bağlıdır. Karşılığında yapılacak bir iş yoksa toplanan ölçüt gösterge tablosuna girer, uyarıya değil. Bu ayrım araç seçimiyle ilgili değildir; iki ayrı soruya iki ayrı yanıt üretmekle ilgilidir.
İlk ekranın içeriği önceki dersin kategori listesinden çıkar: beş kategoriden birer ölçüt, ölçülen yükle birlikte. Bir başarım paneli yanında bir kullanım paneli olmadan okunamaz, çünkü aynı yanıt süresi 513,89 istek/s ile gece yarısı arasında aynı şeyi anlatmaz. Panelin beklenen aralığı ile uyarı eşiği aynı sayı değildir: aralık “olağan mı” sorusunu, eşik “birini uyandırmalı mıyım” sorusunu yanıtlar ve ikincisi her zaman daha geniştir.
Eşik Bir Tarama İşidir
Bir eşik iki hatayla ölçülür. Yanlış uyarı, gerçek bir olay yokken tetiklenen uyarıdır ve bedeli doğrudandır: her biri bir kişinin dikkatini alır, biriktiğinde uyarıların hepsinin güvenilirliğini düşürür. Kaçırılan uyarı, gerçek bir olayda tetiklenmeyen uyarıdır ve bedeli bütçeden ödenir.
Aşağıdaki düzenek bir modeldir: bir ayın 43.200 dakikasının her biri için hata sayısı tohumlu tam sayı aritmetiğiyle üretilir, altı gerçek olay bilinen bir takvimle yerleştirilir (IZ6) ve gürültü ayrı bir varsayımla tanımlanır (IZ7). Model gerçek bir arıza dağılımını öngörmez; sınadığı şey, aynı veri üzerinde farklı eşik ve pencere çiftlerinin ne yaptığıdır.
// uyari/tarama.mjs — uyari esigi taramasi MODELI. Bir ayin her dakikasi icin hata sayisi // tohumlu tam sayi aritmetigiyle uretilir; her esik-pencere cifti icin yanlis uyari, // kacirilan olay ve algilama gecikmesi sayilir. const DAKIKA = 43_200; // K01: 30 gunluk ay const ISTEK_DK = 30_833; // K01: 513,89 istek/s x 60 const TOHUM = 20260731; let s = TOHUM; const rast = (n) => Math.floor((((s = (s * 1664525 + 1013904223) >>> 0) / 2 ** 32)) * n); // IZ6 (varsayim): ayda alti gercek olay [baslangic dakikasi, sure, siddet (binde)] const OLAY = [[3000, 240, 8], [8000, 30, 15], [15000, 3, 30], [21000, 20, 120], [30000, 4, 800], [38000, 45, 400]]; // IZ7 (varsayim): gurultu modeli — taban hata ve 240 dakikada bir tek dakikalik zirve const hata = new Array(DAKIKA); for (let t = 0; t < DAKIKA; t += 1) { let h = rast(40); if (rast(240) === 0) h += rast(1000); hata[t] = h; } for (const [bas, sure, siddet] of OLAY) for (let t = bas; t < bas + sure; t += 1) hata[t] += Math.round((ISTEK_DK * siddet) / 1000); const oran = hata.map((h) => h / ISTEK_DK); const olayIcinde = (t) => OLAY.findIndex(([bas, sure]) => t >= bas && t < bas + sure); const kayipDk = OLAY.reduce((a, [, sure, siddet]) => a + (sure * siddet) / 1000, 0); console.log(`tohum ${TOHUM}, ${DAKIKA} dakika, ${OLAY.length} gercek olay, ` + `toplam ${OLAY.reduce((a, o) => a + o[1], 0)} dakika bozulma`); console.log(`olaylarin butceden yedigi: ${kayipDk.toFixed(2)} dakika-esdegeri ` + `(K01'in ariza payi 28,2 dakika)`); const gurultu = oran.filter((_, t) => olayIcinde(t) < 0); console.log(`gurultu: en yuksek dakika %${(gurultu.reduce((a, c) => (c > a ? c : a), 0) * 100).toFixed(2)}, ` + `%0,5 esigini asan ${gurultu.filter((o) => o >= 0.005).length} dakika, ` + `%2 esigini asan ${gurultu.filter((o) => o >= 0.02).length} dakika`); function tara(esik, pencere) { const r = { uyari: 0, yanlis: 0, yakalanan: new Set(), gecikme: [] }; let etkin = false; for (let t = pencere - 1; t < DAKIKA; t += 1) { let hepsi = true; for (let k = 0; k < pencere; k += 1) if (oran[t - k] < esik) hepsi = false; if (hepsi === false) { etkin = false; continue; } if (etkin) continue; etkin = true; r.uyari += 1; const i = olayIcinde(t); if (i < 0) r.yanlis += 1; else if (r.yakalanan.has(i) === false) { r.yakalanan.add(i); r.gecikme.push(t - OLAY[i][0]); } } return r; } const ESIK = [0.005, 0.01, 0.02, 0.05]; const PENCERE = [1, 3, 5]; console.log(`\n${"esik".padStart(7)}${"pencere".padStart(9)}${"uyari".padStart(7)}` + `${"yanlis uyari".padStart(14)}${"yakalanan olay".padStart(16)}${"kacirilan".padStart(11)}` + `${"ort. gecikme".padStart(14)}${"kacan butce dk".padStart(16)}`); for (const e of ESIK) for (const p of PENCERE) { const r = tara(e, p); const kacan = OLAY.filter((_, i) => r.yakalanan.has(i) === false) .reduce((a, [, sure, siddet]) => a + (sure * siddet) / 1000, 0); const ort = r.gecikme.length ? r.gecikme.reduce((a, c) => a + c, 0) / r.gecikme.length : 0; console.log(`${("%" + (e * 100).toFixed(1)).padStart(7)}${(p + " dk").padStart(9)}` + `${String(r.uyari).padStart(7)}${String(r.yanlis).padStart(14)}` + `${`${r.yakalanan.size}/${OLAY.length}`.padStart(16)}` + `${String(OLAY.length - r.yakalanan.size).padStart(11)}` + `${(ort.toFixed(1) + " dk").padStart(14)}${kacan.toFixed(2).padStart(16)}`); }
tohum 20260731, 43200 dakika, 6 gercek olay, toplam 342 dakika bozulma olaylarin butceden yedigi: 26.06 dakika-esdegeri (K01'in ariza payi 28,2 dakika) gurultu: en yuksek dakika %3.34, %0,5 esigini asan 149 dakika, %2 esigini asan 69 dakika esik pencere uyari yanlis uyari yakalanan olay kacirilan ort. gecikme kacan butce dk %0.5 1 dk 155 149 6/6 0 0.0 dk 0.00 %0.5 3 dk 6 0 6/6 0 2.0 dk 0.00 %0.5 5 dk 4 0 4/6 2 4.0 dk 3.29 %1.0 1 dk 131 125 6/6 0 2.0 dk 0.00 %1.0 3 dk 5 0 5/6 1 2.0 dk 1.92 %1.0 5 dk 3 0 3/6 3 4.0 dk 5.21 %2.0 1 dk 74 69 5/6 1 2.4 dk 0.45 %2.0 3 dk 4 0 4/6 2 2.0 dk 2.37 %2.0 5 dk 2 0 2/6 4 4.0 dk 5.66 %5.0 1 dk 3 0 3/6 3 0.0 dk 2.46 %5.0 3 dk 3 0 3/6 3 2.0 dk 2.46 %5.0 5 dk 2 0 2/6 4 4.0 dk 5.66
İki Hatayı Aynı Anda Küçültmenin Yolu
Tablo iki eksende okunur ve ikisi aynı şey değildir.
Eşiği yükseltmek yanlış uyarıyı da gerçek olayı da keser. Yüzde 0,5 eşiği ve tek dakikalık pencerede ayda 155 uyarı tetikleniyor, 149’u yanlış — günde beş kez, hiçbir şey olmadan. Eşik yüzde 5’e çıkarıldığında yanlış uyarı sıfırlanıyor, ama yakalanan olay 6’dan 3’e düşüyor ve kaçan olaylar bütçeden 2,46 dakika yiyor. Yanlış uyarıyı eşikle kesmenin bedeli budur: gürültünün üstüne çıkan eşik, hafif olayların da üstündedir.
Pencereyi uzatmak yalnız kısa süreli gürültüyü keser. Aynı yüzde 0,5 eşiğinde pencere üç dakikaya çıkarıldığında yanlış uyarı 149’dan 0’a iniyor, altı olayın altısı da yakalanmayı sürdürüyor ve kaçan bütçe 0,00 dakika kalıyor. Bedeli yalnızca iki dakikalık algılama gecikmesidir. Bunun nedeni modelde yazılıdır: gürültü tek dakikalıktır, gerçek olaylar ise en az üç dakika sürer. Pencere, gürültünün süresinden uzun ve en kısa gerçek olaydan kısa seçilir.
Sınırı beş dakikalık pencere gösteriyor: aynı eşikte yanlış uyarı yine 0, ama üç ve dört dakikalık iki olay artık görünmüyor ve bütçeden 3,29 dakika kaçıyor. Pencere en kısa olayı geçtiği anda kaçırma başlar.
Bir satır da yanıltıcı bir başarıyı gösteriyor. Yüzde 1,0 eşiği ve tek dakikalık pencerede altı olayın altısı yakalanmış görünüyor, oysa birinci olayın şiddeti yüzde 0,8’dir ve eşiğin altında kalır. Yakalanmasının nedeni, o olayın 240 dakikası içine bir gürültü zirvesinin denk gelmesidir. Bu bir tanı değil rastlantıdır ve tarama tablosunda ancak nedeni bilinerek okunur.
Eşik Nereden Gelir
Tarama en iyi çifti bulur ama eşiğin hangi sayı olması gerektiğini söylemez; yüzde 0,5 de yüzde 2 de savunulabilir görünür. Sayının kaynağı ölçütün kendisinde değil, hizmetin taahhüdündedir. Sistem Tasarımına Giriş kursu aylık bütçeyi kurdu: yüzde 99,9 hedefi 43,2 dakika, bunun 15,0 dakikası planlı işlere, 28,2 dakikası arızaya. Yüzde aritmetiği burada tekrarlanmaz; bu üç sayı girdidir. Arıza payı bir aya bölündüğünde sürekli olarak izin verilen bir hata oranı çıkar ve gözlenen oranın bu orana bölümü tüketim hızıdır.
// uyari/butce.mjs — uyari esiginin K01'in kesinti butcesinden turetilmesi: tuketim hizi, // esigin hata orani karsiligi ve uyari tetiklendiginde harcanmis butce. Hepsi aritmetiktir. const AY_DK = 43_200; // K01: 30 gunluk ay (dakika) const AYLIK = 43.2; // K01: %99,9 icin aylik kesinti butcesi (dakika) const ARIZA_PAYI = 28.2; // K01: butcenin ariza payi (dakika) const izinli = ARIZA_PAYI / AY_DK; // istek tabanli izin verilen hata orani const b = (x, n = 2) => x.toFixed(n); console.log(`aylik butce ${AYLIK} dk, ariza payi ${ARIZA_PAYI} dk, ay ${AY_DK} dk`); console.log(`izin verilen surekli hata orani = %${b(izinli * 100, 4)} (tuketim hizi 1,0)`); const PENCERE = [["5 dk", 5], ["1 sa", 60], ["6 sa", 360]]; console.log(`\n${"tuketim hizi".padStart(13)}${"hata orani esigi".padStart(18)}` + `${"ariza payi biter".padStart(18)}` + `${PENCERE.map(([a]) => `${a} penceresi`.padStart(16)).join("")}`); for (const hiz of [1, 3, 6, 14.4]) { const oran = izinli * hiz; const satir = PENCERE.map(([, dk]) => `%${b((100 * dk * oran) / ARIZA_PAYI)}`.padStart(16)).join(""); console.log(`${b(hiz, 1).padStart(13)}${("%" + b(oran * 100, 3)).padStart(18)}` + `${(b(30 / hiz, 2) + " gun").padStart(18)}${satir}`); } console.log(`pencere sutunu: uyari tetiklendiginde ariza payinin ne kadari harcanmistir`); const TARAMA = [0.005, 0.01, 0.02, 0.05]; console.log(`\nonceki taramanin esikleri butce diliyle:`); for (const e of TARAMA) console.log(` %${b(e * 100, 1)} esigi -> tuketim hizi ${b(e / izinli, 1)}, ` + `bu hizda ariza payi ${b(ARIZA_PAYI / (e * 1440), 2)} gunde biter`); // IZ6 (varsayim): onceki blogun alti olayi [sure (dk), siddet (binde)] const OLAY = [[240, 8], [30, 15], [3, 30], [20, 120], [4, 800], [45, 400]]; console.log(`\n${"olay".padStart(5)}${"sure".padStart(8)}${"siddet".padStart(9)}` + `${"tuketim hizi".padStart(14)}${"yedigi dk".padStart(12)}${"ariza payinin".padStart(15)}` + `${"bu hizda payin bitisi".padStart(23)}`); let toplam = 0; OLAY.forEach(([sure, siddet], i) => { const oran = siddet / 1000, yedi = sure * oran; toplam += yedi; console.log(`${String(i + 1).padStart(5)}${(sure + " dk").padStart(8)}` + `${("%" + b(oran * 100, 1)).padStart(9)}${b(oran / izinli, 1).padStart(14)}` + `${b(yedi).padStart(12)}${("%" + b((100 * yedi) / ARIZA_PAYI, 1)).padStart(15)}` + `${(b(ARIZA_PAYI / (oran * 1440), 2) + " gun").padStart(23)}`); }); console.log(`toplam ${b(toplam)} dk, ariza payinin %${b((100 * toplam) / ARIZA_PAYI, 1)}'i; ` + `kalan pay ${b(ARIZA_PAYI - toplam)} dk`);
aylik butce 43.2 dk, ariza payi 28.2 dk, ay 43200 dk
izin verilen surekli hata orani = %0.0653 (tuketim hizi 1,0)
tuketim hizi hata orani esigi ariza payi biter 5 dk penceresi 1 sa penceresi 6 sa penceresi
1.0 %0.065 30.00 gun %0.01 %0.14 %0.83
3.0 %0.196 10.00 gun %0.03 %0.42 %2.50
6.0 %0.392 5.00 gun %0.07 %0.83 %5.00
14.4 %0.940 2.08 gun %0.17 %2.00 %12.00
pencere sutunu: uyari tetiklendiginde ariza payinin ne kadari harcanmistir
onceki taramanin esikleri butce diliyle:
%0.5 esigi -> tuketim hizi 7.7, bu hizda ariza payi 3.92 gunde biter
%1.0 esigi -> tuketim hizi 15.3, bu hizda ariza payi 1.96 gunde biter
%2.0 esigi -> tuketim hizi 30.6, bu hizda ariza payi 0.98 gunde biter
%5.0 esigi -> tuketim hizi 76.6, bu hizda ariza payi 0.39 gunde biter
olay sure siddet tuketim hizi yedigi dk ariza payinin bu hizda payin bitisi
1 240 dk %0.8 12.3 1.92 %6.8 2.45 gun
2 30 dk %1.5 23.0 0.45 %1.6 1.31 gun
3 3 dk %3.0 46.0 0.09 %0.3 0.65 gun
4 20 dk %12.0 183.8 2.40 %8.5 0.16 gun
5 4 dk %80.0 1225.5 3.20 %11.3 0.02 gun
6 45 dk %40.0 612.8 18.00 %63.8 0.05 gun
toplam 26.06 dk, ariza payinin %92.4'i; kalan pay 2.14 dk
Birinci tablo eşiği bir zaman ölçüsüne çeviriyor. Tüketim hızı 1,0 bütçeyi tam ay sonunda bitirir; 14,4 iki gün içinde bitirir. Eşik seçmek, “hangi hızda uyandırılmak istiyorum” sorusuna yanıt vermektir ve pencere sütunu bedelini gösterir: 14,4 hızında altı saatlik bir pencereyle beklemek, uyarı geldiğinde arıza payının yüzde 12’sinin çoktan harcanmış olması demektir. Kısa pencere erken uyandırır ve gürültüye açıktır; uzun pencere sessizdir ve pahalıdır. Bu, taramada ölçülen ödünleşimin bütçe cinsinden yazılmış hâlidir.
İkinci blok taramanın dört eşiğini aynı dile çeviriyor ve keyfiliği ortadan kaldırıyor: yüzde 0,5 eşiği 7,7 tüketim hızı demektir, yani o oran sürerse arıza payı 3,92 günde biter. Yüzde 5 eşiği 76,6 hız ve 0,39 gündür — yani bu eşiğe kadar beklemek, ayın bütçesinin dokuz saatte tükenmesine izin vermektir. Eşik böyle yazıldığında tartışma bir tercih tartışması olmaktan çıkar.
Üçüncü tablo kaçırmanın bedelini kalem kalem veriyor. Altı olay arıza payının yüzde 92,4’ünü yedi ve geriye 2,14 dakika kaldı. En pahalı olay en şiddetli olan değil, şiddeti ile süresinin çarpımı en büyük olandır: kırk beş dakika süren yüzde 40’lık olay tek başına payın yüzde 63,8’ini aldı. Buna karşılık yüzde 0,8 şiddetindeki olay — taramada yüzde 1 ve üstü eşiklerin kaçırdığı olay — payın yüzde 6,8’ini yedi. Bir olayın uyarı üretmemesi onun ucuz olduğu anlamına gelmez; hafif ve uzun bir bozulma, kısa ve sert bir olaydan daha fazla bütçe yiyebilir. Bu yüzden bütçe tabanlı uyarı düzeni tek bir eşik değil, biri kısa pencereli yüksek hız, öteki uzun pencereli düşük hız olmak üzere en az iki eşik ister.
Özet
- Gösterge tablosu bakmakta olanın “olağan mı” sorusunu, uyarı bakmayanın “şimdi bir şey yapmalı mıyım” sorusunu yanıtlar; panelin beklenen aralığı ile uyarı eşiği aynı sayı değildir.
- Her uyarı bir eyleme bağlıdır; karşılığında yapılacak iş yoksa ölçüt gösterge tablosuna girer.
- Eşiği yükseltmek iki hatayı birden değiştirir: yüzde 0,5 ve 1 dakikada ayda 155 uyarının 149’u yanlış; yüzde 5’te yanlış uyarı 0’a iner ama üç olay kaçar ve bütçeden 2,46 dakika gider.
- Pencereyi uzatmak yalnız kısa gürültüyü keser: yüzde 0,5 ve 3 dakikada yanlış uyarı 149’dan 0’a iner, altı olayın altısı yakalanır, bedeli 2,0 dakikalık algılama gecikmesidir. Pencere en kısa gerçek olayı geçerse (5 dakika) iki olay kaçar ve 3,29 dakika bütçe gider.
- Eşik bütçeden türetilir: 28,2 dakikalık arıza payı sürekli yüzde 0,0653 hata oranına denktir ve gözlenen oranın buna bölümü tüketim hızıdır; yüzde 0,5 eşiği 7,7 hız, yani 3,92 günde biten pay demektir.
- Kaçırılan olayın bedeli süre ile şiddetin çarpımıdır: 45 dakikalık yüzde 40’lık olay payın yüzde 63,8’ini, 240 dakikalık yüzde 0,8’lik olay yüzde 6,8’ini yer.
Sonraki Adım
Buraya kadar ölçülen her şey, sistemin gerçek trafiği altında kendiliğinden oluşan sayılardı. Bu sayılar yalnız olmuş olanı anlatır: bugünkü yükte ne olduğunu söyler, yarınki yükte ne olacağını söylemez. Uyarı eşiği bugünün trafiğine göre ayarlanmış bir eşiktir; trafik iki katına çıktığında hangi ölçütün önce eşiği aşacağı, sistemin hangi noktada doyuma varacağı ve ani bir sıçramadan sonra kendine gelip gelemeyeceği toplanan veriden okunamaz, çünkü o durum hiç yaşanmamıştır. Sonraki ders bu boşluğu doldurur: yükü beklemek yerine üretir. Üç ayrı test üç ayrı soru sorar ve her biri başka bir belirtiyi ortaya çıkarır.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.