Ders 01 / 15
Sanal Makine Örnekleri
Dört iş yükü profili üç örnek ailesine eşlenir ve her eşleşmede atıl işlemci, atıl bellek ile darboğazın hangi boyutta doğduğu sayılır; aynı talep altı ayrı örnek boyutuna bölünür ve sabit yük ile arıza etkisinin ters yönde değiştiği ölçülür; bir örnekte hangi kararın elde kaldığı, hangisinin geri alınamadığı ve düzeltmenin filoya kaç saat tuttuğu çıkarılır.
İçindekiler
Önceki kurs kiralama kararını verdi ve coğrafyasını seçti: hangi katmanın devredildiği, hangi bölgenin seçildiği, çıkışın ne tuttuğu sayıldı. Ama kiralanan şeylerin en somutu — üzerinde sürecin koştuğu makine — hiç ele alınmadı. Bölge seçildiğinde henüz tek bir işlemci çekirdeği bile ayrılmış değildir.
Bu ders o makineyi kiralar. Sanal makine örneği, sağlayıcının fiziksel bir sunucudan ayırdığı ve tür olarak sunduğu hesaplama birimidir; örnek ailesi işlemci ile belleğin hangi oranda geldiğini, boyut ise o oranın kaç katının alındığını söyler. Devredilen karar buraya kadar gelir: fiziksel makinenin hangisi olduğu, işlemcinin hangi nesil olduğu, komşunun ne yaptığı sağlayıcıda kalır. Elde kalan karar aile ve boyuttur — ve bu iki kalem, iş yükünün şekline uymadığında bedeli her saat ödenen bir seçimdir.
BH1. Filo, bölgesel ölçüm ağının — su sayaçlarından okuma toplayan kurgu yazılımın — dört iş yükünden oluşur; tepe talepleri kurgudur. BH2. Üç örnek ailesi vardır ve vCPU başına 2, 4, 8 GB bellek verir; fiyatlar kurgu birimdir, gerçek bir para birimi değildir. BH3. Boyut basamakları 2’nin katlarıdır ve aile içinde oran sabittir. BH4. Her örnekte işletim sistemi ile ölçüm aracısı 0,6 vCPU sabit yük tutar. BH5. Toplayıcı katmanının etkin talebi 84 vCPU’dur ve tarama boyunca sabit kabul edilir. BH6. Karar defterindeki dakikalar kurgudur; değişim aynı anda iki örnekle yürür.
İş Yükünün Şekli ile Ailenin Şekli
Bir iş yükünün iki boyutu vardır: ne kadar işlemci, ne kadar bellek. Örnek ailesi bu ikisini ayrı ayrı satmaz; sabit bir oranda paketleyip satar. Eşleşme oranı tutmadığında ihtiyaç duyulmayan boyut da alınır ve atıl kaynak olarak durur. Aşağıdaki model dört profili üç aileye eşler.
// olcum-agi/eslesme.mjs — is yuku profillerini ornek ailelerine esler (model; urun degil tur) // Aile: vCPU basina bellek (GB) ve vCPU-saat basina kurgu birim. export const AILE = { "hesaplama agirlikli": { gb: 2, birim: 1.0 }, "dengeli": { gb: 4, birim: 1.3 }, "bellek agirlikli": { gb: 8, birim: 1.9 }, }; export const BOYUT = [2, 4, 8, 16, 32, 64]; // aile ici vCPU basamaklari // Is yuku: [ad, tepe vCPU, tepe GB, gunde acik saat, ornek sayisi]. export const IS = [ ["okuma toplayici", 12, 10, 24, 7], ["sayac dizini", 5, 46, 24, 3], ["api ucu", 7, 26, 24, 5], ["gece raporu", 26, 38, 2, 2], ]; export const yerlestir = ([ad, cpu, gb, saat, adet], aileAd) => { const a = AILE[aileAd]; const i = BOYUT.findIndex((b) => b >= cpu && b * a.gb >= gb); const boyut = BOYUT[i], bellek = boyut * a.gb, alt = BOYUT[i - 1] ?? 0; return { ad, aileAd, boyut, bellek, adet, saat, atilCpu: boyut - cpu, atilGb: bellek - gb, darbogaz: alt < cpu ? (alt * a.gb < gb ? "ikisi" : "islemci") : "bellek", gunluk: boyut * a.birim * saat * adet }; }; if (import.meta.url === `file://${process.argv[1]}`) { console.log("is yuku / aile".padEnd(24) + "ornek".padEnd(15) + "atil vCPU".padEnd(12) + "atil GB".padEnd(12) + "darbogaz".padEnd(10) + "gunluk birim"); const enUcuz = {}; for (const is of IS) { console.log(`${is[0]} (${is[1]} vCPU, ${is[2]} GB, ${is[4]} ornek, gunde ${is[3]} sa)`); let ucuz = null; for (const ad of Object.keys(AILE)) { const y = yerlestir(is, ad); if (!ucuz || y.gunluk < ucuz.gunluk) ucuz = y; console.log(" " + ad.padEnd(22) + `${y.boyut}/${y.bellek} GB`.padEnd(15) + `${y.atilCpu} (%${Math.round(100 * y.atilCpu / y.boyut)})`.padEnd(12) + `${y.atilGb} (%${Math.round(100 * y.atilGb / y.bellek)})`.padEnd(12) + y.darbogaz.padEnd(10) + y.gunluk.toFixed(1)); } enUcuz[is[0]] = ucuz; } console.log("\nfilo gunluk bedeli — tek aileye standartlasmak ile is yuku basina secmek:"); console.log("politika".padEnd(28) + "gunluk birim".padEnd(15) + "fark".padEnd(10) + "atil vCPU".padEnd(12) + "atil GB"); const karma = Object.values(enUcuz); const topla = (l) => [l.reduce((t, y) => t + y.gunluk, 0), l.reduce((t, y) => t + y.atilCpu * y.adet, 0), l.reduce((t, y) => t + y.atilGb * y.adet, 0)]; const [kb] = topla(karma); for (const ad of Object.keys(AILE)) { const [b, c, g] = topla(IS.map((is) => yerlestir(is, ad))); console.log(`yalniz ${ad}`.padEnd(28) + b.toFixed(1).padEnd(15) + `+%${Math.round(100 * (b - kb) / kb)}`.padEnd(10) + String(c).padEnd(12) + String(g)); } const [b, c, g] = topla(karma); console.log("is yuku basina secim".padEnd(28) + b.toFixed(1).padEnd(15) + "—".padEnd(10) + String(c).padEnd(12) + String(g)); }
is yuku / aile ornek atil vCPU atil GB darbogaz gunluk birim okuma toplayici (12 vCPU, 10 GB, 7 ornek, gunde 24 sa) hesaplama agirlikli 16/32 GB 4 (%25) 22 (%69) islemci 2688.0 dengeli 16/64 GB 4 (%25) 54 (%84) islemci 3494.4 bellek agirlikli 16/128 GB 4 (%25) 118 (%92) islemci 5107.2 sayac dizini (5 vCPU, 46 GB, 3 ornek, gunde 24 sa) hesaplama agirlikli 32/64 GB 27 (%84) 18 (%28) bellek 2304.0 dengeli 16/64 GB 11 (%69) 18 (%28) bellek 1497.6 bellek agirlikli 8/64 GB 3 (%38) 18 (%28) ikisi 1094.4 api ucu (7 vCPU, 26 GB, 5 ornek, gunde 24 sa) hesaplama agirlikli 16/32 GB 9 (%56) 6 (%19) bellek 1920.0 dengeli 8/32 GB 1 (%13) 6 (%19) ikisi 1248.0 bellek agirlikli 8/64 GB 1 (%13) 38 (%59) islemci 1824.0 gece raporu (26 vCPU, 38 GB, 2 ornek, gunde 2 sa) hesaplama agirlikli 32/64 GB 6 (%19) 26 (%41) ikisi 128.0 dengeli 32/128 GB 6 (%19) 90 (%70) islemci 166.4 bellek agirlikli 32/256 GB 6 (%19) 218 (%85) islemci 243.2 filo gunluk bedeli — tek aileye standartlasmak ile is yuku basina secmek: politika gunluk birim fark atil vCPU atil GB yalniz hesaplama agirlikli 7040.0 +%36 166 290 yalniz dengeli 6406.4 +%24 78 642 yalniz bellek agirlikli 8268.8 +%60 54 1506 is yuku basina secim 5158.4 — 54 290
Darboğaz sütunu ailenin yanlış seçildiğini söyleyen tek sütundur. sayac dizini bellek ağırlıklı
bir iştir: hesaplama ağırlıklı ailede 46 GB’ı almak için 32 vCPU alınır ve 27 vCPU, yani işlemcinin
yüzde 84’ü boşta durur. Aynı iş bellek ağırlıklı ailede 8 vCPU’luk bir örneğe sığar; atıl işlemci
27’den 3’e, günlük bedel 2304’ten 1094’e iner. Ters yönde de aynısı geçerlidir: okuma toplayici
işlemci ağırlıklıdır ve bellek ağırlıklı aileye konursa 118 GB bellek — belleğin yüzde 92’si — boşta
kalır.
Atıl kaynak bir bedeldir ama tek bedel değildir. api ucu satırında darboğaz sütunu “ikisi” yazar:
bir alt boyut hem işlemcide hem bellekte yetmiyor. Bu, o eşleşmenin ailesinin doğru olduğunun
işaretidir; iki boyut da aynı anda sınırdaysa alınan paketin şekli işin şekline uyuyor demektir.
Tek boyutun “ikisi” yazması yerine “islemci” ya da “bellek” yazması, o örneğin bir boyutunun
gereğinden büyük alındığını gösterir.
Alt tablo kararı bir politikaya çevirir. Filoyu tek aileye standartlaştırmak yönetimi sadeleştirir; bedeli üç sayıda görünür. En yakın tek aile bile günde yüzde 24 fazla tutar ve atıl belleği 290 GB’dan 642 GB’a çıkarır. En kötü tek aile yüzde 60 fazla tutar. Dört iş yükü için karar dört kez ayrı verildiğinde günlük 5158,4 kurgu birim, tek aileye indirildiğinde 6406,4 birim ödenir; aradaki 1248 birim, standartlaşmanın günlük fiyatıdır.
Aynı Talebi Kaç Parçaya Bölmek
Aile seçildikten sonra ikinci karar gelir: aynı toplam kapasite az sayıda büyük örnekten mi, çok sayıda küçükten mi alınacak. Bu karar boyut satırında görünmez, çünkü her iki uçta da toplam vCPU yaklaşık aynıdır. Fark iki başka yerde doğar: her örneğin kendi sabit yükünde ve bir örnek düştüğünde kaybedilen orandaki.
// olcum-agi/boyutlandirma.mjs — ayni talebi farkli ornek boyutlarina bolme taramasi (model) import { AILE, BOYUT } from "./eslesme.mjs"; const TALEP = 84; // toplayici katmaninin etkin vCPU talebi (kurgu) const SABIT = 0.6; // her ornekte isletim sistemi + olcum aracisi (vCPU) const SAAT = 24, AD = "dengeli"; export const tara = (boyut) => { const etkin = boyut - SABIT, adet = Math.ceil(TALEP / etkin); const saglanan = adet * boyut, sabit = adet * SABIT; const gunluk = saglanan * AILE[AD].birim * SAAT; return { boyut, adet, saglanan, sabit, yuvarlama: saglanan - TALEP - sabit, atil: saglanan - TALEP, eksik: Math.max(0, TALEP - (adet - 1) * etkin), gunluk, yedek: boyut * AILE[AD].birim * SAAT }; }; if (import.meta.url === `file://${process.argv[1]}`) { console.log(`talep ${TALEP} etkin vCPU, ornek basina ${SABIT} vCPU sabit yuk, ${AD} ailesi\n`); console.log("boyut".padEnd(9) + "ornek".padEnd(8) + "saglanan".padEnd(11) + "sabit yuk".padEnd(11) + "yuvarlama".padEnd(11) + "atil".padEnd(9) + "bir ariza".padEnd(11) + "N+1 bedeli"); for (const b of BOYUT) { const t = tara(b); console.log(`${b} vCPU`.padEnd(9) + String(t.adet).padEnd(8) + `${t.saglanan}`.padEnd(11) + t.sabit.toFixed(1).padEnd(11) + t.yuvarlama.toFixed(1).padEnd(11) + `%${Math.round(100 * t.atil / t.saglanan)}`.padEnd(9) + `%${(100 * t.eksik / TALEP).toFixed(1)}`.padEnd(11) + `+%${(100 * t.yedek / t.gunluk).toFixed(1)}`); } const en = BOYUT.map(tara).reduce((a, b) => (b.atil < a.atil ? b : a)); console.log(`\nen dusuk atil: ${en.boyut} vCPU (${en.atil.toFixed(1)} vCPU bosta, ` + `${en.adet} ornek); orada bir ariza talebin %${(100 * en.eksik / TALEP).toFixed(1)}'ini acikta birakiyor`); }
talep 84 etkin vCPU, ornek basina 0.6 vCPU sabit yuk, dengeli ailesi boyut ornek saglanan sabit yuk yuvarlama atil bir ariza N+1 bedeli 2 vCPU 61 122 36.6 1.4 %31 %0.0 +%1.6 4 vCPU 25 100 15.0 1.0 %16 %2.9 +%4.0 8 vCPU 12 96 7.2 4.8 %13 %3.1 +%8.3 16 vCPU 6 96 3.6 8.4 %13 %8.3 +%16.7 32 vCPU 3 96 1.8 10.2 %13 %25.2 +%33.3 64 vCPU 2 128 1.2 42.8 %34 %24.5 +%50.0 en dusuk atil: 8 vCPU (12.0 vCPU bosta, 12 ornek); orada bir ariza talebin %3.1'ini acikta birakiyor
İki israf kalemi ters yönde hareket eder. Sabit yük — her örneğin işletim sistemi ve ölçüm aracısı — 2 vCPU’luk örnekte 36,6 vCPU tutar, 64 vCPU’luk örnekte 1,2 vCPU’ya iner; küçük örnekte kiralanan kapasitenin neredeyse üçte biri işi yapmadan harcanır. Yuvarlama israfı tersine gider: talep örnek boyutuna tam bölünmediği için büyük örnekte 42,8 vCPU fazladan alınır. Toplam atıl bu yüzden düz bir eğri değildir; 8 ile 32 vCPU arasında en düşük noktasına iner ve iki uçta yükselir.
Arıza sütunu ise tek yönlüdür ve karara asıl yönü o verir. 61 örneklik dizilimde bir örnek düşünce talebin yüzde 0’ı açıkta kalır; 32 vCPU’luk üç örnekli dizilimde aynı arıza talebin yüzde 25’ini açıkta bırakır. Son sütun bunun düzeltme fiyatıdır: bir yedek örnek eklemek 61 örneklik dizilimde günlük bedeli yüzde 1,6 artırır, üç örneklik dizilimde yüzde 33,3 artırır. Atıl kaynağı en aza indiren nokta ile arıza etkisini en aza indiren nokta aynı yerde değildir; boyutlandırma bu iki sayının arasında bir yer seçmektir, tek bir doğru boyut aramak değil.
Örnekte Hangi Karar Kimde
İki karar da verildikten sonra üçüncü soru gelir: bu kararlar yanlış çıkarsa geri alınır mı. Örnek üzerindeki kalemlerin bir bölümü çalışırken değişir, bir bölümü örneği durdurmayı ister, bir bölümü ise başlatma anında verilir ve bir daha değişmez.
// olcum-agi/karar-defteri.mjs — bir ornekte hangi karar kimde, hangisi geri alinamaz (model) import { IS } from "./eslesme.mjs"; const FILO = IS.reduce((t, is) => t + is[4], 0); // 17 ornek const PENCERE = 2, TUR = Math.ceil(FILO / PENCERE); // ayni anda disari alinan ornek // Elde kalan kalem: [ad, geri alinabilirlik, degisim yolu, ornek basina dakika] const ELDE = [ ["ornek ailesi", "evet", "durdur-degistir-baslat", 4], ["ornek boyutu", "evet", "durdur-degistir-baslat", 4], ["kok disk boyutu", "tek yonlu", "buyutulur, kucultulmez", 2], ["islemci mimarisi", "hayir", "imaj yeniden uretimi + yeniden yaratma", 35], ["yerlestigi alt ag", "hayir", "yeniden yaratma", 35], ["kok diskin sifrelenmesi", "hayir", "yeniden yaratma", 35], ]; const SAGLAYICIDA = ["fiziksel makine", "islemci nesli", "asiri abonelik orani", "komsu is yuku", "bakim penceresi ani"]; if (import.meta.url === `file://${process.argv[1]}`) { console.log(`${FILO} ornekli filo; degisim ayni anda ${PENCERE} ornekle, ${TUR} turda yuruyor\n`); console.log("elde kalan kalem".padEnd(26) + "geri alinabilir".padEnd(17) + "degisim yolu".padEnd(40) + "filo duvar saati"); for (const [ad, geri, yol, dk] of ELDE) console.log(ad.padEnd(26) + geri.padEnd(17) + yol.padEnd(40) + `${((TUR * dk) / 60).toFixed(1)} sa`); const geriYok = ELDE.filter((x) => x[1] === "hayir"); console.log(`\nsaglayicida kalan ${SAGLAYICIDA.length} kalem: ${SAGLAYICIDA.join(", ")}`); console.log(`geri alinamayan kalem: ${geriYok.length}; ucu birlikte degisirse filo ` + `${(TUR * Math.max(...geriYok.map((x) => x[3])) / 60).toFixed(1)} saatte yenilenir, ` + `yanlis aile secimi ${(TUR * 4 / 60).toFixed(1)} saatte duzelir`); }
17 ornekli filo; degisim ayni anda 2 ornekle, 9 turda yuruyor elde kalan kalem geri alinabilir degisim yolu filo duvar saati ornek ailesi evet durdur-degistir-baslat 0.6 sa ornek boyutu evet durdur-degistir-baslat 0.6 sa kok disk boyutu tek yonlu buyutulur, kucultulmez 0.3 sa islemci mimarisi hayir imaj yeniden uretimi + yeniden yaratma 5.3 sa yerlestigi alt ag hayir yeniden yaratma 5.3 sa kok diskin sifrelenmesi hayir yeniden yaratma 5.3 sa saglayicida kalan 5 kalem: fiziksel makine, islemci nesli, asiri abonelik orani, komsu is yuku, bakim penceresi ani geri alinamayan kalem: 3; ucu birlikte degisirse filo 5.3 saatte yenilenir, yanlis aile secimi 0.6 saatte duzelir
On bir kalemin altısı elde, beşi sağlayıcıdadır. Sağlayıcıda kalanlar üzerinde tek yapılabilecek şey ölçmektir: aynı boyuttaki iki örneğin farklı hızda koşması komşu iş yükünün ya da işlemci neslinin farkıdır, bir karar değil bir gözlemdir.
Elde kalan altı kalem geri alınabilirliğe göre üçe ayrılır. Aile ve boyut geri alınabilir kalemlerdir: yanlış aile seçimi 17 örneklik filoda 0,6 saatte düzelir, atıl kaynak sayıldıkça her ay yeniden bakılabilir. Kök disk boyutu tek yönlüdür — büyütülür, küçültülmez; gereğinden büyük alınan disk örneğin ömrü boyunca ödenir. Geri alınamayan üç kalem — işlemci mimarisi, örneğin yerleştiği alt ağ ve kök diskin şifrelenip şifrelenmediği — başlatma anında verilir ve değiştirilmek istendiğinde örnek değişmez, yeniden yaratılır: filo 5,3 saatte, yani aile değişiminin dokuz katı sürede yenilenir. Bu üçü ilk gün seçilir ve filo büyüdükçe düzeltilmesi pahalılaşır; 17 örnekte 5,3 saat olan iş, 170 örnekte iki günden uzun sürer.
Özet
- Aile eşleşmesi tutmadığında bedel her saat ödenir:
sayac dizinihesaplama ağırlıklı ailede 27 vCPU’yu (işlemcinin yüzde 84’ünü) boşta tutar, doğru ailede aynı iş 3 vCPU atılla koşar ve günlük bedel 2304’ten 1094 kurgu birime iner. - Tek aileye standartlaşmak en iyi durumda günde yüzde 24, en kötü durumda yüzde 60 fazla tutar; dört iş yükü için ayrı seçim 5158,4 birim, en yakın tek aile 6406,4 birimdir.
- Boyutlandırmada iki israf ters yönde gider: sabit yük 2 vCPU’luk örnekte 36,6 vCPU, 64 vCPU’luk örnekte 1,2 vCPU; yuvarlama israfı 1,4’ten 42,8 vCPU’ya çıkar ve toplam atıl 8–32 vCPU aralığında en düşüktür.
- Arıza etkisi tek yönlüdür: bir örneğin düşmesi 61 örneklik dizilimde talebin yüzde 0’ını, üç örneklik dizilimde yüzde 25’ini açıkta bırakır; yedek örneğin bedeli yüzde 1,6’dan yüzde 33,3’e çıkar.
- On bir kalemin altısı elde, beşi sağlayıcıdadır; geri alınamayan üç kalem işlemci mimarisi, yerleştiği alt ağ ve kök diskin şifrelenmesidir — üçünün değişimi filoyu 5,3 saatte yeniler, aile değişimi 0,6 saatte.
Sonraki Adım
Bu dersin bütün sayıları örnek açıldıktan sonrasını ölçtü: kaç vCPU boşta durduğunu, bir arızanın ne kadarını götürdüğünü, bir kalemin değişmesinin kaç saat tuttuğunu. Açılışın kendisi tek bir satırda geçti — “yeniden yaratma 35 dakika” — ve o 35 dakikanın içinde ne olduğu sorulmadı.
Örnek boş bir diskle açılmaz; bir makine imajından açılır ve o imajın içinde ne kadar hazır iş varsa açılış o kadar kısa sürer. Sonraki ders imaja gömülen kalem ile açılışta yapılan kalem arasındaki dengeyi tarar ve sorar: bir kalem imaja gömüldükçe açılış kaç saniye kısalıyor, imajın tazeliği kaç gün düşüyor ve açılışta kalan iş kaç dış bağımlılığa kaç çağrı yapıyor?
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.