Ders 09 / 18
Gösterge Tablosu Tasarımı
Bir gösterge tablosunun soru kümesine karşı denetlenmesi: kaç panelin bir soruya yanıt verdiği, kaç panelin hiçbir soruya yanıt vermediği, kaç sorunun panelsiz kaldığı ve bir soruya yanıt bulmak için gezilen panel sayısının yeniden düzenlemeyle nasıl düştüğü.
İçindekiler
Sözleşme kurulduktan sonra sorular yanıtlanabilir hâle geldi. Yanıtın nasıl okunacağı ise ayrı bir iş: bir olay sırasında kimse sorgu yazmaz, önüne çıkan panellere bakar. Panonun kendisi de zamanla büyür — her olaydan sonra bir panel eklenir, hiçbir olaydan sonra panel silinmez, ve iki yıl sonra ortaya kimsenin bütününü bilmediği bir sayfa çıkar.
Bu ders bir panoyu soru kümesine karşı denetler. Ölçülen üç sayı şudur: kaç panel en az bir soruya yanıt veriyor, kaç panel hiçbir soruya yanıt vermiyor, kaç soru panelsiz kalıyor. Dördüncü sayı bunlardan çıkar: bir soruya yanıt bulmak kaç panel gezmeyi gerektiriyor.
Panelin Yanıtladığı Soru
Bir panel bir soruyu üç koşul birden sağlarsa yanıtlar. Ölçüt aynı olmalıdır: hata oranı sorusuna gecikme paneli yanıt vermez. Boyut sorunun istediği kırılımı içermelidir: “hangi servis bozuk” sorusuna toplam hata oranı paneli yanıt veremez, çünkü kırılım paneldeki sorguda yok. Çözünürlük sorunun istediği kadar ince olmalıdır: beş dakikalık kovalarla çizilen bir panel, bir dakikalık pencereyi soran soruya yanıt vermez.
Bu üç koşul aşağıdaki modelde birer alan olarak duruyor. Bölgesel ölçüm ağının panel ve soru listesi kurgudur; soru sıklıkları, panonun bakılma biçimini ağırlıklandırmak için konmuştur.
// pano/pano.mjs — bir gosterge tablosunun ve isletimde sorulan soru kumesinin MODELI. // Panel: [ad, olcut, boyutlar, cozunurluk sn, sorgunun taradigi seri]. Soru: [ad, olcut, gereken // boyut, gereken en kaba cozunurluk, kirk olayin kacinda soruldugu]. IG13: panel katalogu, soru // kumesi ve soru sikliklari kurgudur; pano iki yil boyunca eklemelerle buyumustur. IG14: bir panel // bir soruyu ancak ayni olcutu, sorunun istedigi boyutu ve o cozunurlugu tasiyorsa yanitlar. // IG15: bir paneli gozle tarayip gecmek 8 saniye; panelsiz soru icin elle sorgu yazmak 4 dakika. export const PANEL = [ ["kume islemci kullanimi", "islemci", ["dugum"], 60, 120], ["kume bellek kullanimi", "bellek", ["dugum"], 60, 120], ["dugum disk doluluk", "disk", ["dugum"], 300, 120], ["toplam istek (gunluk)", "istek", [], 3600, 1], ["istek sayisi", "istek", ["servis"], 60, 5], ["hata orani (toplam)", "hata_orani", [], 60, 1], ["surum bilgisi", "surum", [], 3600, 5], ["kayit sayisi (bugun)", "kayit", [], 3600, 1], ["p95 gecikme (toplam)", "gecikme", [], 60, 1], ["p95 gecikme (servis)", "gecikme", ["servis"], 60, 5], ["adim suresi (servis)", "adim_suresi", ["servis"], 60, 5], ["istemci surum dagilimi", "istemci", ["surum"], 3600, 40], ["dugum sayisi", "dugum_sayisi", [], 300, 1], ["kuyruk derinligi", "kuyruk", ["servis"], 60, 5], ["onbellek isabet orani", "onbellek", ["servis"], 60, 5], ["cop toplama suresi", "cop_toplama", ["dugum"], 60, 120], ["hata orani (servis)", "hata_orani", ["servis"], 60, 5], ["yeniden deneme sayisi", "yeniden_deneme", [], 60, 1], ["ag trafigi", "ag", ["dugum"], 60, 240], ["dagitim olaylari", "dagitim", ["servis"], 60, 5], ["gecelik toplu is suresi", "toplu_is", [], 3600, 1], ["saatlik okuma sayisi", "okuma", [], 3600, 1], ["bagimlilik gecikmesi", "adim_suresi", ["bagimlilik"], 60, 12], ["hata orani (bolge)", "hata_orani", ["bolge"], 300, 30], ["sayac tipi dagilimi", "sayac_tipi", ["tip"], 3600, 8], ["islemci (tek dugum)", "islemci", ["dugum"], 60, 1], ]; // Soru kumesi: bir olay sirasinda sirasiyla sorulanlar (onem sirasi = dizi sirasi). export const SORU = [ ["uye etkileniyor mu", "hata_orani", [], 60, 40], ["hangi servis bozuk", "hata_orani", ["servis"], 60, 38], ["gecikme hangi adimda", "adim_suresi", ["servis"], 60, 30], ["trafik degisti mi", "istek", ["servis"], 60, 25], ["yeni dagitim var mi", "dagitim", ["servis"], 60, 22], ["kuyruk birikiyor mu", "kuyruk", ["servis"], 60, 16], ["yeniden denemeler artti mi", "yeniden_deneme", [], 60, 12], ["dis bagimlilik yavas mi", "adim_suresi", ["bagimlilik"], 60, 10], ["hata bir bolgeye mi ozgu", "hata_orani", ["bolge"], 60, 9], ["gecelik toplu is etkilendi mi", "toplu_is", [], 3600, 6], ["onbellek isabeti dustu mu", "onbellek", ["servis"], 60, 5], ["hangi abone grubu etkilendi", "hata_orani", ["abone_grubu"], 60, 4], ]; export const PANEL_SN = 8, SORGU_DK = 4, OLAY = 40; export const yanitlar = (p, s) => p[1] === s[1] && s[2].every((b) => p[2].includes(b)) && p[3] <= s[3]; export const denetle = (paneller) => { const bulus = SORU.map((s) => paneller.findIndex((p) => yanitlar(p, s)) + 1); // 0: panel yok const kullanilan = paneller.filter((p) => SORU.some((s) => yanitlar(p, s))); const agirlik = SORU.reduce((a, s, i) => a + (bulus[i] ? s[4] : 0), 0); const bakis = SORU.reduce((a, s, i) => a + (bulus[i] ? s[4] * bulus[i] : 0), 0) / agirlik; const dk = (SORU.reduce((a, s, i) => a + (bulus[i] ? s[4] * bulus[i] * PANEL_SN : s[4] * SORGU_DK * 60), 0)) / OLAY / 60; return { panel: paneller.length, kullanilan: kullanilan.length, sus: paneller.length - kullanilan.length, yanitlanan: bulus.filter((b) => b > 0).length, panelsiz: SORU.filter((_, i) => bulus[i] === 0).map((s) => s[0]), bakis, dk, seri: paneller.reduce((a, p) => a + p[4], 0), bulus }; }; if (import.meta.filename === process.argv[1]) { const d = denetle(PANEL); console.log(`${d.panel} panel, ${SORU.length} soru`); console.log(`bir soruya yanit veren panel ${d.kullanilan}, hicbir soruya yanit vermeyen ${d.sus}`); console.log(`yanitlanan soru ${d.yanitlanan}, panelsiz soru ${d.panelsiz.length}: ${d.panelsiz.join(", ")}`); console.log(`bakis suresi (soru sikligiyla agirlikli gezilen panel) ${d.bakis.toFixed(1)}, ` + `en kotu ${Math.max(...d.bulus)}`); console.log(`olay basina pano suresi ${d.dk.toFixed(1)} dk, pano acilisinda taranan seri ${d.seri}\n`); console.log(`${"soru".padEnd(30)}${"gezilen panel".padStart(14)} yanit veren panel`); SORU.forEach((s, i) => console.log(`${s[0].padEnd(30)}${(d.bulus[i] || "-").toString().padStart(14)} ` + `${d.bulus[i] ? PANEL[d.bulus[i] - 1][0] : "yok"}`)); const sus = PANEL.filter((p) => !SORU.some((s) => yanitlar(p, s))); console.log(`\nsus paneller (${sus.length}): ${sus.map((p) => p[0]).join(", ")}`); console.log(`sus panellerin taradigi seri ${sus.reduce((a, p) => a + p[4], 0)} ` + `(toplamin %${(sus.reduce((a, p) => a + p[4], 0) / d.seri * 100).toFixed(0)}'i)`); }
26 panel, 12 soru bir soruya yanit veren panel 10, hicbir soruya yanit vermeyen 16 yanitlanan soru 10, panelsiz soru 2: hata bir bolgeye mi ozgu, hangi abone grubu etkilendi bakis suresi (soru sikligiyla agirlikli gezilen panel) 13.0, en kotu 23 olay basina pano suresi 10.1 dk, pano acilisinda taranan seri 859 soru gezilen panel yanit veren panel uye etkileniyor mu 6 hata orani (toplam) hangi servis bozuk 17 hata orani (servis) gecikme hangi adimda 11 adim suresi (servis) trafik degisti mi 5 istek sayisi yeni dagitim var mi 20 dagitim olaylari kuyruk birikiyor mu 14 kuyruk derinligi yeniden denemeler artti mi 18 yeniden deneme sayisi dis bagimlilik yavas mi 23 bagimlilik gecikmesi hata bir bolgeye mi ozgu - yok gecelik toplu is etkilendi mi 21 gecelik toplu is suresi onbellek isabeti dustu mu 15 onbellek isabet orani hangi abone grubu etkilendi - yok sus paneller (16): kume islemci kullanimi, kume bellek kullanimi, dugum disk doluluk, toplam istek (gunluk), surum bilgisi, kayit sayisi (bugun), p95 gecikme (toplam), p95 gecikme (servis), istemci surum dagilimi, dugum sayisi, cop toplama suresi, ag trafigi, saatlik okuma sayisi, hata orani (bolge), sayac tipi dagilimi, islemci (tek dugum) sus panellerin taradigi seri 814 (toplamin %95'i)
Yirmi altı panelin onu bir soruya yanıt veriyor, on altısı hiçbirine. Bu on altı panel yanlış değil — küme işlemcisi, düğüm belleği, istemci sürüm dağılımı hepsi doğru sayıları çiziyor. Ama işletimin bu soru kümesinde bir karşılıkları yok, dolayısıyla olay sırasında bakan kişi için gezilecek yoldurlar.
Bedelleri de yalnız yer kaplamak değil: pano açıldığında taranan 859 serinin 814’ü, yani yüzde 95’i, hiçbir soruya yanıt vermeyen panellerden geliyor. Sorgu maliyetinin neredeyse tamamı karşılıksız. Oranın bu kadar yüksek olmasının nedeni de okunabilir: düğüm kırılımlı paneller yüz yirmişer seri tarıyor, servis kırılımlı paneller beşer. Kırılımın inceliği panelin görsel büyüklüğüne yansımaz, sorgu maliyetine yansır.
“Süs” nitelemesi mutlak değildir, soru kümesine görelidir. Küme işlemcisi ve düğüm belleği panelleri kapasite sorularının tam karşılığıdır; buradaki denetim kapasiteyi değil olay sırasında sorulanları ölçüyor. Bu yüzden bu paneller silinmez, ayrı bir panoya taşınır — ve o panonun kendi denetimi kendi soru kümesiyle yapılır. Aynı ayrım panodaki iki işlemci panelinin niye yan yana durduğunu da açıklıyor: biri küme, öteki tek düğüm için eklenmiş, ikisi de aynı soruyu yanıtlıyor ve olay panosunda ikisinin de karşılığı yok.
İki soru panelsiz. Bölge kırılımı sorusunun panelsiz kalması ilk bakışta şaşırtıcı, çünkü panoda bölge kırılımlı bir hata oranı paneli var — ama beş dakikalık çözünürlükle çiziliyor ve soru bir dakikalık pencere istiyor. Panel var, yanıt yok. İkinci panelsiz soru başka bir yere bağlanıyor: abone grubu boyutu hiç toplanmamış, dolayısıyla o soru pano düzeniyle değil ancak enstrümantasyonla açılabilir.
Bakış süresi bu düzende 13,0 panel. Yani bir soruya yanıt bulmak için, sorunun sıklığıyla ağırlıklandırıldığında, ortalama on üç panel gözle taranıyor; en kötü soruda yirmi üç. Panel başına sekiz saniyeyle bu, olay başına 10,1 dakika eder.
Yeniden Düzen
Düzenleme dört adımda yapılır ve her adımdan sonra aynı denetim yeniden koşar.
// pano/duzen.mjs — panonun soru kumesine gore yeniden duzenlenmesi. Dort asama sirayla uygulanir // ve her asamada ayni denetim yeniden kosar. IG16: sus paneller silinmez, olay panosundan // cikarilip kapasite panosuna tasinir; bedeli o panonun kendi seri taramasidir. import { PANEL, SORU, denetle, yanitlar, OLAY, SORGU_DK } from "./pano.mjs"; const kopya = PANEL.map((p) => [...p]); const cozunurluk = kopya.map((p) => (p[0] === "hata orani (bolge)" ? [p[0], p[1], p[2], 60, p[4]] : p)); const ayiklanmis = cozunurluk.filter((p) => SORU.some((s) => yanitlar(p, s))); // Duzen kurali: sorular siklik sirasinda gezilir, her sorunun yanitini veren ilk yerlesmemis // panel siraya konur; artakalanlar sonuna eklenir. const dizili = []; for (const s of SORU) { const p = ayiklanmis.find((x) => yanitlar(x, s) && !dizili.includes(x)); if (p) dizili.push(p); } for (const p of ayiklanmis) if (!dizili.includes(p)) dizili.push(p); const ASAMA = [["once", kopya], ["cozunurluk duzeltmesi", cozunurluk], ["sus paneller ayrildi", ayiklanmis], ["soru sirasina dizildi", dizili]]; console.log(`${"asama".padEnd(24)}${"panel".padStart(7)}${"sus".padStart(5)}${"yanitlanan".padStart(12)}` + `${"panelsiz".padStart(10)}${"bakis".padStart(8)}${"olay/dk".padStart(9)}${"seri".padStart(7)}`); const sonuc = ASAMA.map(([ad, p]) => { const d = denetle(p); console.log(`${ad.padEnd(24)}${String(d.panel).padStart(7)}${String(d.sus).padStart(5)}` + `${String(d.yanitlanan).padStart(12)}${String(d.panelsiz.length).padStart(10)}` + `${d.bakis.toFixed(1).padStart(8)}${d.dk.toFixed(1).padStart(9)}${String(d.seri).padStart(7)}`); return d; }); const [ilk, son] = [sonuc[0], sonuc[3]]; console.log(`\n${"soru".padEnd(30)}${"once".padStart(6)}${"sonra".padStart(7)}`); SORU.forEach((s, i) => console.log(`${s[0].padEnd(30)}${(ilk.bulus[i] || "-").toString().padStart(6)}` + `${(son.bulus[i] || "-").toString().padStart(7)}`)); console.log(`\nbakis suresi ${ilk.bakis.toFixed(1)} panelden ${son.bakis.toFixed(1)} panele, ` + `olay basina pano suresi ${ilk.dk.toFixed(1)} dk'dan ${son.dk.toFixed(1)} dk'ya indi`); console.log(`kirk olayda kazanilan ${((ilk.dk - son.dk) * OLAY).toFixed(0)} dakika; ` + `taranan seri ${ilk.seri} yerine ${son.seri}`); const kalan = SORU.filter((s) => !dizili.some((p) => yanitlar(p, s))); console.log(`hala panelsiz ${kalan.length} soru: ${kalan.map((s) => s[0]).join(", ")} — ` + `${kalan.reduce((a, s) => a + s[4], 0)} olayda ${kalan.reduce((a, s) => a + s[4] * SORGU_DK, 0)} dakika elle sorgu`);
asama panel sus yanitlanan panelsiz bakis olay/dk seri once 26 16 10 2 13.0 10.1 859 cozunurluk duzeltmesi 26 15 11 1 13.5 10.0 859 sus paneller ayrildi 11 0 11 1 4.8 3.8 75 soru sirasina dizildi 11 0 11 1 4.1 3.3 75 soru once sonra uye etkileniyor mu 6 1 hangi servis bozuk 17 2 gecikme hangi adimda 11 3 trafik degisti mi 5 4 yeni dagitim var mi 20 5 kuyruk birikiyor mu 14 6 yeniden denemeler artti mi 18 7 dis bagimlilik yavas mi 23 8 hata bir bolgeye mi ozgu - 9 gecelik toplu is etkilendi mi 21 10 onbellek isabeti dustu mu 15 11 hangi abone grubu etkilendi - - bakis suresi 13.0 panelden 4.1 panele, olay basina pano suresi 10.1 dk'dan 3.3 dk'ya indi kirk olayda kazanilan 273 dakika; taranan seri 859 yerine 75 hala panelsiz 1 soru: hangi abone grubu etkilendi — 4 olayda 16 dakika elle sorgu
İlk adım tek bir panelin çözünürlüğünü düzeltiyor ve yanıtlanan soru sayısı 10’dan 11’e çıkıyor. Dikkat çeken şey bakış süresinin bu adımda artması: 13,0’dan 13,5’e. Yeni yanıtlanan soru panonun yirmi dördüncü sırasındaki bir panelde bulunuyor ve ortalamayı yukarı çekiyor. Bir soruyu daha yanıtlamak, o yanıtın bulunabilir olduğu anlamına gelmiyor.
Asıl düşüş ikinci adımda. Hiçbir soruya yanıt vermeyen on beş panel olay panosundan çıkarılıp kapasite panosuna taşınınca panel sayısı 26’dan 11’e, bakış süresi 13,5’ten 4,8’e, taranan seri 859’dan 75’e iniyor. Üçüncü adım panelleri soru sıklığı sırasına dizerek bakış süresini 4,1’e indiriyor; artık her soru kendi sırasındaki panelde bulunuyor ve en sık sorulan soru ilk panelde.
Toplam kazanç olay başına 10,1 dakikadan 3,3 dakikaya düşen pano süresidir; kırk olayda 273 dakika. Bu sürenin tamamı olay uzunluğuna eklenen süredir — panelde gezinen kişi o sırada başka bir şey yapmıyor.
Bakış süresinin panel sayısıyla ölçülmesi bir sadeleştirmedir: gerçekte kişi panoyu baştan sona taramaz, bildiği yere atlar. Sadeleştirmenin tuttuğu şey oran: bilmeyen ya da uykudan kalkmış birinin gezindiği panel sayısı, panonun düzeniyle doğru orantılıdır. Sayının kendisi değil, iki düzen arasındaki üç kata yakın fark okunmalıdır.
Kalan Soru
Düzenden sonra panosuz kalan tek soru abone grubu kırılımıdır ve pano düzenlemesiyle kapanmaz. Kırk olayın dördünde soruluyor, her seferinde elle sorgu yazmak gerekiyor ve dört dakika sürüyor: kırk olayda 16 dakika. Bu sayı küçük görünür, ama sorunun yanıtlanma biçimi de önemlidir — elle yazılan sorgunun sonucu panoya girmez, bir sonraki olayda aynı sorgu yeniden yazılır.
Denetimin çıkardığı üç sayı bir arada okunur. Hiçbir soruyu yanıtlamayan veri maliyettir: panelin yüzde 62’si, sorgu maliyetinin yüzde 95’i. Yanıtsız kalan soru risktir: iki sorudan biri yanlış çözünürlükle, öteki toplanmamış boyutla kapalıydı. Yanıtın yeri de maliyettir: aynı veri, aynı paneller, yalnız sıra değişerek olay başına altı dakikadan fazla kazandırdı.
Özet
- Bir panel bir soruyu ancak üç koşul birden sağlarsa yanıtlar: aynı ölçüt, sorunun istediği boyut, sorunun istediği çözünürlük.
- Yirmi altı panelin 16’sı hiçbir soruya yanıt vermiyordu; bu paneller pano açılışında taranan 859 serinin 814’ünü, yani sorgu maliyetinin yüzde 95’ini oluşturuyordu.
- On iki sorunun ikisi panelsizdi: biri yanlış çözünürlük (panel vardı, yanıt yoktu), öteki hiç toplanmamış boyut.
- Çözünürlük düzeltmesi yanıtlanan soruyu 11’e çıkardı ama bakış süresini 13,0’dan 13,5’e yükseltti; yanıtın var olması bulunabilir olması demek değil.
- Süs panellerin ayrılması ve panellerin soru sırasına dizilmesi bakış süresini 4,1 panele, olay başına pano süresini 10,1 dakikadan 3,3 dakikaya indirdi; kırk olayda 273 dakika.
- Bir panelin süs olması mutlak değil soru kümesine göredir: ayrılan paneller silinmez, kendi soru kümesi olan ayrı bir panoya taşınır.
Sonraki Adım
Düzenlenmiş bir pano yalnız bakıldığında işe yarar. Gecenin üçünde kimse bakmıyorsa on bir panelin sıralaması bir şey değiştirmez; birinin çağrılması gerekir. Çağrıyı doğuran kural ise tek biçimde yazılmaz: bir eşik aşıldığında da çağrılabilir, bir oranın belirli bir pencerede belirli bir hızla değişmesiyle de, geçmiş davranıştan öğrenilmiş bir bandın dışına çıkılmasıyla da. Üç kural türü aynı olay kümesinde farklı olayları yakalar. Sonraki ders üçünü aynı bilinen olay dizisinde koşturur ve yakalanan, kaçan, yanlış alarm sayılarıyla fark etme turunu karşılaştırır.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.