---
title: 'Maliyet ve Küme Boyutlandırma'
source: 'https://academia.sh/tr/kurslar/dagitik-veri-isleme/maliyet-ve-kume-boyutlandirma'
course: 'Dağıtık Veri İşleme'
language: tr
updated: '2026-08-17T18:08:51+00:00'
license: 'CC BY-SA 4.0'
---

# Maliyet ve Küme Boyutlandırma

Bir kümenin kaç işçiyle kurulacağı kararının süre ile toplam iş arasında verildiğinin ve iki sayının ters yönlere gittiğinin sayılması: aynı 2200 satırlık iş bir, iki, dört, sekiz ve on altı işçide süre 2250, 3691, 3179, 2610 ve 1398, toplam iş 2200, 5830, 7414, 8074 ve 8635 verir; süre inerken toplam iş çıkar ve hangisinin ödendiği yazılmadan boyutlandırma kararı verilemez. İkinci işçinin süreyi 2250'den 3691'e çıkarması karıştırmanın doğmasından gelir ve çarpıklığı 1,00 olan iyi bir anahtarda bile 2250'den 2800'e çıkış görülür. İşçi ile sürenin çarpımı 2250'den 22368'e tek yönlü tırmanır, sabit bedel işçi başına sayıldığında on altı işçinin kazancı 852'den 102'ye iner ve ağ bedeli 12'ye çıktığında en kısa süreyi veren kurulum tek işçiye döner. Ders kursun kapanışıdır ve on bir dersin sayılarını tek tabloda toplar.

Bir önceki ders bedelin beşinci adını yazdı: yeniden hesaplanan satır. Ondan önce taşınan satır,
kopya, çarpıklık ve tutulan satır gelmişti. Beş adın altında hep aynı iki sayı duruyordu — bir işin
**ne kadar sürdüğü** ve toplamda **ne kadar iş yaptığı**. Geriye kursun en sık sorulan sorusu
kalıyor: bu küme kaç işçiyle kurulmalı.

Soru masum görünür ve yanıtı yoktur, çünkü eksiktir. Bir kümeyi büyütmek iki sayıyı aynı anda
değiştirir ve bunlar **ters yönlere** gider. Bu ders işçi sayısını birden on altıya süpürür, her
adımda ikisini de yazar ve kararın hangi ölçüte, hangi seçime ve hangi bölüşüm anahtarına asılı
olduğunu sayar.

- **DB53.** Kaynak, hat ve dağıtık kurulum **kurgudur** ve ders içinde üretilir. Hiçbir dağıtık
  işleme çatısı, küme yöneticisi ya da bulut servisi çağrılmaz. Tohum 20260218.
- **DB54.** Maliyet muhasebesi yordamı Bulut Bilişim müfredatındaki Bulut Yönetişimi, Güvenlik ve
  Maliyet kursunda ve Yapay Zekâ Mühendisliği müfredatındaki Model API'leri ile Uygulama Geliştirme
  kursunda ölçüldü; **tekrarlanmaz**. Burada maliyet yalnız **süre ve toplam iş** olarak yazılır;
  hiçbir para birimi ya da fiyat kullanılmaz.
- **DB55. Süre en yüklü işçinin işidir** ve bu modelin kendi birimidir, ham milisaniye değildir.
  **Toplam iş** bütün işçilerin yaptığı işin toplamıdır.
- **DB56.** `AG_BEDELI = 3` ve `GOREV_SABIT = 50` birer seçimdir; bu dersin sonucu **ikisine de
  duyarlıdır** ve aşağıda ikisi de değerleriyle birlikte ele alınır.
- **DB57.** `maliyet` sabit bedeli **iş başına bir kez** sayar; Kaynak Yöneticileri dersi aynı bedeli
  **işçi başına** sayar. İki sayım burada yan yana iki sütun olarak yazılır.
- **DB58.** Taban çizgisi tek işçidir: karıştırma yok, çarpıklık 1,00, süre **2250**, toplam iş
  **2200**.

## İşçi Süpürmesi

İlk blok kaynağı, hattın tüketime kadarki üç aşamasını ve bölüşüm ile maliyet ölçülerini kurar.
Ölçülen iş kursun boyunca kullanılan iştir: satırlar `bolge` anahtarıyla bölüşülmüş, sonra `abone`
anahtarına karıştırılıyor.

```python
# KURGUDUR. Olcum aginin sayac okumalari , hattin ilk uc asamasi ve dagitik
# kurulum ders icinde uretilir; hicbir dagitik isleme catisi , kume yoneticisi
# ya da bulut servisi cagrilmaz. Tohum 20260218.
TOHUM, M32 = 20260218, 0xFFFFFFFF


def uretec(t):
    x = ((t ^ (t >> 16)) * 2246822507) & M32
    x = ((x ^ (x >> 13)) * 3266489909) & M32
    s = [(x ^ (x >> 16)) & M32]

    def sonraki():
        s[0] = (s[0] * 1664525 + 1013904223) & M32
        return s[0] / 4294967296
    return sonraki


BOLGE = ["dogu", "bati", "kuzey", "guney", "merkez"]
TIP = ["mesken", "isyeri"]
DONEM = [f"2026-{a:02d}" for a in range(1, 13)]
ABONE = {}
for i in range(200):
    r = uretec(TOHUM + 37 * i)
    ABONE[f"A{i + 1:03d}"] = {"bolge": BOLGE[int(r() * 5)], "tip": TIP[int(r() * 2)],
                              "baslangic": 10000 + int(r() * 60000)}


def kaynak_uret():
    kayit = []
    for i, (ab, a) in enumerate(ABONE.items()):
        e = a["baslangic"]
        for d in DONEM:
            r = uretec(TOHUM + 101 * i + 7 * DONEM.index(d))
            e += 4 + int(r() * 46)
            kayit.append({"abone": ab, "donem": d, "bolge": a["bolge"], "tip": a["tip"],
                          "endeks": e, "birim": "m3"})
    return kayit


def a1_ayikla(kayit):
    ZOR = ("abone", "donem", "bolge", "endeks", "birim")
    tut = [k for k in kayit if all(a in k for a in ZOR)]
    return tut, len(kayit) - len(tut)


def a2_tekille(kayit):
    gor, tut = set(), []
    for k in kayit:
        ad = (k["abone"], k["donem"])
        if ad in gor:
            continue
        gor.add(ad)
        tut.append(k)
    return tut, len(kayit) - len(tut)


def a3_tuketim(kayit):
    tablo = {(k["abone"], k["donem"]): k for k in kayit}
    cikti, dusen = [], 0
    for k in kayit:
        i = DONEM.index(k["donem"])
        if i == 0:
            continue
        onceki = tablo.get((k["abone"], DONEM[i - 1]))
        if onceki is None:
            dusen += 1
            continue
        cikti.append(dict(k, m3=int(k["endeks"]) - int(onceki["endeks"])))
    return cikti, dusen


ISCI, AG_BEDELI, GOREV_SABIT = 4, 3, 50


def satirlar():
    v, _ = a1_ayikla(kaynak_uret())
    v, _ = a2_tekille(v)
    v, _ = a3_tuketim(v)
    return v


def izno(m):
    h = 2166136261
    for c in str(m):
        h = ((h ^ ord(c)) * 16777619) & 0xFFFFFFFF
    return h


def dagit(kayitlar, anahtar, isci=ISCI):
    kova = {i: [] for i in range(isci)}
    for k in kayitlar:
        kova[izno(k[anahtar]) % isci].append(k)
    return kova


def yuk(kova):
    n = [len(v) for v in kova.values()]
    return {"toplam": sum(n), "en_yuklu": max(n), "en_az": min(n),
            "carpiklik": round(max(n) / (sum(n) / len(n)), 4)}


def karistir(kova, yeni_anahtar, isci=ISCI):
    yeni = {i: [] for i in range(isci)}
    tasinan = 0
    for eski, kayitlar in kova.items():
        for k in kayitlar:
            hedef = izno(k[yeni_anahtar]) % isci
            if hedef != eski:
                tasinan += 1
            yeni[hedef].append(k)
    return yeni, tasinan


def maliyet(kova, tasinan=0, isci=ISCI, ag=AG_BEDELI, sabit=GOREV_SABIT):
    """Sure = en yuklu iscinin isi (paralel). Toplam is ayrica sayilir."""
    n = [len(v) for v in kova.values()]
    return {"sure": max(n) + tasinan * ag // isci + sabit,
            "toplam_is": sum(n) + tasinan * ag, "tasinan": tasinan}


TUM = satirlar()
SAYI = (1, 2, 4, 8, 16)
print(f"is {len(TUM)} satir , bolusum anahtari bolge , karistirma aboneye")
print("isci  carpiklik  tasinan  sure  toplam is  isci x sure  sure (sabit isci basina)")
for i in SAYI:
    kv = dagit(TUM, "bolge", i)
    _, t = karistir(kv, "abone", i)
    m = maliyet(kv, t, i)
    mb = maliyet(kv, t, i, sabit=i * GOREV_SABIT)
    print(f"{i:>4}  {yuk(kv)['carpiklik']:>9}  {t:>7}  {m['sure']:>4}  {m['toplam_is']:>9}"
          f"  {i * m['sure']:>11}  {mb['sure']:>23}")
```

```
is 2200 satir , bolusum anahtari bolge , karistirma aboneye
isci  carpiklik  tasinan  sure  toplam is  isci x sure  sure (sabit isci basina)
   1        1.0        0  2250       2200         2250                     2250
   2       1.66     1210  3691       5830         7382                     3741
   4       3.32     1738  3179       7414        12716                     3329
   8       6.64     1958  2610       8074        20880                     2960
  16       6.88     2145  1398       8635        22368                     2148
```

Süre sütunu düz inmez: 2250'den **3691'e çıkar**, sonra 3179, 2610 ve 1398'e iner. Tek işçinin
altına ancak dörtten sonra düşer. Toplam iş sütunu ise hiç geri dönmez: 2200'den 5830'a, 7414'e,
8074'e ve 8635'e **tek yönlü tırmanır**. Aynı satır kümesi, aynı sonuç, dört kat toplam iş.

İkinci satır kursun ikinci iddiasının en net örneğidir. Tek işçide karıştırma yoktur; ikinci işçi
eklendiği anda 1210 satır ağdan geçmek zorunda kalır, toplam iş 2200'den 5830'a sıçrar ve en yüklü
işçinin payı hâlâ büyük olduğu için süre de yükselir. **Paralellik bedava değildir ve ilk adımı
negatiftir.**

Son iki sütun kararın nasıl döndüğünü gösterir. İşçi ile sürenin çarpımı — kümeyi iş boyunca
kiralamanın karşılığı — 2250'den **22368**'e hiç inmeden tırmanır; bu ölçüte göre en iyi kurulum tek
işçidir. Sabit bedel işçi başına sayıldığında on altı işçinin süresi 1398'den **2148**'e çıkar ve tek
işçiye olan üstünlüğü 852 birimden **102 birime** iner. `GOREV_SABIT = 50` gibi küçük bir seçim, on
altı katlık bir kurulumun kazancını neredeyse siler.

## Karar Neye Asılı

Üç ölçüt üç ayrı yanıt verdi. Sıradaki soru bu yanıtların modeldeki iki seçime ve bölüşüm anahtarına
ne kadar bağlı olduğudur. İkinci blok ağ bedelini süpürür, sonra aynı süpürmeyi çarpıklığı olmayan
bir anahtarla tekrarlar.

```python
# Bu blok ilk bloktaki TUM , SAYI , dagit , yuk , karistir ve maliyet tanimlarini surdurur.
print("ag bedeli  " + "  ".join(f"{i:>5}" for i in SAYI) + "   en kisa sure")
for ag in (1, 3, 6, 12):
    s = []
    for i in SAYI:
        kv = dagit(TUM, "bolge", i)
        _, t = karistir(kv, "abone", i)
        s.append(maliyet(kv, t, i, ag=ag)["sure"])
    print(f"{ag:>9}  " + "  ".join(f"{v:>5}" for v in s) + f"   {SAYI[s.index(min(s))]:>13}")

print("\nbolusum anahtari abone , karistirma doneme")
print("isci  carpiklik  tasinan  sure  toplam is")
for i in SAYI:
    kv = dagit(TUM, "abone", i)
    _, t = karistir(kv, "donem", i)
    m = maliyet(kv, t, i)
    print(f"{i:>4}  {yuk(kv)['carpiklik']:>9}  {t:>7}  {m['sure']:>4}  {m['toplam_is']:>9}")
```

```
ag bedeli      1      2      4      8     16   en kisa sure
        1   2250   2481   2310   2120   1130              16
        3   2250   3691   3179   2610   1398              16
        6   2250   5506   4483   3344   1800              16
       12   2250   9136   7090   4813   2604               1

bolusum anahtari abone , karistirma doneme
isci  carpiklik  tasinan  sure  toplam is
   1        1.0        0  2250       2200
   2        1.0     1100  2800       5500
   4       1.02     1651  1849       7153
   8       1.04     1927  1058       7981
  16        1.2     2066   602       8398
```

İlk tablo `AG_BEDELI`'nin bir seçim olmasının ne demek olduğunu gösterir. Bedel 1, 3 ve 6'da en kısa
süreyi on altı işçi verir; bedel 12'de kazanan **tek işçiye döner**, çünkü 2604 sayısı 2250'nin
üstündedir. Ağın yerel işleme oranı bir kez değişince, on altı katlık bir kümenin gerekçesi ortadan
kalkar. **Boyutlandırma kararı ölçülen işin değil, ağ ile hesap arasındaki oranın kararıdır** ve o
oran yazılmadan sonuç taşınamaz.

İkinci tablo çarpıklığın payını ayırır. `abone` anahtarında çarpıklık on altı işçiye kadar 1,20'yi
geçmez ve süre 602'ye iner — `bolge` anahtarındaki 1398'in çok altına. Buna karşılık **ikinci
işçinin süreyi yükseltmesi burada da olur**: 2250'den 2800'e. Karıştırma iyi bir anahtarla bile
doğar ve ilk adımda kazancından büyüktür. Kursun ikinci iddiası çarpıklığın sonucu değildir;
çarpıklık onu yalnız derinleştirir.

## Özet

- Aynı 2200 satırlık iş bir, iki, dört, sekiz ve on altı işçide süre **2250, 3691, 3179, 2610,
  1398** ve toplam iş **2200, 5830, 7414, 8074, 8635** verir; süre inerken toplam iş çıkar.
- İkinci işçi süreyi 2250'den **3691'e çıkarır**: karıştırma doğar, 1210 satır ağdan geçer ve toplam
  iş 5830'a sıçrar. Süre tek işçinin altına ancak dört işçiden sonra iner.
- Üç ölçüt üç ayrı kurulum seçer: süre on altı işçiyi, toplam iş tek işçiyi, işçi ile sürenin çarpımı
  (2250'den **22368**'e) yine tek işçiyi. Hangi ölçütün ödendiği yazılmadan karar verilemez.
- `GOREV_SABIT = 50` işçi başına sayıldığında on altı işçinin süresi 2148 olur ve kazanç 852'den
  **102**'ye iner; `AG_BEDELI` 12'ye çıktığında en kısa süreyi veren kurulum **tek işçiye döner**.
- Çarpıklığı olmayan `abone` anahtarında süre 602'ye kadar iner, ama ikinci işçinin süreyi 2250'den
  **2800**'e çıkarması orada da olur; karıştırmanın ilk adımdaki bedeli çarpıklıktan bağımsızdır.

## Kurs Kapanışı

Satırlar ortak birim taşımaz; her satırın **hangi ölçütle** okunduğu ders adının yanındadır.
Parantezdeki fark **dağıtık kurulum eksi tek işçilik tabandır**; işaretin yönü ölçüt adından okunur.

| Ders | Tek işçilik taban | Dağıtık kurulum | Bedel |
|---|---|---|---|
| `dagitik-hesaplama/01` — süre ve toplam iş | tek işçi süre **2250**, toplam iş **2200** | dört işçi `abone` süre **611** (**−1639**), toplam iş **2200** (**0**) | toplam iş dört kurulumda da 2200'dür ve onları birbirinden ayırmaz |
| `dagitik-hesaplama/02` — yerel okunan blok ve süre | tek kopya **5/22** yerel, süre **1850** | çoğaltma 3 ile **22/22** (**+17**), süre **650** (**−1200**) | saklanan blok 22'den **66**'ya çıkar, dördüncü kopya yerelliğe hiçbir şey katmaz |
| `dagitik-hesaplama/03` — taşınan satır ve toplam iş | eşleme taşınan **0**, toplam iş **2200** | doğrudan indirgeme taşınan **1738** (**+1738**), toplam iş **7414** (**+5214**) | ön-indirgeme aynı sonucu 20 ara satır ve **2245** toplam işle verir |
| `dagitik-hesaplama/04` — okunan satır ve açılan bölüm | istekli plan **6556** satır, **44** bölüm | tembel plan **200** satır (**−6356**), **1** bölüm (**−43**) | plandaki tür hatası ancak ilk eylemde ve 200 satır okunduktan sonra görünür |
| `dagitik-hesaplama/05` — süre ve ödenen sabit bedel | tek yuva süre **3000**, sabit bedel **800** | on altı yuva süre **215** (**−2785**), sabit bedel **800** (**0**) | her göreve bir yuva verilince sekizden on altıya kazanç **121**'de kalıp eklenen **400**'e yenilir |
| `dagitik-basarim/01` — taşınan satır ve süre | `abone` düzeninde taşınan **0**, süre **611** | `bolge`'ye karıştırınca taşınan **1738** (**+1738**), süre **1914** (**+1303**) | toplam iş 2200'den **7414**'e çıkar; 5214 birimi hiçbir hesap yapmayan saf harekettir |
| `dagitik-basarim/02` — birleştirme süresi, 4000 satırlık boyut | yayınlı **5876** | bölümlü **5429** (**−447**) | kesişme noktası **2980**'dir ve ağ bedeli 6 ile 12'de bölümlü hiçbir boyutta öne geçemez |
| `dagitik-basarim/03` — çarpıklık ve süre | tek işçi çarpıklık **1,00**, süre **2250** | `bolge` ile iki işçi çarpıklık **1,66** (**+0,66**), süre **3691** (**+1441**) | on altı işçide çarpıklık **6,88**, boş işçi **13**; süre **589**'un altına hiçbir sayıda inemez |
| `dagitik-basarim/04` — iki sorgunun toplamı | önbelleksiz **5500** | önbellekli **3300** (**−2200**) | önbellek tutulmazsa toplam yine **5500**'dür ve tek sorguda kazanç **0**'dır |
| `dagitik-basarim/05` — yeniden hesaplanan satır | denetim noktası yok **1600** | aralık 3 ile **400** (**−1200**) | kesin bedel 0'dan **800**'e çıkar, oysa aralık 6 da aynı **400**'ü verir |
| `dagitik-basarim/06` — süre ve toplam iş | tek işçi süre **2250**, toplam iş **2200** | on altı işçi süre **1398** (**−852**), toplam iş **8635** (**+6435**) | ikinci işçi süreyi **3691**'e çıkarır; sabit bedel işçi başına sayılınca kazanç **102**'ye iner |

Tablo tek bir kuralın on bir kez yazılmasıdır. **Dağıtık bir işin sayısı tek bir sayı değildir: süre
ile toplam iş ayrı ölçülür ve hangisinin ölçüldüğü yazılmayan bir hızlanma iddiası eksiktir.** İki
sütunun aynı satırda ters yöne gittiği yerler kuralın kendisidir: `dagitik-hesaplama/03`'te süre
düşerken toplam iş 2200'den 7414'e çıkar, bu derste süre 852 birim inerken toplam iş 6435 birim
tırmanır. `dagitik-hesaplama/01` bunun aynasını gösterir: dört kurulumun süresi 611 ile 2250
arasında değişirken toplam iş dördünde de 2200'dür, yani yalnız toplam işi yazan bir rapor bu
kurulumların hiçbirini ayırt edemez.

**İkinci iddia aynı tablodan okunur: işçi eklemek işi kötüleştirir.** `dagitik-basarim/03`'te ikinci
işçi süreyi 2250'den 3691'e çıkarır ve toplam işi 5830'a taşır; bu derste aynı adım çarpıklığı 1,00
olan `abone` anahtarında bile süreyi 2800'e çıkarır. `dagitik-hesaplama/05`'te sekizden on altı
göreve geçişte kazanılan 121 birim, eklenen 400 birimlik sabit bedele yenilir.
`dagitik-hesaplama/02`'de dördüncü kopya saklanan bloğu 88'e çıkarıp yerelliğe hiçbir şey katmaz.
`dagitik-basarim/04`'te tek sorgulu bir işte önbellek 2200 satır tutar ve 0 kazandırır,
`dagitik-basarim/05`'te aralığı altıdan üçe indirmek kesin bedeli 400'den 800'e çıkarıp kurtarmayı
hiç değiştirmez. Altı derste **eklenen kaynak ödenmiş, karşılığı alınmamıştır.**

**Üçüncü iddia daha sessizdir: sonuç her kurulumda aynıdır.** `dagitik-hesaplama/03`'te üç kurulumun
sunduğu beş bölge toplamı birebir aynıdır, oysa biri 7414 öbürü 2245 toplam iş harcar.
`dagitik-basarim/01`'de süre 611'den 1914'e çıkarken çıktı değişmez, `dagitik-basarim/02`'de iki
birleştirme stratejisi her boyutta aynı satırları eşleştirir, `dagitik-basarim/03`'te üç bölüşüm de
bölge toplamlarının aynısını üretir, `dagitik-basarim/04`'te tutulmayan önbellek sonucu değil yalnız
bedeli değiştirir, `dagitik-basarim/05`'te tam bir kez sağlandığı sürece dört aralık da aynı sonucu
verir. **Doğruluğu sınayan hiçbir denetim yanlış bölüşümü göstermez**; yanlış bölüşüm ancak
sayıldığında görünür ve sayılmadığı sürece fatura sessizce büyür.

On bir derste veri bölündü, taşındı, dengelendi, saklandı ve kurtarıldı; yirmi yedi derste ise
alındı, dönüştürüldü, depolandı ve sıraya kondu. Bu verinin gittiği yer hiç sorulmadı. Onu **besleyen
modelin** kendisi, aynı veriyle **aynı modelin yeniden üretilip üretilemeyeceği** ve eğitilen bir
modelin **üretime nasıl çıkacağı** hiçbir derste ölçülmedi. Sonraki kurs hattın çıktısını girdi
kabul eder ve bir eğitim koşumunun tekrarlanabilirliğini, sürümlenebilirliğini ve dağıtımını sayar.
