Ders 02 / 15
Makine İmajları
Açılışta yapılan sekiz kalem tek tek imaja gömülür ve her kalemin kazandırdığı saniye ile ödettiği bayatlık yan yana sayılır; gömme düzeyi sıfırdan sekize taranarak açılış süresi, dış çağrı sayısı, bağımlılık türü, aylık pişirme yükü ve bayat kalem-günü çıkarılır; açılışta kalan işin hangi bağımlılığa bağlı olduğu ve o bağımlılık düştüğünde açılışın durup durmadığı ölçülür.
İçindekiler
Önceki ders bir kalemi tek satırda geçti: yeniden yaratma 35 dakika. O sürenin içindeki asıl iş, boş bir diskin çalışan bir makineye dönüşmesidir ve bu dönüşüm bir makine imajından başlar. İmaj, örneğin kök diskine kopyalanan hazır dosya sistemidir; içinde ne varsa açılışta yapılmaz, içinde ne yoksa açılışta yapılır.
M22/K05 bu imajın nasıl üretildiğini — pişirme akışını, sürümlenmesini ve yayılma penceresini — ölçtü; o ölçüm burada tekrarlanmaz. Bu dersin ölçüsü tek bir eksendir: açılış süresi. Her kalem için aynı soru sorulur — bu kalem imaja gömülürse açılış kaç saniye kısalır, karşılığında imaj kaç gün daha bayat kalır ve ayda kaç kez yeniden pişirmek gerekir. Cevap kalemden kaleme değişir ve değişimin büyüklüğü, “her şeyi imaja gömmek” ile “hiçbir şeyi gömmemek” arasındaki tercihi bir zevk meselesi olmaktan çıkarır.
BH7. Bölgesel ölçüm ağının — su sayaçlarından okuma toplayan kurgu yazılımın — açılışında on kalem yapılır; sekizi imaja gömülebilir, ikisi gömülemez. Süreler, boyutlar ve değişim aralıkları kurgudur. BH8. Taban imaj 900 MB’dır, çekme hızı 60 MB/sn’dir, çekirdek açılışı her yolda 11 saniyedir. BH9. Pişirme haftada bir toplu yapılır; bir değişikliğin imaja girmek için beklediği süre ortalama 3,5 gündür. BH10. Bir pişirme, sınamasıyla birlikte 18 dakika tutar. BH11. Gömme sırası açgözlüdür: pişirme başına en çok saniye kazandıran kalem önce gömülür. BH12. Bir kalemin “kritik” olması, o kalem eksikken servisin başlamaması demektir; ayrım kurgudur.
Bir Kalemin İki Yüzü
Açılışta yapılan her iş bağımsız bir kalemdir ve her kalemin imaja gömülmesi ayrı bir karardır. Kalem gömülünce açılıştaki saniyesi kalkar ama imajın boyutu büyür — ve büyüyen imajın çekilmesi açılışa saniye ekler. Net kazanç bu ikisinin farkıdır. Bedel ise başka bir birimdedir: kalem ne kadar sık değişiyorsa, imaja gömülmesi o kadar sık yeniden pişirme ister.
// olcum-agi/imaj-kalemleri.mjs — bir kalemi imaja gommenin acilis kazanci ve tazelik bedeli (model) export const HIZ = 60, TABAN_MB = 900, CEKIRDEK = 11; // MB/sn, taban imaj, cekirdek acilisi (sn) export const PISIRME_BEKLEME = 3.5, PISIRME_DK = 18; // haftalik toplu pisirmede ortalama bekleme // [ad, acilista sn, imaja ekledigi MB, kac gunde bir degisir, bagimlilik, cagri, kritik mi] export const KALEM = [ ["cekirdek paketleri", 46, 320, 45, "paket deposu", 6, true], ["calisma zamani", 38, 210, 30, "paket deposu", 3, true], ["olcum aracisi", 14, 60, 14, "paket deposu", 2, false], ["gunluk yonlendirme", 8, 20, 21, "paket deposu", 1, false], ["sertifika demeti", 9, 12, 7, "yapilandirma sunucusu", 1, true], ["uygulama ikilisi", 22, 90, 2, "yapim deposu", 1, true], ["ag ayarlari", 6, 2, 3, "yapilandirma sunucusu", 1, true], ["ortam degiskenleri", 3, 1, 1, "yapilandirma sunucusu", 1, false], ]; // Gomulemez kalemler: acilista her zaman yapilir. export const GOMULEMEZ = [["dugum sirri", 7, "sir deposu", 1, true], ["saat esitleme", 4, "zaman sunucusu", 1, false]]; export const olc = ([ad, sn, mb, gun, , cagri]) => ({ ad, kazanc: sn - mb / HIZ, pisirme: 30 / gun, cagri, bayat: (30 / gun) * PISIRME_BEKLEME, }); // Acgozlu sira: pisirme basina en cok saniye kazandiran kalem once gomulur. export const SIRA = [...KALEM].sort((a, b) => olc(b).kazanc / olc(b).pisirme - olc(a).kazanc / olc(a).pisirme); if (import.meta.url === `file://${process.argv[1]}`) { console.log("kalem".padEnd(22) + "acilista".padEnd(10) + "imaja".padEnd(9) + "cekme".padEnd(9) + "net kazanc".padEnd(12) + "ayda pisirme".padEnd(14) + "bayat kalem-gun".padEnd(17) + "oran"); for (const k of SIRA) { const o = olc(k); console.log(o.ad.padEnd(22) + `${k[1]} sn`.padEnd(10) + `${k[2]} MB`.padEnd(9) + `${(k[2] / HIZ).toFixed(1)} sn`.padEnd(9) + `${o.kazanc.toFixed(1)} sn`.padEnd(12) + o.pisirme.toFixed(2).padEnd(14) + o.bayat.toFixed(1).padEnd(17) + (o.kazanc / o.pisirme).toFixed(1)); } const g = GOMULEMEZ.reduce((t, x) => t + x[1], 0); console.log(`\ngomulemez kalemler: ${GOMULEMEZ.map((x) => x[0]).join(", ")} — ` + `${g} sn ve ${GOMULEMEZ.length} cagri her acilista kalir`); }
kalem acilista imaja cekme net kazanc ayda pisirme bayat kalem-gun oran cekirdek paketleri 46 sn 320 MB 5.3 sn 40.7 sn 0.67 2.3 61.0 calisma zamani 38 sn 210 MB 3.5 sn 34.5 sn 1.00 3.5 34.5 olcum aracisi 14 sn 60 MB 1.0 sn 13.0 sn 2.14 7.5 6.1 gunluk yonlendirme 8 sn 20 MB 0.3 sn 7.7 sn 1.43 5.0 5.4 sertifika demeti 9 sn 12 MB 0.2 sn 8.8 sn 4.29 15.0 2.1 uygulama ikilisi 22 sn 90 MB 1.5 sn 20.5 sn 15.00 52.5 1.4 ag ayarlari 6 sn 2 MB 0.0 sn 6.0 sn 10.00 35.0 0.6 ortam degiskenleri 3 sn 1 MB 0.0 sn 3.0 sn 30.00 105.0 0.1 gomulemez kalemler: dugum sirri, saat esitleme — 11 sn ve 2 cagri her acilista kalir
Son sütun kalemleri iki kümeye ayırır. cekirdek paketleri 40,7 saniye kazandırır ve ayda 0,67 kez
pişirme ister; oran 61’dir. ortam degiskenleri 3 saniye kazandırır ve ayda 30 kez pişirme ister;
oran 0,1’dir. İki kalem arasında altı yüz kat fark vardır ve fark boyuttan değil, değişim
sıklığından gelir. İmaja gömülmeye en uygun kalem, açılışta en uzun süren kalem değildir; uzun
sürüp seyrek değişen kalemdir.
uygulama ikilisi satırı bu ayrımın en görünür yeridir. Açılışta 22 saniye tutar — listenin en
uzun üçüncü kalemi — ama iki günde bir değişir. Gömülürse ayda 15 pişirme tetikler ve 52,5 bayat
kalem-günü biriktirir. Aynı 20,5 saniyeyi calisma zamani yalnız 3,5 bayat kalem-güne satar.
Sezgi “en büyük kalemi göm” der; oran sütunu “en durağan kalemi göm” der.
Gömülemez iki kalem ölçünün alt sınırını çizer. Düğüm sırrı imaja yazılamaz, çünkü imajı okuyabilen herkes sırrı da okur; saat eşitlemesi imajdan gelemez, çünkü ölçülen şey açılış anıdır. Bu iki kalem 11 saniye ve 2 çağrıdır ve hiçbir pişirme kararı bunları kaldıramaz.
Gömme Düzeyi Taraması
Tek tek kalemler karşılaştırıldı; sıradaki soru kaç tanesinin gömüleceğidir. Aşağıdaki tarama oran sütununa göre sıralanmış listeyi baştan alır ve sıfırdan sekize kadar her düzeyde açılışı yeniden hesaplar.
// olcum-agi/gomme-taramasi.mjs — kac kalem imaja gomulurse acilis ne oluyor (model) import { HIZ, TABAN_MB, CEKIRDEK, PISIRME_DK, KALEM, GOMULEMEZ, SIRA, olc } from "./imaj-kalemleri.mjs"; export const duzey = (k) => { const gomulu = SIRA.slice(0, k), acik = SIRA.slice(k); const mb = TABAN_MB + gomulu.reduce((t, x) => t + x[2], 0); const sure = CEKIRDEK + mb / HIZ + acik.reduce((t, x) => t + x[1], 0) + GOMULEMEZ.reduce((t, x) => t + x[1], 0); const cagri = acik.reduce((t, x) => t + x[5], 0) + GOMULEMEZ.reduce((t, x) => t + x[3], 0); const tur = new Set([...acik.map((x) => x[4]), ...GOMULEMEZ.map((x) => x[2])]).size; return { k, mb, sure, cagri, tur, pisirme: gomulu.reduce((t, x) => t + olc(x).pisirme, 0), bayat: gomulu.reduce((t, x) => t + olc(x).bayat, 0), son: k ? SIRA[k - 1][0] : "—" }; }; if (import.meta.url === `file://${process.argv[1]}`) { console.log("gomulu".padEnd(9) + "son gomulen".padEnd(22) + "imaj".padEnd(10) + "acilis".padEnd(10) + "dis cagri".padEnd(11) + "bagimlilik".padEnd(12) + "ayda pisirme".padEnd(14) + "pisirici dk".padEnd(13) + "bayat kalem-gun"); for (let k = 0; k <= KALEM.length; k++) { const d = duzey(k); console.log(`${k}/${KALEM.length}`.padEnd(9) + d.son.padEnd(22) + `${d.mb} MB`.padEnd(10) + `${d.sure.toFixed(1)} sn`.padEnd(10) + String(d.cagri).padEnd(11) + `${d.tur} tur`.padEnd(12) + d.pisirme.toFixed(2).padEnd(14) + Math.round(d.pisirme * PISIRME_DK).toString().padEnd(13) + d.bayat.toFixed(1)); } const s = duzey(0), t = duzey(4), h = duzey(KALEM.length); console.log(`\nilk dort kalem: acilis ${(s.sure - t.sure).toFixed(1)} sn kisaliyor, ` + `${t.bayat.toFixed(1)} bayat kalem-gunune mal oluyor`); console.log(`son dort kalem: acilis ${(t.sure - h.sure).toFixed(1)} sn kisaliyor, ` + `${(h.bayat - t.bayat).toFixed(1)} bayat kalem-gunune mal oluyor`); console.log(`saniye basina bayatlik: ilk dortte ${(t.bayat / (s.sure - t.sure)).toFixed(2)}, ` + `son dortte ${((h.bayat - t.bayat) / (t.sure - h.sure)).toFixed(2)} kalem-gun/sn`); }
gomulu son gomulen imaj acilis dis cagri bagimlilik ayda pisirme pisirici dk bayat kalem-gun 0/8 — 900 MB 183.0 sn 18 5 tur 0.00 0 0.0 1/8 cekirdek paketleri 1220 MB 142.3 sn 12 5 tur 0.67 12 2.3 2/8 calisma zamani 1430 MB 107.8 sn 9 5 tur 1.67 30 5.8 3/8 olcum aracisi 1490 MB 94.8 sn 7 5 tur 3.81 69 13.3 4/8 gunluk yonlendirme 1510 MB 87.2 sn 6 4 tur 5.24 94 18.3 5/8 sertifika demeti 1522 MB 78.4 sn 5 4 tur 9.52 171 33.3 6/8 uygulama ikilisi 1612 MB 57.9 sn 4 3 tur 24.52 441 85.8 7/8 ag ayarlari 1614 MB 51.9 sn 3 3 tur 34.52 621 120.8 8/8 ortam degiskenleri 1615 MB 48.9 sn 2 2 tur 64.52 1161 225.8 ilk dort kalem: acilis 95.8 sn kisaliyor, 18.3 bayat kalem-gunune mal oluyor son dort kalem: acilis 38.3 sn kisaliyor, 207.5 bayat kalem-gunune mal oluyor saniye basina bayatlik: ilk dortte 0.19, son dortte 5.42 kalem-gun/sn
Tarama tek bir eğri değil, iki farklı eğridir. Açılış süresi 183 saniyeden 48,9 saniyeye düşerken azalan getiri verir: ilk dört kalem 95,8 saniye kazandırır, son dört kalem 38,3 saniye. Bayatlık ise ters yönde ve hızlanarak artar: ilk dört kalem 18,3 bayat kalem-günü, son dört kalem 207,5 bayat kalem-günü ödetir. Son satır iki eğriyi tek sayıya çevirir — kazanılan saniyenin fiyatı ilk dörtte 0,19 kalem-gün, son dörtte 5,42 kalem-gündür. Yirmi sekiz kat.
Pişirici dakika sütunu aynı şeyi işgücü tarafından yazar. Dört kalem gömülüyken imaj üretici ayda 94 dakika çalışır; sekiz kalem gömülüyken 1161 dakika — yaklaşık on dokuz saat. Bu, kimsenin plana yazmadığı ama her ay ödenen bir bedeldir ve pişirme hattının kendisinin izlenmesi gereken bir altyapı parçası olmasının nedenidir.
Bağımlılık sütunu ise düz düşmez, basamak basamak düşer: 5 türden 4’e dördüncü kalemde, 3’e altıncıda, 2’ye sekizincide iner. Neden ilk dört kalemin dördünün de aynı bağımlılığı — paket deposunu — kullanmasıdır. Bir bağımlılık türü ancak ona bağlı son kalem de gömüldüğünde kalkar; ilk üç kalemi gömmek çağrıyı 18’den 7’ye indirir ama tür sayısını hiç değiştirmez.
Açılışta Kalanın Yüzeyi
Çağrı sayısı bir yüzey ölçüsüdür: her çağrı, açılış anında ayakta olması gereken ayrı bir şeydir. Ama bütün çağrılar aynı ağırlıkta değildir. Kimi kalem eksikse servis hiç başlamaz, kimi kalem eksikse makine açılır ve eksik çalışır.
// olcum-agi/acilis-yuzeyi.mjs — acilista kalan isin dis yuzeyi ve karar defteri (model) import { KALEM, GOMULEMEZ, SIRA } from "./imaj-kalemleri.mjs"; import { duzey } from "./gomme-taramasi.mjs"; const DUZEY = [0, 4, 8]; const acik = (k) => [...SIRA.slice(k).map(([ad, sn, , , b, c, kr]) => ({ ad, sn, b, c, kr })), ...GOMULEMEZ.map(([ad, sn, b, c, kr]) => ({ ad, sn, b, c, kr }))]; const etki = (k, bag) => { const l = acik(k).filter((x) => x.b === bag); if (!l.length) return "etkisiz"; if (l.some((x) => x.kr)) return "acilis basarisiz"; return `-${l.reduce((t, x) => t + x.sn, 0)} sn, ${l.length} kalem eksik`; }; // [kalem, kimde, geri alinabilir mi] const KARAR = [["imaja hangi kalem girer", "sende", "evet — yeni imaj"], ["taban isletim sistemi surumu", "sende", "evet — yeni imaj"], ["pisirme sikligi", "sende", "evet"], ["yayimlanmis imajin icerigi", "sende", "hayir — ayni kimlikle degismez"], ["imaja giren sir", "sende", "hayir — kopyalandiysa silmek yetmez"], ["ornege verilen baslangic betigi", "sende", "hayir — yaratildiktan sonra degismez"], ["imaj deposunun dayanikliligi", "saglayicida", "—"], ["imajin kopyalanma hizi", "saglayicida", "—"], ["taban imajin altindaki sanallastirma", "saglayicida", "—"]]; if (import.meta.url === `file://${process.argv[1]}`) { const BAG = [...new Set([...KALEM.map((x) => x[4]), ...GOMULEMEZ.map((x) => x[2])])]; console.log("dusen bagimlilik".padEnd(24) + DUZEY.map((k) => `${k}/8 gomulu`.padEnd(22)).join("").trimEnd()); for (const b of BAG) console.log((b.padEnd(24) + DUZEY.map((k) => etki(k, b).padEnd(22)).join("")).trimEnd()); console.log(""); console.log("duzey".padEnd(9) + "acilis".padEnd(10) + "acik kalem".padEnd(13) + "kritik acik kalem".padEnd(20) + "acilisi durduran bagimlilik"); for (const k of DUZEY) { const a = acik(k); console.log(`${k}/8`.padEnd(9) + `${duzey(k).sure.toFixed(1)} sn`.padEnd(10) + String(a.length).padEnd(13) + String(a.filter((x) => x.kr).length).padEnd(20) + String(new Set(a.filter((x) => x.kr).map((x) => x.b)).size)); } const say = (v) => KARAR.filter((x) => x[1] === v).length; console.log(`\nkarar defteri: ${say("sende")} kalem elde, ${say("saglayicida")} kalem saglayicida`); for (const [ad, , geri] of KARAR.filter((x) => x[2].startsWith("hayir"))) console.log(` geri alinamaz — ${ad.padEnd(32)} ${geri.slice(8)}`); }
dusen bagimlilik 0/8 gomulu 4/8 gomulu 8/8 gomulu paket deposu acilis basarisiz etkisiz etkisiz yapilandirma sunucusu acilis basarisiz acilis basarisiz etkisiz yapim deposu acilis basarisiz acilis basarisiz etkisiz sir deposu acilis basarisiz acilis basarisiz acilis basarisiz zaman sunucusu -4 sn, 1 kalem eksik -4 sn, 1 kalem eksik -4 sn, 1 kalem eksik duzey acilis acik kalem kritik acik kalem acilisi durduran bagimlilik 0/8 183.0 sn 10 6 4 4/8 87.2 sn 6 4 3 8/8 48.9 sn 2 1 1 karar defteri: 6 kalem elde, 3 kalem saglayicida geri alinamaz — yayimlanmis imajin icerigi ayni kimlikle degismez geri alinamaz — imaja giren sir kopyalandiysa silmek yetmez geri alinamaz — ornege verilen baslangic betigi yaratildiktan sonra degismez
Açılışı durduran bağımlılık sayısı 4’ten 1’e iner ve bu, saniyeden bağımsız bir kazançtır. Hiçbir kalem gömülmemişken dört ayrı sistemin aynı anda ayakta olması gerekir; sekizi gömülmüşken tek bir sistem — sır deposu — kalır. Sır deposu satırı üç sütunda da aynıdır ve gömme kararıyla değiştirilemez. Zaman sunucusu satırı ise tek “yumuşak” satırdır: düşerse açılış tamamlanır, makine 4 saniye erken ve saati eşitlenmemiş olarak iş almaya başlar.
Bu satır sessiz bir tuzağın yeridir. Ölçüm ağının okumaları zaman damgalıdır; saati eşitlenmemiş bir makinenin ürettiği kayıtlar başarısız açılıştan daha zor fark edilir, çünkü makine sağlıklı görünür. Kritik olmayan kalemin eksik açılması bir hata değil, bir karardır.
Karar defteri dokuz kalemin altısını elde bırakır: imaja ne gireceği, taban sürümün ne olacağı, ne sıklıkta pişirileceği ve üç geri alınamayan kalem. Sağlayıcıda kalan üçü — imaj deposunun dayanıklılığı, kopyalanma hızı, altındaki sanallaştırma — çekme saniyesini belirler ama seçilemez.
Geri alınamayan üç kalem birbirinden farklı biçimde geri alınamaz. Yayımlanmış imajın içeriği aynı kimlikle değişmez; düzeltmek yeni bir imaj demektir ve o imaj eskisini silmez. İmaja giren sır, imaj bir kez kopyalandıysa silinerek geri alınamaz; bu yüzden sır deposu çağrısı bir eksiklik değil, bir tercihtir. Örneğe verilen başlangıç betiği ise örnek yaratılırken verilir ve o örnek yaşadığı sürece değişmez — betiği düzeltmek çalışan makineyi düzeltmez, yalnız bundan sonra yaratılacak makineleri düzeltir.
Özet
- Bir kalemin gömülmeye uygunluğunu boyutu değil değişim sıklığı belirler:
cekirdek paketleripişirme başına 61 saniye kazandırır,ortam degiskenleri0,1 saniye — altı yüz kat fark. uygulama ikilisiaçılışta 22 saniye tutar ama iki günde bir değişir; gömülürse ayda 15 pişirme ve 52,5 bayat kalem-günü ödetir, aynı saniyeyicalisma zamani3,5 kalem-güne satar.- Gömme düzeyi taramasında açılış 183 saniyeden 48,9 saniyeye iner; kazanılan saniyenin fiyatı ilk dört kalemde 0,19, son dört kalemde 5,42 bayat kalem-günüdür.
- Dış çağrı 18’den 2’ye düşer ama bağımlılık türü basamak basamak iner: bir tür ancak ona bağlı son kalem de gömüldüğünde kalkar; pişirici yükü 94 dakikadan 1161 dakikaya çıkar.
- Açılışı durduran bağımlılık 4’ten 1’e iner, sıfıra inmez; zaman sunucusu düşerse makine açılır ve saati eşitlenmemiş olarak iş alır — başarısız açılıştan daha zor görülen bir durumdur.
- Dokuz kalemin altısı elde, üçü sağlayıcıdadır; geri alınamayan üç kalem yayımlanmış imajın içeriği, imaja giren sır ve örneğe verilen başlangıç betiğidir.
Sonraki Adım
Bu ders açılışın ne kadar sürdüğünü ve neye bağlı olduğunu saydı, ama makinenin ne kadar yaşayacağını hiç sormadı. Bütün hesap örneğin istendiği sürece ayakta kalacağı varsayımı üzerine kuruldu: 183 saniye de 48,9 saniye de bir kez ödenir, sonra makine iş yapmaya devam eder.
Kiralamanın bir de kesintili biçimi vardır — kapasite ucuza verilir, karşılığında sağlayıcı onu kısa bir bildirimle geri alabilir. Önceki kurs bu biçimin fiyat farkını ölçtü; burada fiyat girdi olur ve soru iş türüne kayar. Sonraki ders dört iş türünü kesintili kapasitede koşturur ve sorar: bildirim süresi kısaldıkça hangi iş ne kadar iş kaybediyor, yeniden başlamak ne tutuyor ve hangi iş kesintiye hiç dayanmıyor?
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.