Ders 14 / 16
Yama Yönetimi
Kusur duyurusundan yamanın uygulanmasına kadar geçen açık pencerenin dört parçaya ayrılması: beş pencere düzeninde ortalama açık pencere, kesinti ve geri alma sayısının karşılaştırılması, otomatik yamanın kazandırdığı günün ürettiği sınanmamış yama riskiyle aynı tabloda okunması ve yamalanamayan kalemin adıyla yazılması.
İçindekiler
Önceki ders erişimi daralttı ve sırların ömrünü kısalttı. Ama o kimlik bilgisini kullanan yazılımın kendisi — çekirdek, sistem kitaplığı, dil çalışma zamanı, ters vekil — durduğu yerde eskiyor. Bir kusur duyurusu yapıldığı anda, o bileşenin kurulu olduğu her makine bir açık yüzey kalemine dönüşür ve kalem, yama uygulanana kadar açık kalır. Varsayılanın burada bıraktığı bir ayar değil, bir boşluktur: hangi makinede hangi sürümün koştuğunu kimse bilmez ve yama, bir şey bozulduğunda uygulanır. Ölçü açık penceredir — duyuru ile uygulama arasında geçen süre; kaç kalemin ne kadar süre açık kaldığı ise açık kalem-günüdür.
Açık Pencere Dört Parçadır
Açık pencere tek bir sayı değil, bağımsız dört parçanın toplamıdır. Fark etme, duyuruyla o bileşenin filoda kurulu olduğunun görülmesi arasındaki süredir ve envanter tarama aralığına bağlıdır. Sınama, yamanın üretim dışı bir ortamda denenmesidir. Pencere bekleme, hazır yamanın bir sonraki bakım aralığını beklemesidir. Uygulama, kurulum ve yeniden başlatmadır.
Aşağıdaki düzenek bir modeldir. Kurgu bölgesel ölçüm ağının makineleri ve bileşenleri veri yapısı olarak yazılır; gerçek bir filo taranmaz.
- ST19 — Filo kurgudur: on iki makine, sekiz bileşen ve altmış (makine, bileşen) kalemi.
- ST20 — Doksan günlük pencerede on dört duyuru yapılıyor; günleri ve bileşenleri modelde yazılıdır.
- ST21 — Envanter tarama aralığı fark etmeyi belirler: duyuru bir sonraki taramada görülür.
- ST22 — Bakım penceresi sabit aralıklı ve sabit saatlidir;
pencere: 0beklemesiz düzendir. - ST23 — Yamanın kusurlu olup olmadığı kendi yazdığımız üreteçle belirlenir, tohum görünürdür. Sınama kusuru yakalarsa düzeltilmiş yama üç gün sonra gelir; yakalayamazsa yama üretime gider, yarım gün sonra görülür ve geri alınır.
- ST24 — Üç kalem hiçbir düzende yamalanamaz; gerekçeleri modelde yazılıdır.
// yama/model.mjs — yama akisi MODELIDIR: on iki kurgu makine, sekiz bilesen, on dort duyuru. // Gercek bir filo taranmaz, gercek bir yama indirilmez; butun sayilar bu dosyadan turer. const GRUP = { toplayici: 3, dogrulayici: 2, faturalama: 1, "is-emri": 1, veri: 2, gecit: 2, kuyruk: 1 }; export const MAKINELER = Object.entries(GRUP).flatMap(([a, n]) => Array.from({ length: n }, (_, i) => `${a}-${i + 1}`)); export const BILESEN = { // sinama ve uygulama sureleri gun cinsinden cekirdek: { sinama: 2.0, uygulama: 0.20, grup: "hepsi" }, "sistem-kitapligi": { sinama: 1.0, uygulama: 0.15, grup: "hepsi" }, "gozetim-ajani": { sinama: 0.25, uygulama: 0.05, grup: "hepsi" }, zamanlayici: { sinama: 0.25, uygulama: 0.05, grup: "hepsi" }, "dil-calisma-zamani": { sinama: 1.5, uygulama: 0.10, grup: ["toplayici", "dogrulayici", "faturalama", "is-emri"] }, "veritabani-sunucusu": { sinama: 2.0, uygulama: 0.25, grup: ["veri"] }, "ters-vekil": { sinama: 0.5, uygulama: 0.05, grup: ["gecit"] }, "mesaj-kuyrugu": { sinama: 1.0, uygulama: 0.10, grup: ["kuyruk"] }, }; export const makineleri = (b) => (BILESEN[b].grup === "hepsi" ? MAKINELER : MAKINELER.filter((m) => BILESEN[b].grup.includes(m.slice(0, m.lastIndexOf("-"))))); export const KALEM = Object.keys(BILESEN).reduce((a, b) => a + makineleri(b).length, 0); export const YAMALANAMAZ = [ // kalem = (makine, bilesen); gerekce adiyla yazilir ["faturalama-1", "dil-calisma-zamani", "uygulama uyumlulugu"], ["veri-1", "veritabani-sunucusu", "surekli calismasi gereken servis"], ["kuyruk-1", "mesaj-kuyrugu", "tek kopya, bosaltilamayan kuyruk"], ]; export const yamalanabilir = (b) => makineleri(b).filter((m) => !YAMALANAMAZ.some((k) => k[0] === m && k[1] === b)); export const DUYURU = [ // 90 gunluk pencerede on dort kusur duyurusu [3.2, "sistem-kitapligi"], [8.6, "dil-calisma-zamani"], [12.1, "cekirdek"], [19.4, "gozetim-ajani"], [23.0, "ters-vekil"], [27.8, "sistem-kitapligi"], [34.5, "veritabani-sunucusu"], [39.9, "zamanlayici"], [45.3, "cekirdek"], [51.7, "mesaj-kuyrugu"], [58.2, "dil-calisma-zamani"], [63.5, "sistem-kitapligi"], [71.1, "gozetim-ajani"], [78.4, "cekirdek"], ]; export const UFUK = 90, YENIDEN = 3.0, GORULME = 0.5, TOHUM = 4127; export function uretec(tohum) { // ureteci kendimiz yaziyoruz, tohum gorunur let x = tohum >>> 0; return () => { x = (Math.imul(x, 1103515245) + 12345) >>> 0; return x / 4294967296; }; } const r = uretec(TOHUM); // cekilis duzenden bagimsiz: hepsi ayni yamalari gorur export const KUSURLU = DUYURU.map(() => r() < 0.20); export const YAKALANIR = DUYURU.map(() => r() < 0.75); export const DUZEN = { // tarama = envanter araligi, pencere = bakim araligi varsayilan: { tarama: 30, sinama: false, pencere: 30, ofs: 5.0 }, haftalik: { tarama: 1, sinama: true, pencere: 7, ofs: 2.0 }, gecelik: { tarama: 1, sinama: true, pencere: 1, ofs: 2 / 24 }, surekli: { tarama: 0.25, sinama: true, pencere: 0, ofs: 0 }, otomatik: { tarama: 0.25, sinama: false, pencere: 0, ofs: 0 }, }; const ilkPencere = (d, hazir) => (d.pencere === 0 ? hazir : Math.ceil((hazir - d.ofs) / d.pencere) * d.pencere + d.ofs); // Bir duyurunun akisi: fark etme, sinama, pencere bekleme, uygulama. export function akis(i, adi, kusurlu = KUSURLU[i]) { const d = DUZEN[adi], [gun, b] = DUYURU[i], bil = BILESEN[b], olay = []; const fark = Math.ceil(gun / d.tarama) * d.tarama; const sinama = d.sinama ? bil.sinama : 0; let hazir = fark + sinama, geriAlma = 0; if (kusurlu && d.sinama && YAKALANIR[i]) hazir += YENIDEN; // sinama yakaladi: yama gecikir else if (kusurlu) { // sinanmadi ya da kacti: uretime gitti const ilk = ilkPencere(d, hazir); olay.push(ilk, ilk + GORULME); // uygulama ve ardindan geri alma geriAlma = 1; hazir = ilk + GORULME + YENIDEN; } const uygula = ilkPencere(d, hazir); olay.push(uygula); return { fark: fark - gun, sinama, bekleme: uygula - hazir, uygulama: bil.uygulama, kapanis: uygula + bil.uygulama, pencere: uygula + bil.uygulama - gun, geriAlma, olay }; } export function tara(adi, kusurluMu = null) { const kesinti = new Set(); let ort = 0, geriAlma = 0, kalemGun = 0, acik = 0; for (let i = 0; i < DUYURU.length; i += 1) { const a = akis(i, adi, kusurluMu === null ? KUSURLU[i] : kusurluMu); const yb = yamalanabilir(DUYURU[i][1]); ort += a.pencere / DUYURU.length; geriAlma += a.geriAlma; kalemGun += a.pencere * yb.length; if (a.kapanis > UFUK) acik += yb.length; for (const an of a.olay) for (const m of yb) kesinti.add(`${m}@${an.toFixed(4)}`); } return { ort, geriAlma, kalemGun, kesinti: kesinti.size, acik: acik + YAMALANAMAZ.length }; }
Beş Düzen Taranıyor
// yama/pencere.mjs — bes pencere duzeninde acik pencerenin dort parcasi ve bedelleri import { DUYURU, DUZEN, MAKINELER, BILESEN, KALEM, KUSURLU, TOHUM, akis, tara } from "./model.mjs"; const g = (x, n, d = 2) => x.toFixed(d).padStart(n); console.log(`${MAKINELER.length} makine, ${Object.keys(BILESEN).length} bilesen, ${KALEM} kalem; ` + `90 gunde ${DUYURU.length} duyuru, ${KUSURLU.filter(Boolean).length} kusurlu yama (tohum ${TOHUM}).`); console.log("\nduzen | tarama | sinama | pencere | ort. acik | acik kalem | kesinti | geri alma"); console.log("-----------|--------|--------|---------|-----------|------------|---------|----------"); for (const [ad, d] of Object.entries(DUZEN)) { const t = tara(ad); console.log(`${ad.padEnd(10)} | ${g(d.tarama, 6)} | ${(d.sinama ? "var" : "yok").padStart(6)}` + ` | ${(d.pencere ? d.pencere + " gun" : "yok").padStart(7)} | ${g(t.ort, 9)}` + ` | ${String(t.acik).padStart(10)} | ${String(t.kesinti).padStart(7)} | ${String(t.geriAlma).padStart(8)}`); } console.log("\nAcik pencerenin dort parcasi (gun), on dort duyurunun ortalamasi:"); console.log("duzen | fark etme | sinama | pencere bekleme | uygulama | toplam"); console.log("-----------|-----------|--------|-----------------|----------|-------"); for (const ad of Object.keys(DUZEN)) { const p = { fark: 0, sinama: 0, bekleme: 0, uygulama: 0, pencere: 0 }; for (let i = 0; i < DUYURU.length; i += 1) for (const k of Object.keys(p)) p[k] += akis(i, ad)[k] / DUYURU.length; console.log(`${ad.padEnd(10)} | ${g(p.fark, 9)} | ${g(p.sinama, 6)} | ${g(p.bekleme, 15)}` + ` | ${g(p.uygulama, 8)} | ${g(p.pencere, 6)}`); }
12 makine, 8 bilesen, 60 kalem; 90 gunde 14 duyuru, 4 kusurlu yama (tohum 4127). duzen | tarama | sinama | pencere | ort. acik | acik kalem | kesinti | geri alma -----------|--------|--------|---------|-----------|------------|---------|---------- varsayilan | 30.00 | yok | 30 gun | 28.94 | 45 | 54 | 4 haftalik | 1.00 | var | 7 gun | 6.79 | 3 | 126 | 1 gecelik | 1.00 | var | 1 gun | 3.09 | 3 | 147 | 1 surekli | 0.25 | var | yok | 2.28 | 3 | 147 | 1 otomatik | 0.25 | yok | yok | 1.22 | 3 | 205 | 4 Acik pencerenin dort parcasi (gun), on dort duyurunun ortalamasi: duzen | fark etme | sinama | pencere bekleme | uygulama | toplam -----------|-----------|--------|-----------------|----------|------- varsayilan | 15.24 | 0.00 | 11.14 | 0.13 | 28.94 haftalik | 0.52 | 1.16 | 3.89 | 0.13 | 6.79 gecelik | 0.52 | 1.16 | 0.33 | 0.13 | 3.09 surekli | 0.09 | 1.16 | 0.00 | 0.13 | 2.28 otomatik | 0.09 | 0.00 | 0.00 | 0.13 | 1.22
İkinci tablo varsayılanın nerede kaybettiğini gösteriyor: 28,94 günün 15,24’ü fark etmedir. Bu sürenin yamayla ya da kesinti korkusuyla ilgisi yok; tek nedeni hangi sürümün nerede koştuğunu tutan bir kaydın bulunmamasıdır. Envanter taraması günlüğe çekildiğinde bu parça 0,52 güne iniyor — tek adımda 14,72 gün, üstelik hiçbir makine yeniden başlatılmadan.
Sınama ters yönde çalışan tek kalemdir: yoktan 1,16 güne çıkar, yani pencereyi uzatır. Karşılığı geri alma sütunundadır: on dört yamanın dördü kusurlu, sınama yapılan üç düzende bunların üçü üretime ulaşmadan yakalandı ve geri alma 4 yerine 1 oldu.
Kesinti ise pencere aralığıyla ters çalışır. Varsayılan düzen 54 kesintiyle en sessiz olanıdır, çünkü aylık pencerede biriken yamalar tek yeniden başlatmada toplanır — ve aynı toplanma pencereyi 28,94 güne çıkaran şeydir. Gecelik düzende kesinti 126’dan 147’ye çıkar, bekleme 3,89 günden 0,33 güne iner. Kesinti sayısı ile açık pencere aynı kaldıracın iki ucudur. Doksanıncı gün sayımı sonuçtur: varsayılan düzende 45 kalem açık, öteki dört düzende 3.
Otomasyonun Kazandırdığı Gün ve Ürettiği Risk
// yama/otomasyon.mjs — otomasyonun kazandirdigi gun, urettigi risk ve getirdigi yeni yuzey import { DUYURU, DUZEN, MAKINELER, YAMALANAMAZ, KALEM, UFUK, KUSURLU, tara } from "./model.mjs"; const g = (x, n, d = 2) => x.toFixed(d).padStart(n); const taban = tara("haftalik"); console.log("duzen | ort. acik | haftaliga gore | sinanmadan | uretimde | geri almanin | ek"); console.log(" | (gun) | kazanc (gun) | uygulanan | geri alma | ekledigi gun | kesinti"); console.log("-----------|-----------|----------------|------------|-----------|--------------|--------"); for (const ad of Object.keys(DUZEN)) { const t = tara(ad), s = tara(ad, false); // s: hicbir yama kusurlu degilse console.log(`${ad.padEnd(10)} | ${g(t.ort, 9)} | ${g(taban.ort - t.ort, 14)}` + ` | ${String(DUZEN[ad].sinama ? 0 : DUYURU.length).padStart(10)} | ${String(t.geriAlma).padStart(9)}` + ` | ${g(t.ort - s.ort, 12)} | ${String(t.kesinti - s.kesinti).padStart(7)}`); } console.log("\nYamalanamayan kalemler (duyuru gelir, uygulama hicbir duzende olmaz):"); let yamalanamazGun = 0; for (const [m, b, gerekce] of YAMALANAMAZ) { const ilk = DUYURU.find(([, x]) => x === b)[0]; yamalanamazGun += UFUK - ilk; console.log(`${(m + " / " + b).padEnd(34)} | ${gerekce.padEnd(32)} | duyuru ${g(ilk, 4, 1)}. gun` + ` | ${g(UFUK - ilk, 5, 1)} gun acik`); } const kalemGun = tara("gecelik").kalemGun; console.log(`gecelik duzende yamalanabilir ${KALEM - YAMALANAMAZ.length} kalem : ${g(kalemGun, 7)} kalem-gunu`); console.log(`yamalanamayan ${YAMALANAMAZ.length} kalem${" ".repeat(24)} : ${g(yamalanamazGun, 7)} kalem-gunu ` + `(toplamin %${g(100 * yamalanamazGun / (kalemGun + yamalanamazGun), 5)}'i)`); // kapatmanin getirdigi yeni yuzey: her makinede bir yama ajani, bir paket kaynagi, bir envanter kaydi const yeni = MAKINELER.length + 3; console.log(`\nyeni yuzey: ${MAKINELER.length} yama ajani + paket kaynagi + envanter kaydi + bakim penceresi`); console.log(`${KALEM} kalem -> ${KALEM + yeni} kalem (+${yeni}); acik pencere ` + `${g(tara("varsayilan").ort, 5)} gunden ${g(tara("otomatik").ort, 5)} gune indi, ` + `geri alma ${taban.geriAlma} yerine ${tara("otomatik").geriAlma}, ` + `kesinti ${taban.kesinti} yerine ${tara("otomatik").kesinti}.`); console.log(`kusurlu yama ${KUSURLU.filter(Boolean).length}/${DUYURU.length}; ` + `sinama bunlarin ${KUSURLU.filter(Boolean).length - taban.geriAlma} tanesini uretimden once yakaladi.`);
duzen | ort. acik | haftaliga gore | sinanmadan | uretimde | geri almanin | ek
| (gun) | kazanc (gun) | uygulanan | geri alma | ekledigi gun | kesinti
-----------|-----------|----------------|------------|-----------|--------------|--------
varsayilan | 28.94 | -22.14 | 14 | 4 | 8.57 | 18
haftalik | 6.79 | 0.00 | 0 | 1 | 1.50 | 17
gecelik | 3.09 | 3.70 | 0 | 1 | 0.93 | 24
surekli | 2.28 | 4.52 | 0 | 1 | 0.89 | 24
otomatik | 1.22 | 5.57 | 14 | 4 | 1.00 | 82
Yamalanamayan kalemler (duyuru gelir, uygulama hicbir duzende olmaz):
faturalama-1 / dil-calisma-zamani | uygulama uyumlulugu | duyuru 8.6. gun | 81.4 gun acik
veri-1 / veritabani-sunucusu | surekli calismasi gereken servis | duyuru 34.5. gun | 55.5 gun acik
kuyruk-1 / mesaj-kuyrugu | tek kopya, bosaltilamayan kuyruk | duyuru 51.7. gun | 38.3 gun acik
gecelik duzende yamalanabilir 57 kalem : 407.50 kalem-gunu
yamalanamayan 3 kalem : 175.20 kalem-gunu (toplamin %30.07'i)
yeni yuzey: 12 yama ajani + paket kaynagi + envanter kaydi + bakim penceresi
60 kalem -> 75 kalem (+15); acik pencere 28.94 gunden 1.22 gune indi, geri alma 1 yerine 4, kesinti 126 yerine 205.
kusurlu yama 4/14; sinama bunlarin 3 tanesini uretimden once yakaladi.
Otomatik düzen haftalığa göre 5,57 gün kazandırıyor ve en kısa pencereye sahip. Aynı satırda üç sayı daha var: on dört yamanın on dördü sınanmadan uygulandı, dördü üretimde geri alındı ve geri alma 82 fazladan kesinti üretti. Sürekli düzen ise 4,52 gün kazandırıyor — kazancın yüzde 81’i — ama sınanmadan uygulanan yama sıfır ve ek kesinti 24. Aradaki fark 1,06 gündür. Tartışma otomasyonun kendisi değil, sınamanın atlanıp atlanmadığıdır. Geri almanın eklediği gün sütunu ise kusurlu yamanın kendi penceresini uzattığını gösteriyor: otomatik düzende 1,00 gün, varsayılan düzende 8,57 gün — çünkü düzeltilmiş sürüm bir sonraki aylık pencereyi bekler.
İkinci tablo kapatılamayan kalemi adıyla yazıyor. Faturalama makinesindeki dil çalışma zamanı, gün sonu toplu işi eski sürüme bağlı olduğu için yükseltilemez; birincil veri makinesindeki veritabanı sunucusu, gecelik toplu iş penceresinde yazma kesintisine yer olmadığı için yeniden başlatılamaz; tek kopya kuyruk boşaltılamadığı için durdurulamaz. Bu üç kalem 175,20 kalem-günü taşıyor — altmış kalemin yüzde 5’i, açık kalem-gününün yüzde 30,07’si.
Kapatmanın kendisi de yüzey getiriyor. Yama otomasyonu on iki makinenin her birine yükseltilmiş yetkiyle kod çalıştıran bir süreç koyar; paket kaynağı dışarıdan gelen ikili dosyanın tek güven noktasıdır; envanter kaydı okuyabilen biri için filonun tam bir kusur haritasıdır; bakım penceresi her gece aynı saatte tekrarlanan, önceden bilinen bir bozulma aralığıdır.
Özet
- Açık pencere dört parçadır: fark etme, sınama, pencere bekleme, uygulama. Varsayılan düzende 28,94 günün 15,24’ü tek başına fark etmedir ve envanter taraması bunu 0,52 güne indirir.
- Sınama pencereyi 1,16 gün uzatır, karşılığında üretimde geri alınan yamayı 4’ten 1’e düşürür.
- Kesinti sayısı ile açık pencere ters çalışır: aylık pencerede 54 kesinti ve 28,94 gün, gecelikte 147 kesinti ve 3,09 gün. Doksanıncı günde açık kalem 45’ten 3’e iner.
- Otomatik yama 5,57 gün kazandırır ama on dört yamanın hepsini sınanmadan uygular, geri almayı 4’e çıkarır ve 82 fazladan kesinti üretir; sürekli düzen kazancın yüzde 81’ini sınamayı bırakmadan verir.
- Yamalanamayan üç kalem — uygulama uyumluluğu, sürekli çalışması gereken servis, tek kopya kuyruk — altmış kalemin yüzde 5’i olduğu hâlde açık kalem-gününün yüzde 30,07’sini taşır.
- Kapatmanın getirdiği yeni yüzey on beş kalemdir: yama ajanı, paket kaynağı, envanter kaydı ve bakım penceresi; toplam 60’tan 75’e çıkar.
Sonraki Adım
Bu ders bir varsayımı hiç sınamadı: yama geri alındığında geri dönülecek bir önceki durumun var olduğu. Yamalanamayan kalemlerin çözümü de aynı varsayıma yaslanıyordu. Kurtarma hedefleri Dayanıklılık Kalıpları kursunda ölçüldü ve burada girdi olarak alınır; sonraki ders hedefleri değil yedeğin kendisini ölçer: üretimdeki kalemlerden kaçı gerçekten yedekleniyor, hangi kalem adıyla dışarıda kalıyor, sıklık ile veri kaybı penceresi ve saklama ile geriye gidilebilen nokta nerede kesişiyor. Yedeğin kendisi de bir yüzeydir: kaç kopya, nerede, kim okuyabiliyor.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.