İçeriğe geç
academia.sh

Ders 07 / 11

Test Ortamlarının Yönetimi

Önceki dersin kapı düzenine ortam boyutunun eklenmesi: ortam sınıfının bir takıma verdiği görme sınırı, paylaşılan ortamın kuyruk süresi, ayrılmış ortamın boşta geçen bedeli ve sekiz ortam düzeninin aynı kusur kümesinde ürettiği kaçan hata.

İçindekiler

Önceki dersin tablosundaki her satır sessiz bir varsayıma yaslanıyordu: bir aşamanın süresi, orada koşan sınamaların koşum bedelidir. Bu, ortamı bedava saymak demektir. Oysa hızlı aşama dışındaki her takım bir test ortamı ister ve ortam iki yerden bedel keser — sınırlı sayıda olduğu için kuyruk, sürekli ayrılmış olduğu için boşta bekleme.

Bu dersin sorusu ortamın nasıl kurulduğu değildir; o düzenek Test Ortamı Yönetimi dersinde adım adım kuruldu ve sayıldı (dört kurulum, iki yıkım adımı). Buradaki soru dağıtımdır: kaç ortam, hangi aşamada, hangi sınıftan. Dağıtılan kaynak ortam-dakikasıdır; iki karşılığı kuyruk süresi ile kaçan hatadır.

Ortam Sınıfı ve Sadakat

Bir ortamın ayırt edici özelliği fiyatı değil sadakatidir: üretimin hangi özelliğini taşıdığı. Dört sınıf ayrılır. yok sınıfı ortam değildir, koşucunun kendisidir; yalnız kendi başlattığı süreçleri kullanan takımlar buradadır. gecici sınıfı koşum başına kurulup yıkılan, tek süreç ömürlü ve tohumlu veriyle dolan ortamdır. paylasilan sınıfı sürekli ayakta duran tam sistemdir: birden çok servis, kalıcı durum, gerçek yeniden başlatma. uretim-benzeri sınıfı buna üretim ölçeğinde veri ve gerçek kaynak sınırı ekler.

Sadakat bir takımın görme sınırını belirler. Uçtan uca takımı tek süreç ömürlü bir ortamda kart durumunu sınayamaz, çünkü akış birden çok servise dağılmıştır. Bu yüzden kusur kümesinin her satırına bir sütun daha eklenir: o sınıfın görünür olması için gereken en düşük ortam sınıfı. Sütunun değerleri kaynak derslerin ölçümlerinden okundu — dağılıma bağlı rapor kusuru tohumlu veriyle görülebildiği için gecici, kapasite sınırı yalnız gerçek kaynak sınırında göründüğü için uretim-benzeri.

TS11 — sadakat sıralıdır: yok < gecici < paylasilan < uretim-benzeri. Üst sınıf alt sınıfın gördüğü her şeyi görür. Bu, sadakati tek boyuta indiren bir basitleştirmedir.

TS12 — ayrılmış ortam gün boyu bedel öder: paylaşılan ortam günde 1440 model dakikası, üretim benzeri ortam dört katı. Bedeli kullanımla değil varlığıyla ölçülür. Geçici ortam bunun karşıtıdır: yalnız kullanıldığı dakikayı öder, koşum başına 3 dakikalık kurulum ve yıkım ekler.

// matris.mjs — ortam siniflari, asama listesi ve kusur kumesinin ortam sutunu
// Asama sureleri, kusur siniflari ve sayilari onceki dersin envanterinden okundu.
export const SEVIYE = { yok: 0, gecici: 1, paylasilan: 2, 'uretim-benzeri': 3 };   // TS11
export const GUNLUK = { paylasilan: 1440, 'uretim-benzeri': 5760 };                // TS12
export const KURULUM = 3;   // gecici ortamin kosum basina kurulum + yikim bedeli

// [ad, siklik, sure, taban, takimlar]; taban onceki dersin "uc siklik" satirindaki
// asama basina geri bildirim suresidir.
export const asamalar = [
  ['hizli', 'degisiklik', 8, 8, ['birim', 'sozlesme']],
  ['orta', 'degisiklik', 41, 49, ['tumlesim', 'uctan-uca']],
  ['gecelik', 'gecelik', 136, 425, ['basarim-kosum', 'guvenlik-otomatik', 'dayaniklilik']],
  ['surum', 'surum', 836, 2221, ['basarim-ornekleme', 'guvenlik-elle']],
].map(([ad, siklik, sure, taban, takimlar]) => ({ ad, siklik, sure, taban, takimlar }));

// [sinif, yakalayan takim, yuz degisiklikte sayi, gereken en dusuk ortam sinifi]
export const kusurlar = [
  ['sinir karsilastirmasi', 'birim', 13, 0],
  ['sema uyusmazligi', 'tumlesim', 8, 1],
  ['kart durumunun guncellenmemesi', 'uctan-uca', 7, 2],
  ['durum kodu eslemesi', 'uctan-uca', 6, 1],
  ['kirici degisiklik', 'sozlesme', 6, 0],
  ['istek bicimi kaymasi', 'sozlesme', 5, 0],
  ['erisilebilirlik olcutu', 'guvenlik-elle', 5, 2],
  ['sozlesmedeki alanin kaybolmasi', 'sozlesme', 4, 0],
  ['reddedilen istekte uyari yoklugu', 'uctan-uca', 4, 2],
  ['gecikme gerilemesi', 'basarim-kosum', 4, 3],
  ['gocte veri kaybi', 'tumlesim', 3, 1],
  ['birlestirilmis sorgu', 'guvenlik-otomatik', 3, 0],
  ['anlamsal uyusmazlik', null, 3, 0],
  ['kontrol-sonra-yaz yarisi', 'uctan-uca', 2, 2],
  ['dagilima bagli rapor kusuru', 'tumlesim', 2, 1],
  ['surec omrune bagli durum', null, 2, 0],
  ['az ornekle okunan yuzdelik', 'basarim-ornekleme', 1, 3],
  ['kurtarma eksigi', 'dayaniklilik', 1, 2],
  ['kapasite siniri', 'dayaniklilik', 1, 3],
].map(([sinif, takim, sayi, ortam]) => ({ sinif, takim, sayi, ortam }));

// Bir duzen, her havuza bir ortam sinifi, bir adet ve hizmet ettigi asamalari verir.
const G = (asamalar) => ({ sinif: 'gecici', adet: Infinity, asamalar });
const P = (adet, asamalar) => ({ sinif: 'paylasilan', adet, asamalar });
const U = (adet, asamalar) => ({ sinif: 'uretim-benzeri', adet, asamalar });

export const duzenler = [
  { ad: 'hepsi gecici', havuzlar: [G(['orta', 'gecelik', 'surum'])] },
  { ad: 'gecici orta', havuzlar: [G(['orta']), P(1, ['gecelik', 'surum'])] },
  { ad: 'tek paylasilan', havuzlar: [P(1, ['orta', 'gecelik', 'surum'])] },
  { ad: 'iki paylasilan', havuzlar: [P(2, ['orta', 'gecelik', 'surum'])] },
  { ad: 'dort paylasilan', havuzlar: [P(4, ['orta', 'gecelik', 'surum'])] },
  { ad: 'ayri agir ortam', havuzlar: [P(2, ['orta']), P(1, ['gecelik', 'surum'])] },
  { ad: 'uretim benzeri surum', havuzlar: [P(2, ['orta']), P(1, ['gecelik']), U(1, ['surum'])] },
  { ad: 'uretim benzeri agir', havuzlar: [P(2, ['orta']), U(1, ['gecelik', 'surum'])] },
];

Kuyruk

Ayrılmış bir ortam aynı anda tek koşum taşır. İki değişiklik aynı anda geldiğinde biri bekler ve beklediği süre o değişikliğin geri bildirim süresine eklenir. Kuyruğun büyüklüğü ortalama yüke değil gelişlerin düzensizliğine bağlıdır; bu yüzden gelişler düzgün aralıklarla değil, tohumlu bir diziyle yerleştirilir.

TS13 — günde beş değişiklik iş gününün 480 dakikasına tohumlu olarak dağılır; ortamlar kesintisiz çalışır. Önceki dersin TS9’u yüz değişikliği yirmi iş gününe yaymıştı; buradaki ek, o beş değişikliğin gün içindeki yerleşimidir. Gecelik koşum her günün 480. dakikasında, sürüm koşumu dört sürüm gününün aynı dakikasında kuyruğa girer — sürüm koşumu gecelik koşumla aynı ortama aynı anda talip olur.

// kuyruk.mjs — tohumlu gelis dizisi ve k ortamli ilk gelen ilk hizmet kuyrugu
export const GUN = 20, IS_GUNU = 480, TAM_GUN = 1440, GUNLUK_DEGISIKLIK = 5;

// TS13: dogrusal eslenik uretec (onceki kurstan); tohum gorunur, dizi yeniden uretilebilir.
export function uretecKur(tohum) {
  let durum = tohum;
  return () => { durum = (durum * 1103515245 + 12345) % 2147483648; return durum / 2147483648; };
}

export function gelisler(tohum = 20260731) {
  const rast = uretecKur(tohum);
  const liste = [];
  for (let gun = 0; gun < GUN; gun += 1) {
    const dakikalar = [];
    for (let i = 0; i < GUNLUK_DEGISIKLIK; i += 1) dakikalar.push(Math.floor(rast() * IS_GUNU));
    for (const d of dakikalar.sort((a, b) => a - b)) liste.push(gun * TAM_GUN + d);
  }
  return liste;
}

// isler: { t, sure, asama }. adet Infinity ise ortam her zaman hazirdir.
export function kuyrukOlc(isler, adet) {
  const sirali = [...isler].sort((a, b) => a.t - b.t);
  const bosalma = adet === Infinity ? null : new Array(adet).fill(0);
  const bekleme = new Map();
  let mesgul = 0;
  for (const is of sirali) {
    let baslangic = is.t;
    if (bosalma !== null) {
      let en = 0;
      for (let i = 1; i < bosalma.length; i += 1) if (bosalma[i] < bosalma[en]) en = i;
      baslangic = Math.max(is.t, bosalma[en]);
      bosalma[en] = baslangic + is.sure;
    }
    const b = bekleme.get(is.asama) ?? [];
    b.push(baslangic - is.t);
    bekleme.set(is.asama, b);
    mesgul += is.sure;
  }
  const ozet = new Map();
  for (const [asama, b] of bekleme) {
    ozet.set(asama, { ort: b.reduce((a, x) => a + x, 0) / b.length, enKotu: Math.max(...b) });
  }
  const doluluk = adet === Infinity ? 0 : mesgul / (adet * GUN * TAM_GUN);
  return { ozet, doluluk };
}

Sekiz Düzen

Ölçüm önceki dersin üç sıklık kapı düzenini sabit tutar, yalnız ortam dağıtımını değiştirir. Aşamanın ortam sınıfı gereken sadakatin altındaysa kusur, yakalayan takım yazılmış olsa bile kaçar.

// olc.mjs — sekiz ortam duzeni ayni takim listesi uzerinde: kuyruk, bedel, kacan hata
import { SEVIYE, GUNLUK, KURULUM, asamalar, kusurlar, duzenler } from './matris.mjs';
import { gelisler, kuyrukOlc, GUN, IS_GUNU, TAM_GUN } from './kuyruk.mjs';

const GELIS = gelisler();
const SURUM_GUNLERI = [4, 9, 14, 19];               // TS9: yirmi is gununde dort surum

const isListesi = (asama, ek) => {
  const sure = asama.sure + ek;
  if (asama.siklik === 'degisiklik') return GELIS.map((t) => ({ t, sure, asama: asama.ad }));
  const gunler = asama.siklik === 'surum' ? SURUM_GUNLERI : [...Array(GUN).keys()];
  return gunler.map((g) => ({ t: g * TAM_GUN + IS_GUNU, sure, asama: asama.ad }));
};

export function olc(duzen) {
  const sinifi = new Map();                          // asama adi -> ortam sinifi
  for (const h of duzen.havuzlar) for (const a of h.asamalar) sinifi.set(a, h.sinif);

  let bedel = 0, doluluk = 0;
  const bekleme = new Map();
  for (const h of duzen.havuzlar) {
    const ek = h.sinif === 'gecici' ? KURULUM : 0;
    const isler = h.asamalar.flatMap((ad) => isListesi(asamalar.find((a) => a.ad === ad), ek));
    const r = kuyrukOlc(isler, h.adet);
    for (const [asama, o] of r.ozet) bekleme.set(asama, o);
    if (h.adet === Infinity) bedel += isler.reduce((a, x) => a + x.sure, 0);
    else { bedel += h.adet * GUNLUK[h.sinif] * GUN; doluluk = Math.max(doluluk, r.doluluk); }
  }

  let ek = 0, kuyruk = 0;                            // asama sirasinca birikir
  const geri = new Map();
  for (const a of asamalar) {
    if (sinifi.get(a.ad) === 'gecici') ek += KURULUM;
    kuyruk += bekleme.get(a.ad)?.ort ?? 0;
    geri.set(a.ad, a.taban + ek + kuyruk);
  }

  let kacan = 0, agirlik = 0, toplam = 0;
  for (const k of kusurlar) {
    const a = asamalar.find((x) => x.takimlar.includes(k.takim));
    const seviye = a === undefined ? 0 : SEVIYE[sinifi.get(a.ad) ?? 'yok'];
    if (a === undefined || seviye < k.ortam) { kacan += k.sayi; continue; }
    agirlik += k.sayi;
    toplam += geri.get(a.ad) * k.sayi;
  }
  return {
    ortam: duzen.havuzlar.reduce((a, h) => a + (h.adet === Infinity ? 0 : h.adet), 0),
    bedel: bedel / 100, doluluk, bekleme,
    kuyruk: bekleme.get('orta')?.ort ?? 0,
    enKotu: Math.max(0, ...[...bekleme.values()].map((o) => o.enKotu)),
    geri: toplam / agirlik, kacan,
  };
}

const s = (x, n) => String(x).padStart(n);
console.log(`${'duzen'.padEnd(22)}${s('ortam', 6)}${s('ortam-dk/deg', 14)}${s('doluluk', 9)}`
  + `${s('orta kuyruk', 13)}${s('en kotu', 9)}${s('ort geri', 10)}${s('kacan/100', 11)}`);
for (const d of duzenler) {
  const r = olc(d);
  console.log(`${d.ad.padEnd(22)}${s(r.ortam, 6)}${s(r.bedel.toFixed(0), 14)}`
    + `${s(r.ortam === 0 ? '-' : `%${(r.doluluk * 100).toFixed(0)}`, 9)}`
    + `${s(r.kuyruk.toFixed(1), 13)}${s(r.enKotu.toFixed(0), 9)}`
    + `${s(r.geri.toFixed(1), 10)}${s(r.kacan, 11)}`);
}

const tek = olc(duzenler.find((d) => d.ad === 'tek paylasilan'));
console.log(`\ntek paylasilan ortamda asama basina kuyruk (dakika):`);
for (const [asama, o] of tek.bekleme) {
  console.log(`  ${asama.padEnd(9)} ortalama ${s(o.ort.toFixed(1), 6)}, en kotu ${s(o.enKotu, 5)}`);
}
const yuk = 100 * 41 + 20 * 136 + 4 * 836;
console.log(`\ngelis dizisi tohumu 20260731; ${GELIS.length} degisiklik, ${GUN} is gunu, `
  + `ilk gelis ${GELIS[0] % TAM_GUN}. dakika, is gunu ${IS_GUNU} dakika`);
console.log(`bir paylasilan ortamin yuku ${yuk} dakika, ayrilmis suresi ${GUN * TAM_GUN} dakika`);
const gorulen = kusurlar.filter((k) => k.takim !== null);
const taban = gorulen.reduce((a, k) => a + asamalar.find((x) => x.takimlar.includes(k.takim)).taban * k.sayi, 0)
  / gorulen.reduce((a, k) => a + k.sayi, 0);
console.log(`ortam kuyrugu sifir sayildiginda ortalama geri bildirim ${taban.toFixed(1)} dakika`);
duzen                  ortam  ortam-dk/deg  doluluk  orta kuyruk  en kotu  ort geri  kacan/100
hepsi gecici               0           105        -          0.0        0      50.1         30
gecici orta                1           332      %21          0.0      136     262.9         24
tek paylasilan             1           288      %35          6.4      172     228.3         11
iki paylasilan             2           576      %18          0.0       38     212.5         11
dort paylasilan            4          1152       %9          0.0        0     211.6         11
ayri agir ortam            3           864      %21          0.0      136     221.4         11
uretim benzeri surum       4          2016      %12          0.0        0     240.3         10
uretim benzeri agir        3          1728      %21          0.0      136     263.5          5

tek paylasilan ortamda asama basina kuyruk (dakika):
  orta      ortalama    6.4, en kotu    50
  gecelik   ortalama   18.6, en kotu    79
  surum     ortalama  145.0, en kotu   172

gelis dizisi tohumu 20260731; 100 degisiklik, 20 is gunu, ilk gelis 74. dakika, is gunu 480 dakika
bir paylasilan ortamin yuku 10164 dakika, ayrilmis suresi 28800 dakika
ortam kuyrugu sifir sayildiginda ortalama geri bildirim 252.6 dakika

Tablonun Okunması

Son satır önceki dersle bağı kuruyor: ortam kuyruğu sıfır sayıldığında ortalama geri bildirim 252,6 dakikadır — önceki dersin üç sıklık satırındaki sayının aynısı. O sayı bir ortam varsayımını gizliyordu.

Tek paylaşılan ortam düzeninde doluluk yüzde 35’tir; ortam zamanın üçte ikisinde boştur. Buna rağmen kuyruk sıfır değildir ve nerede biriktiği ortalamadan okunamaz: orta aşama ortalama 6,4 dakika bekler, en kötü durumda 50; gecelik aşama 18,6 ve 79; sürüm aşaması 145,0 ve 172. Kuyruk en seyrek koşan aşamada en büyüktür: sürüm koşumu gecelik koşumla aynı dakikada aynı ortama talip olur ve 136 dakikalık koşumun arkasında bekler. İkinci ortam bunu doğrudan çözer — sürüm beklemesi 145’ten 7,5’e, orta aşamanınki sıfıra iner. Karşılığında bedel 288’den 576 ortam-dakikasına çıkar ve kaçan hata değişmez — on birde kalır. Kuyruk parayla çözülür, sadakat çözülmez.

Dört ortam bunu bir adım öteye götürür: kuyruk her aşamada sıfırlanır, doluluk yüzde 9’a iner, bedel 1152 ortam-dakikasına çıkar ve ortalama geri bildirim 212,5’ten yalnız 211,6’ya düşer. Üçüncü ve dördüncü ortam 576 ortam-dakikası karşılığında 0,9 dakika satın alır; yüzde 18 dolulukta çoğaltma bir şey kazandırmaz.

İlk iki satır ters yöne bakıyor. Hepsi geçici düzeni hiç ayrılmış ortam tutmaz, değişiklik başına 105 ortam-dakikasıyla en ucuz satırdır ve kaçan hatayı beşten otuza çıkarır. Geçici ortam yalnız orta aşamada tutulduğunda bile kaçan hata yirmi dörttür, çünkü uçtan uca takımı o aşamada koşar ve tek süreç ömürlü bir ortamda kart durumunu, reddedilen istekteki uyarıyı ve kontrol-sonra-yaz yarışını göremez. Bedeli 332 ortam-dakikasıdır — tek paylaşılan ortamdan pahalı, kaçan hatası iki katından fazla. İki eksende birden yenilen bir düzen tabloda görünür, anlatıda görünmez.

Ortalama geri bildirim sütunu önceki dersteki tuzağı yineliyor: hepsi geçici düzeni 50,1 dakikayla tablonun en iyi geri bildirimini verir, çünkü geç yakalanan sınıflar artık hiç yakalanmıyor ve ortalamanın paydasından düşüyor.

Son üç satır sadakatin nereye konacağını sorar. Üretim benzeri ortam sürüm kapısına konduğunda kaçan hata on birden yalnız ona iner; geri kazanılan tek sınıf az örnekle okunan yüzdeliktir. Aynı ortam gecelik aşamayı kapsadığında kaçan hata beşe düşer — gecikme gerilemesi ve kapasite sınırı orada koşan takımlardır — üstelik dört yerine üç ortamla ve 2016 yerine 1728 ortam-dakikasıyla. Sadakat, kapının geç olmasıyla değil orada koşan takımla eşleşir; en son kapıya en pahalı ortamı koymak parayı yanlış yere yatırmaktır.

Kaçan hata beşin altına inmiyor. Beş kusur, önceki dersin envanterinde hiçbir takımın görmediği iki sınıftandır; süreç ömrüne bağlı durumu üretim benzeri bir ortam da yakalamaz, çünkü onu yakalayacak bir sınama yazılmamıştır. Ortam sadakati bir sınamanın görme sınırını genişletir, sınamanın kendisini yazmaz.

Kararın Geri Dönüşü

Ortam kararının geri dönüşü iki yerde belirir. Birincisi kuyruktur: değişiklik ortam beklerken sahibi başka işe geçer, kırmızı sonuç geldiğinde bağlam kaybolmuştur — kuyruk süresi bu yüzden koşum süresiyle aynı hanede sayılır. İkincisi ortamın kendi kırmızısıdır: bir ortam bozulduğunda o aşamanın bütün testleri düşer ve düşen testler kusurdan değil ortamdan haber verir. Bu sonucun sahibi değişikliği yapan kişi değil ortamı tutan ekiptir; kararı testi karantinaya almak değil ortamı geri getirmektir. İki kırmızı türünün ayrılamaması, paylaşılan ortamın sayılmayan üçüncü bedelidir.

Özet

  • Ortam dört sınıfa ayrılır; sınıf, o aşamada koşan takımın görebileceği en üst kusur sınıfını belirler ve sınamanın kendisini yazmaz.
  • Ortam kuyruğu sıfır sayıldığında ortalama geri bildirim 252,6 dakikadır: önceki dersin sayısı gizli bir ortam varsayımına dayanıyordu.
  • Tek paylaşılan ortam yüzde 35 dolulukta bile kuyruk üretti; kuyruk en seyrek koşan aşamada en büyüktür (sürüm 145,0 dakika, orta 6,4 dakika).
  • İkinci ortam kuyruğu neredeyse sıfırlar, bedeli 288’den 576 ortam-dakikasına çıkarır ve kaçan hatayı değiştirmez; dördüncü ortam 576 ortam-dakikasıyla 0,9 dakika alır.
  • Geçici ortam en ucuz satırdır (105 ortam-dakikası) ve kaçan hatayı beşten otuza çıkarır; geçici ortamı orta aşamada tutan düzen hem daha pahalı hem daha çok hata kaçırır.
  • Üretim benzeri ortamı sürüm kapısı yerine gecelik aşamaya taşımak kaçan hatayı ondan beşe indirdi ve bedeli 2016’dan 1728 ortam-dakikasına düşürdü.

Sonraki Adım

Üretim benzeri ortam bir soruyu açıkta bırakıyor: üretime benzemek için o ortama ne konur. Veri tarafı Test Verisi Yönetimi dersinde ölçüldü. Sayılmayan şey erişim izni, kimlik, imzalama anahtarı ve dış servis belirtecidir; hepsi gizli değerdir ve teste verilen her gizli değer iki şey üretir — bir sızma yüzeyi ve yakalanabilir bir kusur sınıfı. Sonraki ders bu dağıtımı sayar: ortama hangi gizli değer girer, yetki kapsamı daraltıldığında açık yüzey ne kadar küçülür, süreli yetki kaç adımı elle bırakı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