İçeriğe geç
academia.sh

Ders 10 / 20

Sağlık Ucu İzleme

Devralmayı besleyen sağlık ucunun içeriğinin tasarlanması: sığ denetim, hazır olma denetimi ve derin denetimin aynı arıza takviminde ölçülmesi, paylaşılan bir bağımlılığı denetime katmanın bütün kopyaları birden havuz dışına çıkarması, denetim aralığının algılama gecikmesi ile yanlış çıkarma arasındaki ödünleşimi ve denetimin bağımlılığa eklediği yükün sayılması.

İçindekiler

Önceki dersin bütün kararları tek bir girdiye dayandı: sağlık denetiminin verdiği evet ya da hayır. Eşiğin nasıl seçildiği, geri dönüşün ne zaman yapıldığı, hatta devralmanın hiç yapılıp yapılmadığı bu tek bitin doğruluğuna bağlıydı. Modelin yarı düşük penceresinde 3.888,80 yazma, sistem sağlıklı görünürken kayboldu — çünkü denetim yalnız “yanıt veriyor musun” diye soruyordu.

Sağlık denetiminin devralmayı ve yük dengeleyici havuzunu beslediği Veritabanı Yönetimi ve Trafik Katmanı kurslarında kuruldu; sunum tarafındaki uç biçimi Sunucu Tarafı Temelleri kursunda tanıtıldı. Bu ders o ucun içeriğini tasarlar: hangi soruyu sorduğu, bağımlılıklarını denetime katıp katmadığı ve ne sıklıkla sorulduğu. Ucun topladığı ölçütlerin nereye gönderildiği, gösterge tablosu ve uyarı eşiği bu kursun konusu değildir; Başarım Karşıt Kalıpları ve İzleme kursuna aittir.

Ucun Sorabileceği Dört Soru

Sığ denetim yalnız sürecin ayakta ve yanıt verebilir olduğunu sınar. Yanıtı hiçbir bağımlılığa dokunmadan üretir, bu yüzden ucuzdur ve yanlış negatif vermez.

Hazır olma denetimi ayrı bir sorudur: süreç ayakta olabilir ama trafik almaya hazır olmayabilir. Yeni başlamış bir kopya önbelleğini doldurmamış, yapılandırmasını okumamış ya da göçünü bitirmemiş olabilir. Ayakta olmak ile hazır olmak ayrı iki durumdur ve tek bir uçta birleştirildiklerinde ikisinden biri kaybolur.

Derin denetim kopyanın bağımlılıklarına dokunur. Burada iki tür bağımlılık ayrılır ve ayrım bu dersin ana sonucudur: kopyanın kendi yoluna ait bağımlılık (bu kopyanın durum deposuna yazabilmesi) ile paylaşılan bağımlılık (durum deposunun ayakta olması). Birincisi kopyalar arasında farklıdır, ikincisi hepsinde aynıdır.

Aşağıdaki düzenek bir modeldir: üç kopya, bir paylaşılan durum deposu ve yalnız toplu akışı besleyen bir ücretlendirme deposu. Tur soyut bir adımdır. Tur başına gelen istek karışımı K01’in okuma–yazma oranına yakın seçildi: 8 okuma, 2 yazma, 1 toplu.

// saglik/model.mjs — saglik ucunun icerigi MODELIDIR. Uc kopya, bir paylasilan durum deposu ve
// bir akisa ozel ucretlendirme deposu; tur soyut bir adimdir, olculmus sure degildir.
export const TUR = 130;
export const K3_DURDU = 82;   // k3 bu turda durdu; algilama gecikmesi buna gore olculur
export const KOPYA = ["k1", "k2", "k3"];
const P = (t, a) => a.some(([b, c]) => t >= b && t <= c);

export const takvim = {
  yariDusuk: { k1: [[20, 45]], k2: [], k3: [] },        // yaziyor gibi gorunur, depoya gitmez
  isiniyor: { k1: [], k2: [[1, 8], [60, 66]], k3: [] }, // surec ayakta, trafige hazir degil
  durdu: { k1: [], k2: [], k3: [[82, 95]] },            // surec yanit vermiyor
  gecici: { k1: [], k2: [], k3: [[50, 50], [58, 59]] }, // kisa yanitsizlik, kendiliginden doner
  durumDeposu: [[100, 110]],                            // paylasilan bagimlilik dustu
  ucretDeposu: [[115, 125]],                            // yalniz toplu akisi etkiler
};

export const durumDeposuAyakta = (t) => !P(t, takvim.durumDeposu);
export const ucretDeposuAyakta = (t) => !P(t, takvim.ucretDeposu);
export const surecAyakta = (k, t) => !P(t, takvim.durdu[k]) && !P(t, takvim.gecici[k]);
export const isiniyor = (k, t) => P(t, takvim.isiniyor[k]);
export const yolSaglam = (k, t) => !P(t, takvim.yariDusuk[k]);   // kopyanin kendi yazma yolu
export const okuyabilir = (k, t) => surecAyakta(k, t) && !isiniyor(k, t);

// Bes uc icerigi. Her biri kopya basina tek bir evet/hayir dondurur.
export const UC = {
  sig: (k, t) => surecAyakta(k, t),
  hazirOlma: (k, t) => okuyabilir(k, t),
  derinYerel: (k, t) => okuyabilir(k, t) && yolSaglam(k, t),
  derinPaylasilan: (k, t) => okuyabilir(k, t) && yolSaglam(k, t) && durumDeposuAyakta(t),
  derinHepsi: (k, t) => okuyabilir(k, t) && yolSaglam(k, t) && durumDeposuAyakta(t)
    && ucretDeposuAyakta(t),
};

const OKUMA = 8, YAZMA = 2, TOPLU = 1;   // tur basina istek: K01'in okuma/yazma oranina yakin

export function kosum(ucAdi, { aralik = 1, tur: N = TUR } = {}) {
  const uc = UC[ucAdi];
  const s = { disKopyaTur: 0, dusenOkuma: 0, dusenYazma: 0, dusenToplu: 0, sessiz: 0,
    bosaRed: 0, denetim: 0, yanlisCikarma: 0, algilama: null };
  let sira = 0, karar = Object.fromEntries(KOPYA.map((k) => [k, true])), oncekiKarar = { ...karar };

  for (let t = 1; t <= N; t += 1) {
    if ((t - 1) % aralik === 0) {                       // denetim turu
      oncekiKarar = { ...karar };
      for (const k of KOPYA) karar[k] = uc(k, t);
      s.denetim += KOPYA.length;
      for (const k of KOPYA)                            // gecici yanitsizlik havuzdan cikardi mi
        if (oncekiKarar[k] && karar[k] === false && P(t, takvim.gecici[k])) s.yanlisCikarma += 1;
      if (s.algilama === null && karar.k3 === false && P(t, takvim.durdu.k3))
        s.algilama = t - K3_DURDU;
    }
    const havuz = KOPYA.filter((k) => karar[k]);
    s.disKopyaTur += KOPYA.length - havuz.length;
    const varOkuyan = KOPYA.some((k) => okuyabilir(k, t));

    for (let i = 0; i < OKUMA; i += 1) {
      if (havuz.length === 0) { s.dusenOkuma += 1; if (varOkuyan) s.bosaRed += 1; continue; }
      const k = havuz[sira++ % havuz.length];
      if (okuyabilir(k, t) === false) s.dusenOkuma += 1;
    }
    for (let i = 0; i < YAZMA; i += 1) {
      if (havuz.length === 0) { s.dusenYazma += 1; continue; }
      const k = havuz[sira++ % havuz.length];
      if (okuyabilir(k, t) === false) { s.dusenYazma += 1; continue; }
      if (yolSaglam(k, t) === false) { s.sessiz += 1; continue; }   // kabul edildi, depoya gitmedi
      if (durumDeposuAyakta(t) === false) s.dusenYazma += 1;
    }
    for (let i = 0; i < TOPLU; i += 1) {
      if (havuz.length === 0 || ucretDeposuAyakta(t) === false) { s.dusenToplu += 1; continue; }
      sira += 1;
    }
  }
  return s;
}
// saglik/olc.mjs — bes uc icerigi ayni ariza takviminde, ardindan denetim araliginin etkisi
import { kosum, TUR, KOPYA } from "./model.mjs";

const s = (x, n) => String(x).padStart(n);
console.log(`${TUR} tur, ${KOPYA.length} kopya, tur basina 8 okuma + 2 yazma + 1 toplu istek.`);
console.log("takvim: k1 20-45 yari dusuk, k2 1-8 ve 60-66 isiniyor, k3 50 ve 58-59 gecici " +
  "yanitsiz, 82-95 durdu, durum deposu 100-110, ucret deposu 115-125 dusuk.");
console.log();
console.log("uc icerigi      | havuz disi | dusen okuma | dusen yazma | dusen toplu | sessiz kayip | bosa red");
console.log("----------------|------------|-------------|-------------|-------------|--------------|---------");
for (const ad of ["sig", "hazirOlma", "derinYerel", "derinPaylasilan", "derinHepsi"]) {
  const r = kosum(ad);
  console.log(`${ad.padEnd(15)} | ${s(r.disKopyaTur, 10)} | ${s(r.dusenOkuma, 11)} | ` +
    `${s(r.dusenYazma, 11)} | ${s(r.dusenToplu, 11)} | ${s(r.sessiz, 12)} | ${s(r.bosaRed, 8)}`);
}

console.log();
console.log("aralik | denetim sayisi | algilama gecikmesi | yanlis cikarma | dusen okuma | sessiz kayip");
console.log("-------|----------------|--------------------|----------------|-------------|-------------");
for (const aralik of [1, 2, 4, 8]) {
  const r = kosum("derinYerel", { aralik });
  console.log(`${s(aralik, 6)} | ${s(r.denetim, 14)} | ${s(`${r.algilama} tur`, 18)} | ` +
    `${s(r.yanlisCikarma, 14)} | ${s(r.dusenOkuma, 11)} | ${s(r.sessiz, 12)}`);
}
130 tur, 3 kopya, tur basina 8 okuma + 2 yazma + 1 toplu istek.
takvim: k1 20-45 yari dusuk, k2 1-8 ve 60-66 isiniyor, k3 50 ve 58-59 gecici yanitsiz, 82-95 durdu, durum deposu 100-110, ucret deposu 115-125 dusuk.

uc icerigi      | havuz disi | dusen okuma | dusen yazma | dusen toplu | sessiz kayip | bosa red
----------------|------------|-------------|-------------|-------------|--------------|---------
sig             |         17 |          40 |          32 |          11 |           17 |        0
hazirOlma       |         32 |           0 |          22 |          11 |           17 |        0
derinYerel      |         58 |           0 |          22 |          11 |            0 |        0
derinPaylasilan |         91 |          88 |          22 |          22 |            0 |       88
derinHepsi      |        124 |         176 |          44 |          22 |            0 |      176

aralik | denetim sayisi | algilama gecikmesi | yanlis cikarma | dusen okuma | sessiz kayip
-------|----------------|--------------------|----------------|-------------|-------------
     1 |            390 |              0 tur |              2 |           0 |            0
     2 |            195 |              1 tur |              1 |          11 |            0
     4 |             99 |              3 tur |              0 |          19 |            0
     8 |             51 |              7 tur |              0 |          40 |            3

Derinlik Nereye Kadar

İlk üç satır derinliğin kazandırdığını gösteriyor. Sığ denetim ısınmakta olan kopyayı havuzda tuttu ve ona yönlenen 40 okuma ile 32 yazma düştü; hazır olma denetimi eklendiğinde düşen okuma 0’a, düşen yazma 22’ye indi. Kalan 22 yazma paylaşılan deponun düştüğü on bir turda oluşuyor ve hiçbir uç içeriği onu kurtarmıyor — kopya sağlıklı olsa da yazacak yer yok.

Sütunun adı Veri Katmanı Ölçekleme kursundan gelir: sessiz kayıp, kabul edilmiş bir yazmanın sahibine hiçbir şey söylenmeden geçersizleşmesidir. Orada nedeni çakışmaydı, burada yarı düşük kopyadır; ölçü aynıdır.

Yerel derin denetim sessiz kaybı kaldırıyor: 17’den 0’a. Yarı düşük kopya artık havuzun dışında, çünkü uç “yazabiliyor muyum” sorusuna dürüst yanıt veriyor. Bedeli havuz dışı kopya-tur sütununda: 32’den 58’e. Bu, önceki dersin çözemediği sorunun karşılığıdır ve bedeli yalnız bozuk kopyayı havuzdan çıkarmaktır.

Dördüncü satırda işaret dönüyor. Paylaşılan durum deposu denetime katıldığında, depo düştüğü anda üç kopya da aynı yanıtı veriyor ve üçü birden havuz dışına çıkıyor. Havuz boşalınca yalnız yazma değil, okuma da reddediliyor: 88 düşen okuma, hepsi boşa red. Boşa red sütununun anlamı tam olarak budur — en az bir kopya o isteği yanıtlayabilecek durumdayken reddedilen istek. Kenar önbelleği ve kopyalardan okuma yolu ayaktaydı; denetim onları da kapattı. Düşen toplu iş de 11’den 22’ye çıktı.

Beşinci satır aynı hatayı bir kez daha yapıyor. Yalnız gün sonu ücretlendirmesini besleyen depo denetime katıldığında, o depo düştüğünde takip sorgusu yanıtlayan kopyalar da havuz dışına çıkıyor: boşa red 88’den 176’ya. Ücretlendirme akışının deposu ile takip sorgusunun yolu arasında hiçbir bağ yokken, denetim ikisini birbirine bağladı.

Kural bu üç satırdan okunur: uç, kopyanın komşularından daha kötü durumda olup olmadığını sormalıdır, dünyanın iyi olup olmadığını değil. Bütün kopyalarda aynı yanıtı verecek bir koşul uca konursa, o koşul bozulduğunda havuzda kimse kalmaz ve yayılma kalıbın kendisinden gelir. Bu yüzden paylaşılan bağımlılığın arızası devre kesici ile zarif bozulmanın konusudur — önceki konuda ölçüldü — sağlık ucunun değil.

Aralık Ne Kadar Sık

İkinci tablo aynı uç içeriğini (derinYerel) dört denetim aralığında koşturuyor. Aralık 1’de denetim sayısı 390, algılama gecikmesi 0 tur, düşen okuma 0 — ama iki yanlış çıkarma var: kendiliğinden dönecek kısa yanıtsızlıklar kopyayı havuzdan çıkardı. Aralık 4’te yanlış çıkarma sıfırlanıyor, karşılığında k3 kopyasının durduğu tur 3 tur sonra fark ediliyor ve o sürede kopyaya yönlenen 19 okuma düşüyor. Aralık 8’de gecikme 7 tura, düşen okuma 40’a çıkıyor ve yarı düşük kopya denetimler arasında kalarak 3 sessiz kayıp üretiyor.

Ödünleşim önceki dersin eşik ödünleşimiyle aynı biçimdedir ama ayrı bir eksendir: eşik kaç denetimin üst üste başarısız olacağını, aralık denetimlerin ne kadar seyrek olacağını belirler. İkisi çarpılır — aralık 4 ve eşik 3, gerçek bir arızanın en kötü durumda 12 tur boyunca fark edilmemesi demektir.

İki Günün Sayısı

Denetimin arızasız gündeki bedeli iki kalemden oluşur: bağımlılığa vurulan denetim yükü ve yanlış çıkarmanın kalan kopyalara aktardığı istek. Birincisi derin denetimin doğrudan faturasıdır.

// saglik/butce.mjs — denetimin arizasiz gundeki bedeli: bagimliliga vurulan denetim yuku ve
// yanlis cikarmanin kalan kopyalara aktardigi istek
const TUR_SN = 2;          // KU1 (varsayim): bir tur bir denetim araligi, 2 saniye
const DEPO = 138.89;       // K01: depoya ulasan istek/s
const TEPE_UC = 513.89;    // K01: tepe uctaki istek/s
const KESIK_AY = 20;       // KU3 (varsayim): ayda 20 gecici yanitsizlik
const b = (x, n = 2) => x.toFixed(n);

console.log(`${"kopya".padStart(6)}${"aralik".padStart(9)}${"denetim/s".padStart(12)}` +
  `${"depoya eklenen pay".padStart(20)}${"gunde denetim".padStart(15)}`);
for (const [kopya, aralik] of [[3, 1], [3, 4], [12, 1], [12, 4], [48, 1], [48, 4]]) {
  const sn = aralik * TUR_SN, hiz = kopya / sn;
  console.log(`${String(kopya).padStart(6)}${(sn + " sn").padStart(9)}${b(hiz).padStart(12)}` +
    `${("%" + b((100 * hiz) / DEPO)).padStart(20)}${Math.round(hiz * 86_400).toLocaleString("tr-TR").padStart(15)}`);
}

console.log(`\nyanlis cikarma: 3 kopyanin biri havuzdan cikinca kalan iki kopyanin her biri ` +
  `${b(TEPE_UC / 3)} yerine ${b(TEPE_UC / 2)} istek/s tasir (${b((TEPE_UC / 2) / (TEPE_UC / 3))} kat)`);
for (const aralik of [1, 2]) {
  const oran = aralik === 1 ? 2 / 3 : 1 / 3;      // modelden: 3 gecici yanitsizligin kaci yakalandi
  console.log(`aralik ${aralik}: ayda ${b(KESIK_AY * oran, 1)} yanlis cikarma, her biri en cok ` +
    `${aralik * TUR_SN} sn boyunca kapasiteyi ${b(100 / 3, 1)}% dusurur`);
}
 kopya   aralik   denetim/s  depoya eklenen pay  gunde denetim
     3     2 sn        1.50               %1.08        129.600
     3     8 sn        0.38               %0.27         32.400
    12     2 sn        6.00               %4.32        518.400
    12     8 sn        1.50               %1.08        129.600
    48     2 sn       24.00              %17.28      2.073.600
    48     8 sn        6.00               %4.32        518.400

yanlis cikarma: 3 kopyanin biri havuzdan cikinca kalan iki kopyanin her biri 171.30 yerine 256.94 istek/s tasir (1.50 kat)
aralik 1: ayda 13.3 yanlis cikarma, her biri en cok 2 sn boyunca kapasiteyi 33.3% dusurur
aralik 2: ayda 6.7 yanlis cikarma, her biri en cok 4 sn boyunca kapasiteyi 33.3% dusurur

Üç kopya ve iki saniyelik aralıkta derin denetim depoya saniyede 1,50 sorgu ekliyor; K01’in depoya ulaşan 138,89 istek/s’sinin yüzde 1,08’i. Sayı kopya sayısıyla doğrusal büyüyor ve orada bir sınıra çarpıyor: 48 kopyada aynı aralık yüzde 17,28 ek yük demektir. Derin denetimin faturası kopya sayısıyla ölçeklenir, iş yüküyle değil — yani ölçekleme kararı denetim politikasını da değiştirir. Aralığı dörde çıkarmak faturayı dörde bölüyor.

İkinci kalem yanlış çıkarmadır. Üç kopyalı bir havuzda bir kopya çıkınca kalan ikisi 171,30 yerine 256,94 istek/s taşır, yani 1,50 kat. Aralık 1 ile modelin yakaladığı yanlış çıkarma oranı üçte ikidir; ayda 20 geçici yanıtsızlık varsayımıyla (KU3, önceki derste tanımlandı) ayda 13,3 kez kapasitenin üçte biri iki saniyeliğine kayboluyor. Aralık 2’de sayı 6,7’ye iniyor ama her olayın penceresi iki katına çıkıyor. Arızasız günün bedeli budur ve hiçbir arıza olmadan ödenir.

Arızalı günün kazancı birinci tablonun sig ile derinYerel satırları arasındadır: aynı arıza takviminde 40 düşen okuma 0’a, 32 düşen yazma 22’ye, 17 sessiz kayıp 0’a iniyor ve boşa red 0’da kalıyor. Aynı tablo kazancın nerede bittiğini de gösteriyor: bir adım fazla derinlik 88, iki adım fazla derinlik 176 boşa red üretiyor.

Özet

  • Sağlık ucu tek bir soru değildir: sığ denetim sürecin ayakta olduğunu, hazır olma denetimi trafik alabildiğini, derin denetim bağımlılık yolunun çalıştığını sınar.
  • Hazır olma denetimi eklendiğinde ısınan kopyaya yönlenen 40 okuma ile 10 yazma kurtuldu; yerel derin denetim eklendiğinde sessiz kayıp 17’den 0’a indi, bedeli havuz dışı kopya-turun 32’den 58’e çıkmasıydı.
  • Paylaşılan bağımlılığı denetime katmak yayılma üretir: depo düştüğünde üç kopya da havuz dışına çıktı ve 88 okuma, yanıtlanabilir olduğu hâlde reddedildi; akışa özel depo da katıldığında bu sayı 176’ya çıktı.
  • Kural: uç kopyanın komşularından kötü durumda olup olmadığını sorar; bütün kopyalarda aynı yanıtı verecek bir koşul uca konursa havuz boşalır.
  • Denetim aralığı ayrı bir eksendir: aralık 1’de 2 yanlış çıkarma ve 0 tur gecikme, aralık 8’de 0 yanlış çıkarma ama 7 tur gecikme, 40 düşen okuma ve 3 sessiz kayıp.
  • Arızasız günün bedeli sayılır: 3 kopya ve 2 saniyelik aralıkta derin denetim depoya yüzde 1,08 ek yük bindirir, 48 kopyada yüzde 17,28; yanlış çıkarma ayda 13,3 kez kalan kopyaların yükünü 1,50 katına çıkarır.

Sonraki Adım

Bu iki ders bir arızanın ne kadar sürede fark edildiğini ve ne kadar sürede devredildiğini saydı: eşik, aralık, terfi ve geri dönüş turları. Sayılan şey hep aynı büyüklüktü — kurtarmanın süresi. Ama önceki dersin yarı düşük penceresinde kaybolan yazmalar başka bir büyüklüktür ve bu iki ders onu ölçemedi: sistem geri geldiğinde verinin ne kadarı geride kalmıştır? İki soru ayrı eşikler ister ve ikisi de aynı bütçeden ödenir. Sonraki ders bu eşikleri adlandırır, yedekleme sıklığı ile çoğaltma gecikmesine bağlayarak sayıya çevirir ve K01’in 43,2 dakikalık aylık bütçesiyle karşılaştırır.

İ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