---
title: 'Kapasite Planlama'
source: 'https://academia.sh/tr/kurslar/basarim-ve-izleme/kapasite-planlama'
course: 'Başarım Karşıt Kalıpları ve İzleme'
language: tr
updated: '2026-08-17T18:10:59+00:00'
license: 'CC BY-SA 4.0'
---

# 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.

Ö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.

```js
// 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.
