İçeriğe geç
academia.sh

Ders 22 / 30

Sağlık Denetimleri

Canlılık, hazır olma ve başlangıç denetiminin ayrımı sayıyla kurulur: yanlış kapsamlı canlılık denetiminin gereksiz yeniden başlatması ve yeniden başlatma döngüsü, hazır olma denetimi olmadan erken trafiğe açılan kopyaya giden hatalı istek, başlangıç denetimi olmadan yavaş açılan kopyanın öldürülmesi ayrı ayrı sayılır.

İçindekiler

Önceki dersin modeli boyunca bir kopya havuza girdiği anda hizmet verebiliyordu. Dağıtım denetleyicisi de bu varsayımla ilerledi: bir kopya ayağa kalktıysa sayılır, sayıldıysa pay alır. Gerçekte bir sürecin başlaması ile istek karşılayabilmesi arasında bir aralık vardır — bağlantı havuzu kurulur, önbellek ısıtılır, bağımlılıklar yoklanır. Bu aralığı kimse bildirmezse denetleyici kopyayı erken trafiğe açar. Tersi de olur: yavaş açılan bir kopyayı arızalı sayıp öldürür ve bunu her açılışta yineler.

Devredilen karar burada iki tanedir ve çoğu zaman tek karar sanılırlar. Birincisi bu kopya yeniden başlatılsın mı, ikincisi bu kopyaya istek gönderilsin mi. İlkinin cevabı yanlışsa çalışan bir süreç öldürülür; ikincisininki yanlışsa çalışmayan bir sürece istek gider. Sistemin bu iki kararı verebilmek için bilmesi gerekenler ayrı bilgi kalemleridir: sürecin kendisi yanıt veriyor mu, bağımlılıkları elinde mi, ve hâlâ açılmakta mı. Üç soru, üç denetim. Bu dersin ölçüsü, soruları birleştirmenin ne kadara mal olduğudur.

Hazır olma denetimi terimi daha önce tek makinedeki bileşim bağlamında kullanıldı; burada aynı kavram küme ölçeğinde, havuz üyeliğini belirleyen denetim olarak geçiyor.

  • OI7. Küme, kurgusal bölgesel ölçüm ağının doğrulayıcı servisini sekiz kopyayla, sıcak başlangıçla çalıştırır; tur başına elli istek gelir. Ağ da rakamlar da kurgudur.
  • OI8. Altı kopya altı turda, iki kopya yirmi beş turda hizmet verebilir hâle gelir. İkisi açılışta önbellek ısıtan kopyalardır; bu fark uygulamadan gelir, kümeden değil.
  • OI9. Olaylar elle yazıldı, rastgelelik yok. Geçici bağımlılık kaybı süresi dolunca kendiliğinden düzelir; kalıcı takılma yalnız yeniden başlatmayla çözülür.
  • OI10. Denetim yanıtı kesindir: kopya ya yanıt verir ya vermez. Ağ kaynaklı yanlış negatif, denetim ucunun kendi gecikmesi ve zaman aşımı ayarı modellenmiyor.
  • OI11. Yeniden başlatma anında olur. Kapsülün yeniden çizelgelenmesi, görüntü çekme ve düğüm seçimi bu ölçümün dışındadır; hepsi gecikmeyi büyütür, yönünü değiştirmez.
  • OI12. “Gerçekten hizmette” sütunu, tur başına sağlıklı kopya sayısının ortalamasıdır. Hedef sekizdir ve bu sayı denetimlere değil, kopyaların gerçek durumuna bakar.

Ölçüm Düzeneği

Ölçülen şey gerçek bir küme değil, node ile kurulan bir modeldir. Bir kopya her turda dört durumdan birindedir: açılıyor, takıldı, bağımlılığı yok, sağlıklı. Denetimler bu durumu doğrudan görmez; yalnız kendi kapsamlarına giren bir soruya evet ya da hayır alırlar.

// saglik.mjs — canlilik, hazir olma ve baslangic denetimlerinin tur tabanli modeli
export const TUR = 180, TUR_ISTEK = 50, ACILIS = [6, 6, 6, 6, 6, 6, 25, 25];
export const PLANLI = [{ kopya: 6, tur: 20 }, { kopya: 7, tur: 20 }];  // iki kopya yeni surume gecer
export const ARIZA = [                                   // olaylar elle yazildi, rastgelelik yok
  { kopya: 3, tur: 50, tip: 'bagimlilikYok', sure: 18 }, // gecici: kendiliginden duzelir
  { kopya: 1, tur: 80, tip: 'takildi' },                 // kalici: ancak yeniden baslatma cozer
  { kopya: 4, tur: 120, tip: 'bagimlilikYok', sure: 10 },
  { kopya: 5, tur: 140, tip: 'takildi' } ];

export function kostur({ ad, canlilik, hazirOlma, baslangic }) {
  const k = ACILIS.map(() => ({ hazirTur: 0, takildi: false, cS: 0, hS: 0, bS: 0,
    basBitti: true, havuzda: true, yeniden: 0 }));
  const s = { ad, yeniden: 0, gereksiz: 0, acilista: 0, erken: 0, hatali: 0, havuzTur: 0, gec: [] };
  const takilmaTur = {};
  const durum = (i, t) => t < k[i].hazirTur ? 'aciliyor' : k[i].takildi ? 'takildi'
    : ARIZA.some((a) => a.kopya === i && a.sure && t >= a.tur && t < a.tur + a.sure)
      ? 'bagimlilikYok' : 'saglikli';
  const ac = (i, t) => Object.assign(k[i], { hazirTur: t + ACILIS[i], takildi: false,
    cS: 0, hS: 0, bS: 0, basBitti: !baslangic, havuzda: !hazirOlma });
  for (let t = 0; t < TUR; t += 1) {
    for (const p of PLANLI) if (p.tur === t) ac(p.kopya, t);          // planli acilis, sayaca girmez
    for (const a of ARIZA) if (a.tur === t && a.tip === 'takildi') { k[a.kopya].takildi = true; takilmaTur[a.kopya] = t; }
    for (let i = 0; i < k.length; i += 1) {
      const d = durum(i, t);
      if (!k[i].basBitti) {                              // baslangic denetimi bitmeden otekiler bakmaz
        if (t % baslangic.p) continue;
        if (d !== 'aciliyor') k[i].basBitti = true;
        else if ((k[i].bS += 1) >= baslangic.e) { s.yeniden += 1; s.acilista += 1; s.gereksiz += 1; k[i].yeniden += 1; ac(i, t); }
        continue;
      }
      if (canlilik && t % canlilik.p === 0) {
        const kotu = canlilik.kapsam === 'bagimlilik' ? d !== 'saglikli' : d === 'aciliyor' || d === 'takildi';
        if (!kotu) k[i].cS = 0;
        else if ((k[i].cS += 1) >= canlilik.e) {
          s.yeniden += 1; k[i].yeniden += 1;
          if (d === 'takildi') s.gec.push(t - takilmaTur[i]); else s.gereksiz += 1;
          if (d === 'aciliyor') s.acilista += 1;
          ac(i, t);
        }
      }
      if (hazirOlma && t % hazirOlma.p === 0) {
        if (d === 'saglikli') { k[i].hS = 0; k[i].havuzda = true; }
        else if ((k[i].hS += 1) >= hazirOlma.e) k[i].havuzda = false;
      }
    }
    const havuz = k.map((_, i) => i).filter((i) => k[i].havuzda);        // denetimin inandigi havuz
    s.havuzTur += k.filter((_, i) => durum(i, t) === 'saglikli').length; // gercekten hizmet verebilen
    for (let r = 0; r < TUR_ISTEK; r += 1) {
      if (!havuz.length) { s.hatali += 1; continue; }
      const d = durum(havuz[r % havuz.length], t);
      if (d === 'saglikli') continue;
      s.hatali += 1;
      if (d === 'aciliyor') s.erken += 1;
    }
  }
  s.dongu = k.filter((c) => c.yeniden >= 3).length;
  return s;
}

İki satır bu modelin bütün ayrımını taşıyor. Canlılık denetiminin kapsam alanı surec ise denetim yalnız açılıyor ve takıldı durumlarında başarısız olur — bağımlılık kaybını görmez. Aynı alan bagimlilik ise denetim hazır olma denetimiyle aynı soruyu sorar; tek bir denetim ucu hem yeniden başlatmayı hem havuz üyeliğini sürdürür. İkinci satır havuz ile havuzTur arasındaki farktır: birincisi denetimin inandığı havuz, ikincisi gerçekten hizmet verebilen kopya sayısı. İkisinin ayrılabildiği her yerde bir yanlış karar vardır.

Dört Ayar, Tek Olay Dizisi

// kosum3.mjs — dort ayar ayni olay dizisinde kosturulur
import { kostur, TUR, TUR_ISTEK } from './saglik.mjs';

const AYAR = [
  { ad: 'denetim yok', canlilik: null, hazirOlma: null, baslangic: null },
  { ad: 'tek birlesik denetim', canlilik: { p: 5, e: 3, kapsam: 'bagimlilik' },
    hazirOlma: { p: 5, e: 3 }, baslangic: null },
  { ad: 'canlilik + hazir olma', canlilik: { p: 5, e: 3, kapsam: 'surec' },
    hazirOlma: { p: 2, e: 1 }, baslangic: null },
  { ad: 'ustune baslangic', canlilik: { p: 5, e: 3, kapsam: 'surec' },
    hazirOlma: { p: 2, e: 1 }, baslangic: { p: 5, e: 6 } },
];
console.log(`8 kopya, ${TUR} tur, tur basina ${TUR_ISTEK} istek; iki kopya 25 turda aciliyor`);
console.log('tur 20: iki yavas kopya planli olarak yeniden acilir | tur 80 ve 140: kalici takilma');
console.log('tur 50 ve 120: gecici bagimlilik kaybi, 18 ve 10 tur surer, kendiliginden duzelir\n');
console.log('ayar                  yeniden  gereksiz  acilista  donguye  erken   toplam  gercekten  takilmayi');
console.log('                      baslatma yeniden   oldurulen giren    hatali  hatali  hizmette   fark etme');
for (const a of AYAR) {
  const s = kostur(a);
  console.log(`${s.ad.padEnd(21)} ${String(s.yeniden).padEnd(8)} ${String(s.gereksiz).padEnd(9)} ` +
    `${String(s.acilista).padEnd(9)} ${String(s.dongu).padEnd(8)} ${String(s.erken).padEnd(7)} ` +
    `${String(s.hatali).padEnd(7)} ${(s.havuzTur / TUR).toFixed(2).padEnd(10)} ${s.gec.join(', ') || '-'}`);
}
8 kopya, 180 tur, tur basina 50 istek; iki kopya 25 turda aciliyor
tur 20: iki yavas kopya planli olarak yeniden acilir | tur 80 ve 140: kalici takilma
tur 50 ve 120: gecici bagimlilik kaybi, 18 ve 10 tur surer, kendiliginden duzelir

ayar                  yeniden  gereksiz  acilista  donguye  erken   toplam  gercekten  takilmayi
                      baslatma yeniden   oldurulen giren    hatali  hatali  hizmette   fark etme
denetim yok           0        0         0         0        300     1408    6.79       -
tek birlesik denetim  23       21        20        2        0       330     5.89       10, 10
canlilik + hazir olma 22       20        20        2        0       0       5.89       10, 10
ustune baslangic      2        0         0         0        0       0       7.39       10, 10

Denetimsiz satır tabanı veriyor: hiçbir kopya yeniden başlatılmadı, iki kalıcı takılma yüz ve kırk tur boyunca fark edilmeden sürdü, bin dört yüz sekiz istek hata aldı. Bunun üç yüzü açılmakta olan kopyalara gitti — yani hazır olma denetiminin olmamasının tek başına bedeli üç yüz istektir. Geri kalan bin yüz sekiz, takılan ve bağımlılığını yitiren kopyalara giden isteklerdir.

Tek birleşik denetim hatalı isteği bin dört yüzden üç yüz otuza indirdi ve takılmayı on turda fark etti. Bedeli ikinci ve üçüncü sütunda: yirmi üç yeniden başlatmanın yirmi biri gereksizdi. Bu denetim bağımlılık kaybını da arıza sayıyor, dolayısıyla dışarıdaki bir kesinti sağlıklı bir süreci öldürüyor. Kalıcı takılmayla geçici bağımlılık kaybını ayırt edememenin fiyatı budur: kendiliğinden düzelecek bir durum, yeniden başlatmayla düzeltiliyor.

Üçüncü satır canlılık denetiminin kapsamını süreçle sınırlıyor ve hazır olma denetimini ayırıyor. Hatalı istek sıfıra indi — havuz artık bağımlılığını yitirmiş kopyayı iki turda dışarı alıyor, ama onu öldürmüyor. Gereksiz yeniden başlatma yine de yirmi. Kaynağı geçici arıza değil: yirmisi de açılışta öldürme. Canlılık denetimi beş turda bir bakıyor, üç ardışık başarısızlıkta öldürüyor; on beş turluk bu pay, yirmi beş turda açılan iki kopya için yetmiyor. O iki kopya her seferinde açılışın ortasında öldürülüp baştan başlıyor — iki kopya yeniden başlatma döngüsünde.

Bu satırın asıl ölçüsü sondan ikinci sütundur. Hatalı istek sıfır, ama gerçekten hizmet veren kopya sayısı 5,89 — sekiz hedeflenen kümede iki kopyadan fazlası kalıcı olarak yok. Hazır olma denetimi döngüdeki kopyaları havuzun dışında tuttuğu için bu kayıp tek bir hata kaydı üretmiyor. Kümenin hata oranına bakan biri her şeyin yolunda olduğunu görür; kayıp yalnız kapasitede durur ve yük arttığında kalan altı kopyanın üstüne biner.

Dördüncü satır başlangıç denetimini ekliyor: yeniden başlatma yirmi üçten ikiye, yani yalnız iki gerçek takılmaya iniyor, gereksiz yeniden başlatma sıfırlanıyor, hizmetteki kopya 7,39’a çıkıyor. Takılmayı fark etme süresi değişmedi. Başlangıç denetiminin yaptığı şey yeni bir arıza yakalamak değil, canlılık denetimini açılış penceresi boyunca susturmaktır.

Eşik ve Periyot

Üçüncü satırın açılışta öldürmesi canlılık denetiminin ayarını gevşeterek de giderilebilir. Tarama bunun neye mal olduğunu gösteriyor.

// kosum4.mjs — canlilik denetiminin periyodu ve esigi taranir, once baslangic denetimi olmadan
import { kostur, TUR } from './saglik.mjs';

const HAZIR = { p: 2, e: 1 };
const yaz = (etiket, baslangic) => {
  console.log(`\n${etiket}`);
  console.log('periyot  esik  hosgoru  takilmayi   acilista   donguye  gercekten');
  console.log('               (tur)    fark etme   oldurulen  giren    hizmette');
  for (const p of [2, 5, 10]) for (const e of [2, 3, 6]) {
    const s = kostur({ ad: '', canlilik: { p, e, kapsam: 'surec' }, hazirOlma: HAZIR, baslangic });
    console.log(`${String(p).padEnd(8)} ${String(e).padEnd(5)} ${String(p * e).padEnd(8)} ` +
      `${(s.gec.join(', ') || '-').padEnd(11)} ${String(s.acilista).padEnd(10)} ` +
      `${String(s.dongu).padEnd(8)} ${(s.havuzTur / TUR).toFixed(2)}`);
  }
};
console.log('yavas acilan iki kopya 25 turda hazir oluyor; kalici takilma tur 80 ve 140');
yaz('baslangic denetimi yok:', null);
yaz('baslangic denetimi var (periyot 5, esik 6 — 30 turluk acilis payi):', { p: 5, e: 6 });
yavas acilan iki kopya 25 turda hazir oluyor; kalici takilma tur 80 ve 140

baslangic denetimi yok:
periyot  esik  hosgoru  takilmayi   acilista   donguye  gercekten
               (tur)    fark etme   oldurulen  giren    hizmette
2        2     4        2, 2        113        4        5.29
2        3     6        4, 4        52         2        5.96
2        6     12       10, 10      26         2        5.89
5        2     10       5, 5        32         2        5.94
5        3     15       10, 10      20         2        5.89
5        6     30       25, 25      0          0        7.22
10       2     20       10, 10      16         2        5.89
10       3     30       20, 20      2          0        7.06
10       6     60       50          0          0        7.03

baslangic denetimi var (periyot 5, esik 6 — 30 turluk acilis payi):
periyot  esik  hosgoru  takilmayi   acilista   donguye  gercekten
               (tur)    fark etme   oldurulen  giren    hizmette
2        2     4        2, 2        0          0        7.48
2        3     6        4, 4        0          0        7.46
2        6     12       10, 10      0          0        7.39
5        2     10       5, 5        0          0        7.44
5        3     15       10, 10      0          0        7.39
5        6     30       25, 25      0          0        7.22
10       2     20       10, 10      0          0        7.39
10       3     30       20, 20      0          0        7.28
10       6     60       50          0          0        7.03

Üst tabloda tek bir ayar iki işi birden yapıyor ve iki iş ters yöne çekiyor. Hoşgörü penceresi kısaldıkça takılma çabuk fark ediliyor — dört turluk pencerede iki turda — ama açılışta öldürme yüz on üçe fırlıyor ve dört kopya döngüye giriyor; hizmetteki kopya 5,29’a düşüyor. Pencere uzadıkça öldürme azalıyor, fark etme gecikmesi büyüyor. Açılışta hiç öldürmeyen üç satır var ve üçünün de hoşgörüsü otuz turun üstünde: takılmayı yirmi beş, yirmi ve elli turda fark ediyorlar. Son satırda takılma sütununda tek bir sayı var — altmış turluk pencere, yüz kırkıncı turdaki ikinci takılmayı ölçüm ufkunun sonuna kadar hiç fark etmedi.

Alt tablo aynı taramayı otuz turluk açılış payı veren bir başlangıç denetimiyle yineliyor. Açılışta öldürme sütunu her satırda sıfır, döngü sütunu her satırda sıfır. Gerilim ortadan kalktı, çünkü iki iş iki ayara bölündü: açılış penceresini başlangıç denetimi karşılıyor, canlılık denetimi yalnız açılışı bitmiş kopyalara bakıyor. Artık periyot ve eşik tek bir ölçüte göre seçilebilir — takılmayı fark etme gecikmesi. En hızlı satır dört turluk pencere: iki turda fark ediyor ve hizmetteki kopya 7,48 ile taramanın en yükseği.

Üç denetimin ayrımı bu iki tablonun farkıdır. Aynı canlılık ayarı, üstte 113 gereksiz öldürme üretirken altta sıfır üretiyor. Değişen tek şey, sistemin açılmakta olmakla arızalı olmayı ayırt edebilmesi. Bu ayrım bir bilgi kalemidir ve bedeli bir denetim daha koşturmaktır; karşılığı, canlılık ayarının uygulamanın açılış süresinden bağımsız hâle gelmesidir.

Özet

  • Denetimsiz kümede iki kalıcı takılma hiç fark edilmedi ve 1408 istek hata aldı; bunun 300’ü açılmakta olan kopyalara giden isteklerdir, yani hazır olma denetiminin yokluğunun payıdır.
  • Tek birleşik denetim hatalı isteği 330’a indirdi ama 23 yeniden başlatmanın 21’i gereksizdi: bağımlılık kaybını takılmadan ayırt edemeyen denetim, kendiliğinden düzelecek durumu yeniden başlatmayla düzeltir.
  • Canlılık denetimini süreçle sınırlayıp hazır olma denetimini ayırmak hatalı isteği sıfıra indirdi, ama yavaş açılan iki kopya açılışın ortasında öldürülmeye devam etti ve döngüye girdi.
  • Yeniden başlatma döngüsü hata oranında görünmez: hatalı istek sıfırken gerçekten hizmet veren kopya sayısı 8 hedefine karşı 5,89’du; kayıp kapasitede durur, hata kaydında değil.
  • Tek ayarla iki iş yapıldığında hoşgörü penceresi kısaldıkça fark etme hızlanır ve açılışta öldürme 113’e çıkar; uzadıkça öldürme biter ama 60 turluk pencere ikinci takılmayı hiç görmez.
  • Başlangıç denetimi eklendiğinde taramanın dokuz satırında da açılışta öldürme sıfırlanır; canlılık ayarı artık yalnız fark etme gecikmesine göre seçilir ve 4 turluk pencere hem en hızlı hem en yüksek kapasiteli satırdır.

Sonraki Adım

Bu iki dersin denetleyicileri kümede kısıtsız iş görüyor: sürüm nesnesini değiştiriyor, kopya öldürüyor, havuz üyeliğini yazıyor. Aynı arayüzü insanlar ve otomatik süreçler de kullanıyor ve şimdiye kadar hiçbiri “bunu yapmaya yetkin var mı” sorusuyla karşılaşmadı. Sonraki ders bu soruyu sayıya çeviriyor: bir özne × fiil × nesne yetki matrisi kurulur, geniş yetkiden en az yetkiye inince kaç işlemin düştüğü ve bunun kaç satır rol tanımına mal olduğu ölçülür — ve bir özneye verilen yetkinin başka bir özneye yetki verebildiği yollar sayılı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