İçeriğe geç
academia.sh

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.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat