Ders 15 / 16
Kapasite Planlama
Ölçülen doluluğun kaynak tahminine çevrilmesi: kapasite payının bir doluluk tavanı olarak tanımlanması, düğüm sayısının yük kısıtı ile arıza kısıtının büyüğü olarak hesaplanması, yedeklilik priminin ölçekle küçülmesinin sayılması, birikmenin etkin kapasiteyi düşürmesinin düğüm sayısına etkisi ve başarımı iyileştirmenin düğüm sayısını neden düşürmediğinin gösterilmesi.
İçindekiler
Önceki ders üç testle bir sürecin bugünkü yükte ne yaptığını ölçtü ve tek bir soruyu hiç sormadı: kaç tane gerekiyor. Yük testinin verdiği sayı bir sınır değil, bir doğrulamadır — 514 istek/s karşılanıyor. Sınırın kendisi bu derste yeniden ölçülmez; Sistem Tasarımına Giriş kursu bir sürecin doyum verimini ölçtü ve doluluk arttıkça gecikmenin doğrusal büyümediğini gösteren kuyruk modelini kurdu. İkisi burada girdidir.
Bu ders ölçümü tahmine çevirir. Girdi bir hız ve bir üst sınır, çıktı bir sayıdır: kaç düğüm. Aradaki tek karar bir orandır.
Kapasite Payı ve İki Kısıt
Kapasite payı (headroom), bir kaynağın bilerek kullanılmadan bırakılan bölümüdür ve bir doluluk tavanı olarak yazılır: yüzde 30 pay, doluluğun yüzde 70’i geçmemesi demektir. Payın gerekçesi K01’in kuyruk modelindedir — doluluk yükseldikçe gecikme doğrusaldan hızlı büyür, bu yüzden pay bir israf değil bir gecikme kararıdır.
Düğüm sayısını iki ayrı kısıt belirler ve büyüğü kazanır. Yük kısıtı: tepe hızın doluluk tavanının altında karşılanması için gereken düğüm sayısı. Arıza kısıtı: bir düğüm düştüğünde kalanların aynı tavanın altında kalması için gereken sayı — bu, kalan düğümlerin yük kısıtını karşılaması demektir, yani her zaman bir düğüm fazlası.
Aşağıdaki hesabın girdileri şunlardır: tepe hız 513,89 istek/s (K01, hesap); düğüm başına doyum verimi 1.176,47 istek/s — önceki dersin sunucusu istek başına 0,85 ms işlemci payı harcadığına göre tek iş parçacığında bu aritmetikle çıkar, ölçüm değildir; K01’in çıplak uçta ölçtüğü 4.268 istek/s duyarlılık satırında kullanılır. Aylık talep büyümesi (IZ8) ve birikmenin etkin kapasiteye etkisi (IZ9) varsayımdır.
// kapasite/dugum.mjs — olculen doyum veriminden dugum sayisina. Kapasite payi bir doluluk // tavanidir; dugum sayisi yuk kisiti ile ariza kisitinin buyugudur. Hepsi aritmetiktir. const TEPE = 513.89; // K01 (hesap): tepe ucta istek/s const TOPLU = 833.33; // K01 (hesap): gun sonu isinin tarama hizi (kayit/s) const KAYIT_MS = 1.20; // K01 (hesap): toplu iste kayit basina sure, tek isci const MU = 1 / 0.00085; // hesap: onceki dersin sunucusu istek basina 0,85 ms islemci harciyor const MU_CIPLAK = 4268; // K01 (olcum): ciplak takip ucunun doyum verimi, o makinede const BOZULMA = 0.7; // IZ9 (varsayim): birikme yuzunden dugumun etkin kapasitesi %30 duser const BUYUME = 0.06; // IZ8 (varsayim): aylik talep buyumesi const b = (x, n = 2) => x.toFixed(n); const yukKisiti = (tepe, mu, tavan) => Math.ceil(tepe / (mu * tavan)); const arizaKisiti = (tepe, mu, tavan) => yukKisiti(tepe, mu, tavan) + 1; const gecikmeMs = (mu, lambda) => 1000 / (mu - lambda); // K01'in kuyruk MODELI, girdi olarak console.log(`dugum basina doyum verimi ${b(MU)} istek/s (hesap)`); console.log(`${"tepe istek/s".padStart(13)}${"doluluk tavani".padStart(16)}${"yuk kisiti".padStart(12)}` + `${"ariza kisiti".padStart(14)}${"secilen n".padStart(11)}${"doluluk".padStart(9)}` + `${"kayipta doluluk".padStart(17)}${"kayipta gecikme".padStart(17)}`); for (const tepe of [TEPE, TEPE * 3]) for (const tavan of [0.5, 0.6, 0.7, 0.8, 0.9]) { const n = Math.max(yukKisiti(tepe, MU, tavan), arizaKisiti(tepe, MU, tavan)); const kayipta = tepe / (n - 1); console.log(`${b(tepe).padStart(13)}${("%" + b(tavan * 100, 0)).padStart(16)}` + `${String(yukKisiti(tepe, MU, tavan)).padStart(12)}${String(arizaKisiti(tepe, MU, tavan)).padStart(14)}` + `${String(n).padStart(11)}${("%" + b((tepe / (n * MU)) * 100, 1)).padStart(9)}` + `${("%" + b((kayipta / MU) * 100, 1)).padStart(17)}${(b(gecikmeMs(MU, kayipta)) + " ms").padStart(17)}`); } console.log(`\nyedeklilik primi olcekle kuculur (doluluk tavani %70):`); console.log(`${"olcek".padStart(6)}${"tepe istek/s".padStart(14)}${"yuk kisiti".padStart(12)}` + `${"secilen n".padStart(11)}${"yedeklilik primi".padStart(18)}${"aylik dugum-saat".padStart(18)}`); for (const k of [1, 2, 3, 4, 6, 10]) { const tepe = TEPE * k; const y = yukKisiti(tepe, MU, 0.7); const n = Math.max(y, arizaKisiti(tepe, MU, 0.7)); console.log(`${(k + "x").padStart(6)}${b(tepe).padStart(14)}${String(y).padStart(12)}` + `${String(n).padStart(11)}${("%" + b((100 * (n - y)) / y, 1)).padStart(18)}` + `${(n * 720).toLocaleString("tr-TR").padStart(18)}`); } console.log(`\ntalep buyumesi (aylik %${b(BUYUME * 100, 0)}, doluluk tavani %70):`); console.log(`${"ay".padStart(4)}${"tepe istek/s".padStart(14)}${"secilen n".padStart(11)}` + `${"doluluk".padStart(9)}${"bozulmus dugumle n".padStart(20)}`); for (const ay of [0, 6, 12, 18, 24]) { const tepe = TEPE * (1 + BUYUME) ** ay; const n = Math.max(yukKisiti(tepe, MU, 0.7), arizaKisiti(tepe, MU, 0.7)); const nb = Math.max(yukKisiti(tepe, MU * BOZULMA, 0.7), arizaKisiti(tepe, MU * BOZULMA, 0.7)); console.log(`${String(ay).padStart(4)}${b(tepe).padStart(14)}${String(n).padStart(11)}` + `${("%" + b((tepe / (n * MU)) * 100, 1)).padStart(9)}${String(nb).padStart(20)}`); } console.log(`\nduyarlilik: dugum basina doyum verimi ${MU_CIPLAK} istek/s olsaydi (K01'in ciplak ucu)`); console.log(` bugunun tepesinde n = ${Math.max(yukKisiti(TEPE, MU_CIPLAK, 0.7), arizaKisiti(TEPE, MU_CIPLAK, 0.7))}` + `, ${b(MU)} istek/s ile n = ${Math.max(yukKisiti(TEPE, MU, 0.7), arizaKisiti(TEPE, MU, 0.7))}` + ` (${b(MU_CIPLAK / MU)} kat basarim, ayni dugum sayisi)`); const isci = Math.max(yukKisiti(TOPLU, 1000 / KAYIT_MS, 0.7), 1); console.log(`toplu is ayri bir kapasite sorusu: ${TOPLU} kayit/s gerekiyor, bir isci ` + `${b(1000 / KAYIT_MS)} kayit/s -> %70 tavanla ${isci} isci, pencere ` + `${b((TOPLU * 4) / (isci * (1000 / KAYIT_MS)), 2)} saate iner`);
dugum basina doyum verimi 1176.47 istek/s (hesap)
tepe istek/s doluluk tavani yuk kisiti ariza kisiti secilen n doluluk kayipta doluluk kayipta gecikme
513.89 %50 1 2 2 %21.8 %43.7 1.51 ms
513.89 %60 1 2 2 %21.8 %43.7 1.51 ms
513.89 %70 1 2 2 %21.8 %43.7 1.51 ms
513.89 %80 1 2 2 %21.8 %43.7 1.51 ms
513.89 %90 1 2 2 %21.8 %43.7 1.51 ms
1541.67 %50 3 4 4 %32.8 %43.7 1.51 ms
1541.67 %60 3 4 4 %32.8 %43.7 1.51 ms
1541.67 %70 2 3 3 %43.7 %65.5 2.47 ms
1541.67 %80 2 3 3 %43.7 %65.5 2.47 ms
1541.67 %90 2 3 3 %43.7 %65.5 2.47 ms
yedeklilik primi olcekle kuculur (doluluk tavani %70):
olcek tepe istek/s yuk kisiti secilen n yedeklilik primi aylik dugum-saat
1x 513.89 1 2 %100.0 1.440
2x 1027.78 2 3 %50.0 2.160
3x 1541.67 2 3 %50.0 2.160
4x 2055.56 3 4 %33.3 2.880
6x 3083.34 4 5 %25.0 3.600
10x 5138.90 7 8 %14.3 5.760
talep buyumesi (aylik %6, doluluk tavani %70):
ay tepe istek/s secilen n doluluk bozulmus dugumle n
0 513.89 2 %21.8 2
6 728.96 2 %31.0 3
12 1034.05 3 %29.3 3
18 1466.82 3 %41.6 4
24 2080.71 4 %44.2 5
duyarlilik: dugum basina doyum verimi 4268 istek/s olsaydi (K01'in ciplak ucu)
bugunun tepesinde n = 2, 1176.47 istek/s ile n = 2 (3.63 kat basarim, ayni dugum sayisi)
toplu is ayri bir kapasite sorusu: 833.33 kayit/s gerekiyor, bir isci 833.33 kayit/s -> %70 tavanla 2 isci, pencere 2.00 saate iner
Bugünün Yükünde Payın Hiç Etkisi Yok
Birinci tablonun ilk beş satırı beklenmedik bir sonuç veriyor. Doluluk tavanı yüzde 50’den yüzde 90’a çıkarılsa da düğüm sayısı 2’de kalıyor, doluluk yüzde 21,8’de, bir düğüm kaybındaki doluluk yüzde 43,7’de. Bugünkü tepe hızda kapasite payı seçimi hiçbir şeyi değiştirmiyor, çünkü yük kısıtı bütün tavanlarda 1 düğüm veriyor ve belirleyen kısıt arıza kısıtı oluyor.
Bu, kapasite planlamanın en sık atlanan yanıdır. “Kaç düğüm gerekiyor” sorusunun iki bağımsız yanıtı vardır; biri yükten, öteki arıza davranışından gelir. Tek düğümle bugünkü yük fazlasıyla karşılanır, ama tek düğüm düştüğünde kapasite sıfırdır ve K01’in kesinti bütçesi o düğümün erişilebilirliğinin üstüne çıkamaz. Düğüm sayısını iki yapan şey yük değil, bu kısıttır.
Sonraki beş satır payın ne zaman bağlayıcı olduğunu gösteriyor. Tepe hız üç katına çıktığında — K01’in tepe çarpanı da üçtü — tavan yüzde 70 ve üstünde 3 düğüm, yüzde 50 ile 60’ta 4 düğüm gerekiyor. Dördüncü düğümün karşılığı son iki sütunda: bir düğüm kaybında doluluk yüzde 65,5 yerine yüzde 43,7 oluyor ve kuyruk modelinin verdiği gecikme 2,47 ms yerine 1,51 ms. Kapasite payı bir düğüm sayısı kararı gibi görünür ve bir arıza günü gecikmesi kararıdır.
Yedeklilik Primi, Büyüme ve Birikme
İkinci tablo arıza kısıtının faturasını ölçekle birlikte veriyor. Bugünkü ölçekte fazladan düğüm, filoyu iki katına çıkarıyor: yedeklilik primi yüzde 100. On kat ölçekte aynı kural yalnız yüzde 14,3 ekliyor. Yedeklilik küçük sistemlerde orantısız pahalıdır ve bu, ölçeğin savunulabilir tek avantajlarından biridir. Sağ sütun kaynağı ay cinsinden yazıyor: bugün 1.440 düğüm-saat, on katta 5.760 düğüm-saat. Kaynak birimi bu kursta para birimi yerine kullanılır.
Üçüncü tablo kapasitenin bir sayı değil bir zaman serisi olduğunu gösteriyor. Aylık yüzde 6 büyümeyle düğüm sayısı on ikinci ayda 3’e, yirmi dördüncü ayda 4’e çıkıyor; doluluk her eklemede düşüp yeniden tırmanıyor. Son sütun önceki dersin dayanıklılık testinin bulgusunu hesaba katıyor: düğümün etkin kapasitesi birikme yüzünden yüzde 30 düşerse (IZ9), altıncı ayda değil hemen üçüncü düğüm gerekir ve yirmi dördüncü ayda beş düğüme çıkılır. Bir dayanıklılık testinin bulunmayan bulgusu kapasite planına fazladan bir düğüm olarak yazılır.
Başarım Düğüm Sayısını Düşürmüyor
Duyarlılık satırı dersin en sert sonucudur. Düğüm başına doyum verimi 1.176,47 yerine K01’in çıplak uçta ölçtüğü 4.268 istek/s olsaydı, yani 3,63 kat daha hızlı bir uç, gereken düğüm sayısı yine 2 olurdu. Bugünkü ölçekte başarım iyileştirmesinin kaynak karşılığı sıfırdır, çünkü belirleyen kısıt başarım değil arızadır. Bir başarım çalışmasının kapasiteye çevrilmesi ancak yük kısıtı bağlayıcı olduğunda anlamlıdır; bu tabloda o durum ancak dördüncü satırdan sonra doğuyor.
Son satır kapasitenin akış başına sorulduğunu hatırlatıyor. Gün sonu ücretlendirmesi saniyede 833,33 kayıt istiyor ve tek işçinin hızı da tam 833,33 kayıt/s — yani pay sıfır. Yüzde 70 tavanıyla iki işçi gerekir ve karşılığında dört saatlik pencere iki saate iner. Takip sorgusunun düğüm sayısı bu hesabı hiç etkilemez: iki akış aynı sistemin parçasıdır ve ayrı kapasite soruları sorar.
Özet
- Kapasite payı bir doluluk tavanıdır; gerekçesi K01’in kuyruk modelidir ve bir israf değil bir gecikme kararıdır.
- Düğüm sayısı yük kısıtı ile arıza kısıtının büyüğüdür; arıza kısıtı her zaman bir düğüm fazlası ister, çünkü kalan düğümler de aynı tavanı karşılamalıdır.
- Bugünkü 513,89 istek/s tepede pay seçiminin hiç etkisi yok: her tavanda 2 düğüm, doluluk yüzde 21,8. Tepe üç katına çıktığında yüzde 50 tavan 4, yüzde 70 tavan 3 düğüm veriyor ve fark bir arıza günü gecikmesidir (1,51 ms yerine 2,47 ms).
- Yedeklilik primi ölçekle küçülür: bugünkü ölçekte fazladan düğüm filoyu yüzde 100 büyütür, on kat ölçekte yüzde 14,3; kaynak ayda 1.440 düğüm-saatten 5.760 düğüm-saate çıkar.
- Kapasite bir zaman serisidir: aylık yüzde 6 büyümeyle düğüm sayısı 12. ayda 3, 24. ayda 4 olur; birikme etkin kapasiteyi yüzde 30 düşürürse aynı takvim 3 ve 5 olur.
- Başarımı 3,63 kat iyileştirmek bugünkü ölçekte düğüm sayısını değiştirmiyor; başarımın kapasiteye çevrilmesi ancak yük kısıtı bağlayıcı olduğunda anlamlıdır. Toplu iş ayrı bir sorudur: yüzde 70 tavanla iki işçi, pencere dört saatten iki saate iner.
Sonraki Adım
Bu ders bir sayı üretti: kaç düğüm. Sayının yanına yazılan kaynak birimi de var — bugün ayda 1.440 düğüm-saat, on kat ölçekte 5.760. Ama o düğümlerin neye mal olduğu hiç sorulmadı. Düğüm-saat tek kalem değildir; bir istek ağ üzerinden veri taşır, bir kayıt saklanır, bir ölçüt üretilir ve saklanır, bir önbellek bellekte durur. Daha önemlisi, buraya kadarki bütün kurslar boyunca verilen tasarım kararlarının her biri bu kalemlerden birini oynattı ve hiçbirinin işletme yükü sayılmadı: önbellek isabet oranını yükseltmek neyi azaltır, veriyi parçalamak neyi çoğaltır, bir kopya eklemek hangi kalemi kaç katına çıkarır, izlemenin kendi bedeli hangi kalemde görünür. Sonraki ders bu soruyu ele alır ve kaynak birimiyle yanıtlar.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.