---
title: 'Ağ İşletimi ve Otomasyon'
source: 'https://academia.sh/tr/kurslar/ag-isletimi'
language: tr
updated: '2026-08-17T04:39:12+00:00'
license: 'CC BY-SA 4.0'
lessons: 16
outcomes:
    - 'Trafik dağıtım ve önbellekleme katmanlarını uçtan uca tasarlar'
    - 'Ağ telemetrisini toplayıp anlamlı gösterge tablolarına dönüştürür'
    - 'Ağ yapılandırmasını kod olarak yönetir'
---

# Ağ İşletimi ve Otomasyon

İşletmede operatör tek bir kaldıraca dokunur ve o kaldıraç kırk özneye birden uygulanır; kurs trafik dağıtımından telemetriye ve yapılandırma otomasyonuna kadar her kararın yanlış hizmet ettiği azınlığı sayar.

## Trafik Yönetimi

Katman 4 ile katman 7 dengelemenin farkı, dağıtım kurallarının kapasitesi eşit olmayan öznelerde bıraktığı kuyruk, iki vekil türünün amacı, kenar önbelleklemenin çekme ve itme modelleri, ve sınıflandırma ile şekillendirmenin kime ne ödettiği.

### Yük Dengeleyiciler

Source: https://academia.sh/tr/kurslar/ag-isletimi/yuk-dengeleyiciler

Aktarım katmanında çalışan dengeleyici bağlantı dağıtır, uygulama katmanında çalışan istek dağıtır; aynı kırk öznede biri 17 özneyi 438 birimle aşırır, öteki 16 özneyi 310 birimle ve aktarım katmanının kendi göstergesi kırk öznenin kırkında da aynı sayıyı gösterir.

Önceki kurs sınırın nasıl **yazıldığını** ölçtü: hangi güç, hangi eşik, hangi kural dizisi,
hangi ölçüt. Hiçbir ders sınırın yazıldıktan sonra ne olduğunu sormadı. Yazılan bir sınır
yaşayan bir sistemde durur; yükü değişir, sapması kimseye görünmez. **Sınırı yazmak ile
yazılanı işletmek ayrı işlerdir.**

Buraya kadarki her karar **tek bir nesne** içindi: bir paket, bir akış, bir istemci, bir
kural satırı. İşletmede böyle çalışılmaz. Operatör tek tek nesneye dokunmaz; **bir kaldıraca**
dokunur — bir dağıtım kuralı, bir örnekleme oranı, bir şablon — ve o kaldıraç **kırk özneye
birden** uygulanır. Bu kursun sorusu budur ve ilk kaldıraç yük dengeleyicidir.

#### Kaldıraç ve Özne

Kurs boyunca aynı topluluk ölçülür: **kırk özne**. Özneler birbirinin aynı değildir.
Kapasiteleri 22 ile 99 birim arasında dağılır, gecikmeleri ayrıdır, üç hizmet sınıfından
birine aittir ve dokuzu ilerideki bir kaldıracın dışında kalması gereken özel aygıtlardır.
Toplulukta ne olduğunu **biz yazdığımız için** biliriz; ölçümün kâhini (oracle) kurgunun
kendisidir.

Ölçülen şey kaldıracın niteliği değildir. **Bir işletme kararının sayısı, kaç özneye yanlış
hizmet ettiğidir.** Kaldıraç tektir, özne kırktır ve aradaki farkı taşıyan azınlığa bu kursta
**kaldıracın kuyruğu (tail)** denir. Kuyruk bu kursta yalnız bu duyudadır: kaldıracın yanlış
hizmet ettiği özneler kümesi.

Kuyruğun iki ayrı sayısı vardır ve her ölçümde ikisi de yazılır. Birincisi **kaç özne**
kuyrukta kaldığıdır. İkincisi, kuyruktakilerin **kaçının kaldıracın kendi göstergesinde
görünmediğidir**. Bu ders ikincinin en temiz örneğiyle başlar.

Ortalamanın neden yeterli olmadığı burada görülür. Kırk özneye bölünen bir yük, ortalamada
her zaman kapasitenin altında kalabilir ve aynı anda birkaç özne kapasitesinin çok üstünde
olabilir. Ortalama, dağılımın **iki ucunu birden** aynı sayıya katar: aşan öznenin fazlası
ile boşta duran öznenin eksiği toplamda birbirini götürür. Kuyruk ölçüsü tam olarak bu
götürmeyi reddeder. Bu yüzden aşağıdaki her tabloda aşan özne ile boşta kalan birim **ayrı
sütunlardır** ve hiçbir ölçümde tek bir sayıya indirgenmez.

#### Dengeleyici Neyi Okur

**Yük dengeleyici (load balancer)**, gelen işi bir özne kümesine bölen aracıdır. Rolü ve
katmanlara göre ayrımı Sistem Tasarımı müfredatının Trafik Katmanı kursunda kuruldu; o anlatı
burada tekrarlanmaz. Fark tek cümledir: **orada dengeleyicinin tasarımı ölçüldü, burada tek
bir kaldıracın kapasitesi eşit olmayan kırk öznede bıraktığı kuyruk ölçülür.**

Ayrımın bu ders için önemli olan yanı, dengeleyicinin **neyi okuyabildiğidir**.

**Aktarım katmanında** çalışan dengeleyici bağlantı dörtlüsünü görür: kaynak ve hedef adres,
kaynak ve hedef bağlantı noktası. Bağlantının içindekini açmaz. Dağıtım birimi bu yüzden
**bağlantıdır**: gelen her yeni bağlantıyı bir özneye bağlar ve o bağlantı kapanana kadar
oraya bağlı kalır.

**Uygulama katmanında** çalışan dengeleyici bağlantıyı kendinde sonlandırır, isteği okur ve
öznelere kendi açtığı bağlantılar üzerinden iletir. Dağıtım birimi **istektir**. İsteğin
yolunu ve başlık alanlarını okuyabildiği için özneleri sınıflara ayırıp her sınıfı ayrı bir
havuza yollayabilir.

İkisi arasındaki seçim bir yapılandırma satırıdır:

```text
# öğretilen yapılandırma dökümü, çalıştırılmamıştır

dengeleyici aktarim {
  dinle    *:443
  birim    baglanti
  kural    sirali
  havuz    ozne-01 ... ozne-40
}

dengeleyici uygulama {
  dinle    *:443
  birim    istek
  kural    sirali
  eslesme  /etkilesim/*  -> havuz-etkilesim
  eslesme  /toplu/*      -> havuz-toplu
  eslesme  /yedek/*      -> havuz-yedek
}
```

Bu döküm bir belge, bir ölçüm değil. Sayılar aşağıdaki ölçümden gelir.

#### Denetim de Bir Kaldıraçtır

Dengeleyicinin dağıtımdan başka bir kaldıracı daha vardır: **sağlık denetimi (health
check)**. Bir aralık, bir zaman aşımı ve ard arda kaç başarısızlığın öznenin havuzdan
çıkarılmasına yeteceği yazılır. Yazılan bu üç sayı da tek tek özneye değil, **kırkına
birden** uygulanır.

Denetimin var olup olmamasının hizmete etkisi Sistem Tasarımı müfredatının Trafik Katmanı
kursunda ölçüldü ve burada tekrarlanmıyor. Fark tek cümledir: **orada denetimin varlığı
ölçüldü, burada tek bir eşiğin kırk öznede bıraktığı kuyruk.**

Eşiğin kuyruğu iki uçludur ve uçlar birlikte kapanmaz. Zaman aşımı gevşek yazılırsa,
yavaşlamış ama hâlâ yanıt veren özne sağlıklı sayılır ve kendisine iş yönlendirilmeye devam
eder; kuyruk, o özneye giden isteklerdir. Zaman aşımı sıkı yazılırsa, gecikmesi zaten yüksek
olan özneler denetimden geçemez ve havuzdan düşer; kuyruk bu kez düşen öznelerin yükünü
üstlenen kalan öznelerdir. Kırk öznenin gecikmeleri birbirinden ayrı olduğu için **tek bir
zaman aşımı ikisini birden yapamaz.**

Denetimin okuduğu şeyin öznenin **kendi bildirimi** olduğu da unutulmamalı: özne sağlıklı
olduğunu söyler, denetim buna inanır. Uygulama Katmanı Protokolleri kursunun bıraktığı
gözlem burada da geçerlidir — bildirimi doğrulayan bir şey yoktur, yalnızca bildirimin
gelmemesi bir bilgidir.

Aynı ikilik özne havuzdan çıkarılırken de görülür. Çıkarma anında var olan bağlantılar
kesilmez, bir **boşaltma (draining)** süresi tanınır. Bu süre de tek bir sayıdır ve kırk
özneye birden uygulanır: uzun yazılırsa arızalı öznenin üstündeki iş uzun süre orada kalır,
kısa yazılırsa yarım kalmış işler kesilir. Kaldıraç aynı kaldıraçtır; yalnız kuyruğun kimden
oluştuğu değişir.

#### Kaldıracın Kendi Göstergesi

Aktarım katmanındaki dengeleyicinin sayabildiği tek şey bağlantıdır. Sıralı bir kuralla
dağıtım yaptığında kendi sayacı, tanımı gereği, kırk öznenin kırkında da **aynı değeri**
gösterir. Gösterge düzdür ve düz olması kuralın doğruluğunun kanıtı gibi okunur.

Oysa bağlantıların taşıdığı iş eşit değildir. Kalıcı bağlantı bir isteği de taşır, otuz
isteği de. Dengeleyici bunu göremez, çünkü göremediği şey bağlantının içidir. **Eşit dağıtılan
şey ile öznenin gerçekten yüklendiği şey aynı değildir** ve ikisinin arasındaki fark
kaldıracın göstergesine hiç yansımaz.

Uygulama katmanındaki dengeleyici bu farkı kapatır: istek sayar, istek dağıtır, göstergesi
gerçek iş birimini gösterir. Ölçüm bunun ne kadarını çözdüğünü sorar.

Ölçümün varsayımları:

- **TY1** — Kırk özne kursun sabit kümesidir; kapasite, gecikme ve sınıf alanları ölçüm
  boyunca değiştirilmez. Kâhin bu kümenin kendisidir.
- **TY2** — Dört yüz bağlantı üretilir ve her biri değişken sayıda istek taşır. Bağlantıların
  sekizde biri uzun ömürlüdür ve yirmi ile kırk arasında istek taşır; kalanı bir ile dört
  arasında.
- **TY3** — Dengeleyici sıralı kuralla dağıtır. Kural üç ölçümde de aynıdır; **değişen tek
  şey dağıtımın birimidir** — bağlantı, istek, ya da sınıf havuzundaki istek.
- **TY4** — Aktarım katmanındaki dengeleyici bağlantının taşıdığı istek sayısını okuyamaz;
  uygulama katmanındaki okur. Kurgu bu ayrımı doğrudan kodlar.
- **TY5** — Kapasite bir öznenin aynı anda karşılayabileceği istek sayısıdır. Bu sayının
  üstüne çıkan her birim aşımdır; altında kalan her birim boştadır.
- **TY6** — Ölçüm bir ağ ölçümü değildir; hiçbir bağlantı açılmaz. Sayılan şey kurgudaki
  dağıtımın kendisidir.

#### Ölçüm

```python
"""Katman 4 ile katman 7 dengeleme: ayni kirk oznede iki kaldirac."""
TOHUM = 20260812
SINIFLAR = ("etkilesim", "toplu", "yedek")


def uretec(tohum):
    d = tohum % 2147483646 + 1

    def r(n):
        nonlocal d
        d = (d * 48271) % 2147483647
        return d % n
    return r


def ozneler(sayi=40, tohum=TOHUM):
    r, liste = uretec(tohum), []
    for i in range(sayi):
        liste.append({"no": i + 1, "kapasite": 20 + r(81), "gecikme": 5 + r(45),
                      "sinif": SINIFLAR[r(3)], "ozel": r(9) == 0})
    return liste


def baglantilar(sayi=400, tohum=TOHUM + 11):
    r, liste = uretec(tohum), []
    for i in range(sayi):
        uzun = r(8) == 0
        liste.append({"istek": 20 + r(21) if uzun else 1 + r(4),
                      "sinif": SINIFLAR[r(3)]})
    return liste


def katman4(bag, oz):
    """Bagi dagitir; bagin kac istek tasidigini bilmez."""
    pay = {o["no"]: 0 for o in oz}
    sayac = {o["no"]: 0 for o in oz}
    for i, b in enumerate(bag):
        o = oz[i % len(oz)]
        sayac[o["no"]] += 1
        pay[o["no"]] += b["istek"]
    return pay, sayac


def katman7(bag, oz, havuzla):
    """Istegi dagitir; istenirse sinifin havuzuna."""
    havuz = {s: [o for o in oz if o["sinif"] == s] for s in SINIFLAR}
    sayac = {s: 0 for s in SINIFLAR}
    pay, i = {o["no"]: 0 for o in oz}, 0
    for b in bag:
        h = havuz[b["sinif"]] if havuzla else oz
        for _ in range(b["istek"]):
            if havuzla:
                pay[h[sayac[b["sinif"]] % len(h)]["no"]] += 1
                sayac[b["sinif"]] += 1
            else:
                pay[h[i % len(h)]["no"]] += 1
                i += 1
    return pay


def asan(pay, oz):
    s = b = 0
    for o in oz:
        f = pay[o["no"]] - o["kapasite"]
        if f > 0:
            s, b = s + 1, b + f
    return s, b


oz, bag = ozneler(), baglantilar()
print(f"özne {len(oz)} | toplam kapasite {sum(o['kapasite'] for o in oz)} | "
      f"en küçük {min(o['kapasite'] for o in oz)} en büyük {max(o['kapasite'] for o in oz)}")
print(f"bağlantı {len(bag)} | istek {sum(b['istek'] for b in bag)}")
for s in SINIFLAR:
    h = [o for o in oz if o["sinif"] == s]
    print(f"  {s:10s} özne {len(h):2d} kapasite {sum(o['kapasite'] for o in h):5d} "
          f"istek {sum(b['istek'] for b in bag if b['sinif'] == s):5d}")

pay4, sayac = katman4(bag, oz)
olcum = (("katman 4 (bağlantı)", pay4), ("katman 7 (istek)", katman7(bag, oz, False)),
         ("katman 7 (sınıf havuzu)", katman7(bag, oz, True)))
print()
print(f"{'kaldıraç':<24s} {'aşan':>5s} {'aşan birim':>11s} {'boşta':>7s} "
      f"{'en az':>6s} {'en çok':>7s} {'hiç yük almayan':>16s}")
for ad, pay in olcum:
    s, b = asan(pay, oz)
    print(f"{ad:<24s} {s:5d} {b:11d} "
          f"{sum(max(0, o['kapasite'] - pay[o['no']]) for o in oz):7d} "
          f"{min(pay.values()):6d} {max(pay.values()):7d} "
          f"{sum(1 for o in oz if pay[o['no']] == 0):16d}")
print()
print(f"katman 4'ün kendi göstergesi — bağlantı sayısı: en az {min(sayac.values())}, "
      f"en çok {max(sayac.values())}; kapasitesini aşan {asan(pay4, oz)[0]} özne "
      f"bu göstergede görünmez")
```

```
özne 40 | toplam kapasite 2336 | en küçük 22 en büyük 99
bağlantı 400 | istek 2193
  etkilesim  özne 11 kapasite   580 istek   655
  toplu      özne 20 kapasite  1346 istek   700
  yedek      özne  9 kapasite   410 istek   838

kaldıraç                  aşan  aşan birim   boşta  en az  en çok  hiç yük almayan
katman 4 (bağlantı)         17         438     581     21     164                0
katman 7 (istek)            16         310     453     54      55                0
katman 7 (sınıf havuzu)     18         558     701     35      94                0

katman 4'ün kendi göstergesi — bağlantı sayısı: en az 10, en çok 10; kapasitesini aşan 17 özne bu göstergede görünmez
```

#### Kuyruk Nerede

Son satır dersin çekirdeğidir. Aktarım katmanındaki dengeleyicinin sayacı kırk öznenin
kırkında da **10** gösteriyor; en az ile en çok arasında hiç fark yok. Aynı anda kırk öznenin
**17**'si kapasitesini aşmış durumda ve gerçek yük **21** ile **164** arasında dağılıyor.
Kaldıraç doğru çalışıyor — kendi tanımına göre. **Kuyruk, kaldıracın ölçtüğü boyutta
görünmüyor.**

Uygulama katmanına geçmek bunun bir kısmını çözüyor. İstek dağıtıldığında yük **54** ile
**55** arasına sıkışıyor; artık gösterge gerçekten dağıtılan şeyi gösteriyor. Ama aşan özne
**17**'den **16**'ya, aşan birim **438**'den **310**'a iniyor. Kırk öznede kazanılan **tek
bir özne**. Kırk öznelik bir kümede ölçülebilen en küçük fark **1/40 = 0,025**'tir; bir
öznelik kazanç tam olarak o eşiktedir ve daha küçük bir fark bu kümeyle savunulamaz.

Kazancın küçük kalmasının nedeni açık. Uygulama katmanı **eşit istek** dağıtıyor, ama
özneler eşit değil: kapasiteler **22** ile **99** arasında. Herkese 54 istek düşürmek, 22
kapasiteli özne için üç katlık bir aşım, 99 kapasiteli özne için yarı yarıya boşluktur.
Kaldıracın çözünürlüğünü artırmak kuyruğu **taşıdı**, kaldırmadı.

Üçüncü satır bunu daha net söylüyor. Sınıf havuzu, uygulama katmanının kazandırdığı asıl
yeteneği kullanıyor: istek yoluna bakıp özneyi seçmek. Sonuç **daha kötü** — aşan özne
**18**, aşan birim **558**. Sebep üstteki üç satırda duruyor: yedek sınıfı **9** özne ve
**410** kapasite taşıyor ama **838** istek alıyor; toplu sınıfı **20** özne ve **1346**
kapasiteyle **700** istek alıyor. Havuzlara ayırmak, kapasitesi olan özneleri kullanılamaz
hâle getirdi. Boşta kalan birim **453**'ten **701**'e çıktı.

Dördüncü sütun bu yüzden ölçümün parçasıdır. Üç kaldıraçta da **hiç yük almayan özne 0**:
hiçbir özne dışarıda kalmıyor, kimse kapının önünde değil. Yine de sistemde **581**, **453**
ve **701** birim boşta duruyor. Yalnız aşımı sayan bir gösterge bu sütunu hiç göstermez ve
kapasitenin dörtte birinin kullanılmadığını söylemez.

Bu tabloyu yazabilmemizin tek nedeni kapasiteleri **bilmemizdir**. İşletmede böyle bir sütun
hazır durmaz: dengeleyici öznenin kapasitesini ölçmez, ona verdiği işi sayar. Aşım sütunu
ancak kapasite başka bir yerden — özne başına ayrı bir ölçümden — getirildiğinde
hesaplanabilir; getirilmezse gösterge yine düzdür ve yine yanlış değildir. Bu dersin
kurgusunda kâhin elimizde olduğu için iki sütunu yan yana koyabiliyoruz ve kursun geri
kalanının sorduğu şey tam olarak budur: **kaldıracın göstergesi ile kaldıracın sonucu
arasındaki fark nereden okunur?** Sonraki iki konu, önce trafiğin kendisinde, sonra
telemetride bu farkı sayacak.

#### Özet

- İşletmenin birimi tek nesne değil **kaldıraçtır**: operatör bir kural yazar, kural kırk
  özneye birden uygulanır ve ölçülen şey kaldıracın yanlış hizmet ettiği azınlık, yani
  **kuyruktur**.
- Aktarım katmanındaki dengeleyici **bağlantı** dağıtır ve bağlantının taşıdığı isteği
  göremez; kendi göstergesi kırk öznede de **10** gösterirken gerçek yük **21** ile **164**
  arasındadır ve **17** özne kapasitesini aşmıştır.
- Uygulama katmanındaki dengeleyici **istek** dağıtır ve yükü **54–55** aralığına sıkıştırır;
  aşan özne yalnız **16**'ya, aşan birim **310**'a iner. Kırk öznede kazanç **bir öznedir**.
- Eşit istek dağıtmak eşit yük değildir: kapasiteler **22** ile **99** arasında olduğu için
  aynı pay bir özne için aşım, başkası için boşluktur.
- Sınıf havuzuna ayırmak kuyruğu büyütür — aşan özne **18**, boşta kalan birim **701** —
  çünkü havuzların kapasitesi ile aldıkları istek birbirini tutmaz.
- Sağlık denetimi de tek bir kaldıraçtır ve kuyruğu iki uçludur: gevşek eşik yavaşlamış
  özneye iş yollamayı sürdürür, sıkı eşik gecikmesi yüksek özneleri düşürüp yüklerini
  kalanlara bindirir; kırk öznenin gecikmesi ayrı olduğu için tek eşik ikisini birden
  kapatmaz.

#### Sonraki Adım

Bu derste kural üç ölçümde de aynıydı: sıralı dağıtım. Değişen tek şey dağıtımın birimiydi
ve birim değiştirmek kuyruğu kırkta bir kadar oynattı. Öyleyse asıl soru birim değil
**kuralın kendisidir**: yükü kapasiteye göre bölen ya da her adımda en az yüklü özneyi seçen
bir kural, kuyruğu gerçekten kaldırır mı? Sonraki ders üç dağıtım kuralını aynı kırk öznede
ve iki ayrı yükte yan yana koyar ve kuralı iyileştirmenin kuyruğa ne yaptığını — kaldırıp
kaldırmadığını, yoksa yalnız kimin kuyrukta olacağını mı seçtiğini — sayar.

### Yük Dengeleme Algoritmaları

Source: https://academia.sh/tr/kurslar/ag-isletimi/yuk-dengeleme-algoritmalari

Dört dağıtım kuralı aynı kırk öznede iki ayrı yükte koşturulur; yük 1200'de aşan özne 6 / 0 / 0, yük 2600'de 23 / 40 / 40 ve aşan birim 533 / 245 / 264 çıkar, 1200'de 1160 birim boşta durur ve oransal kuralın aşım sütununu temiz gösteren şey dağıtmadığı 19 birimdir.

Önceki ders kuralı sabit tuttu ve yalnız dağıtımın birimini değiştirdi: bağlantı yerine
istek. Kırk öznelik kümede kazanç tek bir özneydi. Öyleyse asıl soru birimde değil
**kuralın kendisindedir**. Yükü kapasiteye göre bölen ya da her adımda en az yüklü özneyi
seçen bir kural, kuyruğu gerçekten kaldırır mı?

Bu dersin ölçtüğü şey budur ve yanıtı tek bir tabloda iki ayrı yükle verilir. Kuralın
"iyi" olması bir yükte doğru, başka bir yükte yanıltıcı çıkar.

#### Dört Kural

Dağıtım kuralı, gelen bir işi kırk özneden birine bağlayan işlevdir. Dört kural ölçülür ve
dördü de birbirinden **neyi okuduğuyla** ayrılır.

**Sıralı (round robin)** hiçbir şey okumaz. Özneleri sırayla dolaşır ve her işi bir
sonrakine verir. Durum tutmaz, kapasiteyi bilmez, anlık yükü bilmez.

**Kapasiteye göre** dağıtım her özneye kapasitesiyle orantılı bir pay ayırır. Kapasiteyi
okur ama anlık yükü okumaz: payları baştan hesaplar ve öyle dağıtır.

**En az bağlantı (least connections)** her adımda o an en az yüklü özneyi seçer. Burada
ölçülen biçimi ağırlıklıdır: karşılaştırma ham bağlantı sayısına değil, **bağlantı sayısının
kapasiteye oranına** bakar. Hem kapasiteyi hem anlık yükü okur ve bu yüzden dört kuralın en
pahalısıdır — her karar için kırk öznenin durumunu görmesi gerekir.

**Tutarlı karma (consistent hashing)** işin bir anahtarını — oturum kimliği, istemci
adresi — bir halka üzerine düşürür ve halkada saat yönünde ilk özneye verir. Kapasiteyi de
anlık yükü de okumaz; okuduğu tek şey anahtardır. Küme değişmediği sürece aynı anahtar hep
aynı özneye gider; özne eklendiğinde ya da çıkarıldığında anahtarların yalnız küçük bir
bölümü yer değiştirir — aşağıdaki ölçüm bu payı sayar.

Bu kuralların karşılaştırması Sistem Tasarımı müfredatının Trafik Katmanı kursunda yapıldı
ve algoritma listesi burada tekrarlanmıyor. Fark tek cümledir: **orada kuralların tasarım
ölçütleri karşılaştırıldı, burada tek bir kuralın kapasitesi eşit olmayan kırk öznede
bıraktığı kuyruk sayılır.**

Kural bir yapılandırma satırıdır ve dördü de aynı yere yazılır:

```text
# öğretilen kural sözdizimi, çalıştırılmamıştır

havuz ana { kural  sirali }

havuz ana {
  kural    kapasiteye-gore
  agirlik  ozne-01 22
  agirlik  ozne-09 99
}

havuz ana {
  kural    en-az-baglanti
  olcut    acik-baglanti / agirlik
}

havuz ana {
  kural    tutarli-karma
  anahtar  oturum-kimligi
  sanal    128
}
```

#### İki Yük, Tek Küme

Kırk öznenin toplam kapasitesi **2336** birimdir. Ölçüm bu sayının iki yanında yapılır.

**Yük 1200** toplam kapasitenin yarısından biraz fazladır. Burada sistemde bol yer vardır ve
aşım tamamen dağıtımın kusurudur: doğru bölünseydi hiçbir özne aşmazdı.

**Yük 2600** toplam kapasitenin üstündedir. Burada aşım kaçınılmazdır ve hiçbir kural onu
sıfırlayamaz. Sorulabilecek tek soru, aşımın **kime** ve **ne kadar** düşeceğidir. Arada bir
de **yük 2000** ölçülür; kapasitenin altındadır ama sıkışıklık başlamıştır.

Ölçümün varsayımları:

- **TY7** — Kırk özne kursun sabit kümesidir ve bu derste değiştirilmez; kapasiteler **22**
  ile **99** arasındadır ve kâhin kümenin kendisidir.
- **TY8** — Yük bölünebilir birimlerden oluşur; bir birim bir öznede bir birim kapasite
  tüketir. Yükün sınıfı ya da gecikmesi bu derste dağıtıma girmez.
- **TY9** — Dört kural da **aynı yük ve aynı küme** üzerinde koşturulur. Kurallar arasındaki
  tek fark okudukları alandır.
- **TY10** — Kapasiteye göre dağıtım payları tam sayıya **aşağı yuvarlar**; artan birimler
  yeniden dağıtılmaz. Bu, kuralın kendi tanımının parçasıdır ve ölçümde ayrı bir sütun olarak
  sayılır.
- **TY11** — En az bağlantı kuralı eşitlik durumunda küçük numaralı özneyi seçer; seçim
  belirlenimcidir ve koşum yinelendiğinde aynı sonucu verir.
- **TY12** — Tutarlı karma her özneyi halka üzerinde **128** sanal nokta ile temsil eder ve
  anahtar olarak işin sıra numarasını kullanır. Karma işlevi belirlenimcidir.
- **TY13** — Ölçüm bir ağ ölçümü değildir; hiçbir bağlantı açılmaz, hiçbir istek
  gönderilmez. Sayılan şey kurgudaki dağıtımın kendisidir.

#### Ölçüm

```python
"""Dort dagitim kurali ayni kirk oznede: kuyruk kalkmiyor, yer degistiriyor."""
import bisect

TOHUM = 20260812
SINIFLAR = ("etkilesim", "toplu", "yedek")
HALKA = 1 << 20


def uretec(tohum):
    d = tohum % 2147483646 + 1

    def r(n):
        nonlocal d
        d = (d * 48271) % 2147483647
        return d % n
    return r


def ozneler(sayi=40, tohum=TOHUM):
    r, liste = uretec(tohum), []
    for i in range(sayi):
        liste.append({"no": i + 1, "kapasite": 20 + r(81), "gecikme": 5 + r(45),
                      "sinif": SINIFLAR[r(3)], "ozel": r(9) == 0})
    return liste


def karma(x):
    x = (x * 2654435761) & 0xFFFFFFFF
    x ^= x >> 16
    x = (x * 2246822507) & 0xFFFFFFFF
    x ^= x >> 13
    return x % HALKA


def dagit(yuk, oz, kural, sanal=128):
    """Tek bir kural kirk ozneye yuk dagitir; anahtar -> ozne eslemesi de doner."""
    pay, esle = {o["no"]: 0 for o in oz}, {}
    if kural == "sirali":
        for i in range(yuk):
            esle[i + 1] = oz[i % len(oz)]["no"]
            pay[esle[i + 1]] += 1
    elif kural == "kapasiteye gore":
        toplam = sum(o["kapasite"] for o in oz)
        for o in oz:
            pay[o["no"]] = yuk * o["kapasite"] // toplam
    elif kural == "en az baglanti":
        for i in range(yuk):
            en = min(oz, key=lambda o: (pay[o["no"]] / o["kapasite"], o["no"]))
            esle[i + 1] = en["no"]
            pay[en["no"]] += 1
    elif kural == "tutarli karma":
        h = sorted((karma(o["no"] * 7919 + k), o["no"])
                   for o in oz for k in range(sanal))
        nok = [p for p, _ in h]
        for a in range(1, yuk + 1):
            esle[a] = h[bisect.bisect_left(nok, karma(a)) % len(h)][1]
            pay[esle[a]] += 1
    return pay, esle


def asan(pay, oz):
    """Kapasitesini asan ozne sayisi ve asan birim toplami."""
    sayi = birim = 0
    for o in oz:
        fazla = pay[o["no"]] - o["kapasite"]
        if fazla > 0:
            sayi, birim = sayi + 1, birim + fazla
    return sayi, birim


KURALLAR = ("sirali", "kapasiteye gore", "en az baglanti", "tutarli karma")
oz = ozneler()
print(f"özne {len(oz)} | toplam kapasite {sum(o['kapasite'] for o in oz)} | "
      f"en küçük {min(o['kapasite'] for o in oz)} en büyük {max(o['kapasite'] for o in oz)}")
print()
print(f"{'kural':<16s} {'yük':>5s} {'aşan özne':>10s} {'aşan birim':>11s} "
      f"{'boşta kalan':>12s} {'dağıtılmayan':>13s} {'hiç yük almayan':>16s}")
for kural in KURALLAR:
    for yuk in (1200, 2000, 2600):
        pay, _ = dagit(yuk, oz, kural)
        s, b = asan(pay, oz)
        print(f"{kural:<16s} {yuk:5d} {s:10d} {b:11d} "
              f"{sum(max(0, o['kapasite'] - pay[o['no']]) for o in oz):12d} "
              f"{yuk - sum(pay.values()):13d} "
              f"{sum(1 for o in oz if pay[o['no']] == 0):16d}")

kalan = [o for o in oz if o["no"] != 20]
print()
print(f"{'kural':<16s} {'20 no.lu öznenin payı':>22s} {'çıkarılınca taşınan':>20s}")
for kural in ("sirali", "en az baglanti", "tutarli karma"):
    pay, once = dagit(1200, oz, kural)
    _, sonra = dagit(1200, kalan, kural)
    print(f"{kural:<16s} {pay[20]:22d} "
          f"{sum(1 for a in once if once[a] != sonra[a]):20d}")
```

```
özne 40 | toplam kapasite 2336 | en küçük 22 en büyük 99

kural              yük  aşan özne  aşan birim  boşta kalan  dağıtılmayan  hiç yük almayan
sirali            1200          6          24         1160             0                0
sirali            2000         14         239          575             0                0
sirali            2600         23         533          269             0                0
kapasiteye gore   1200          0           0         1156            20                0
kapasiteye gore   2000          0           0          357            21                0
kapasiteye gore   2600         40         245            0            19                0
en az baglanti    1200          0           0         1136             0                0
en az baglanti    2000          0           0          336             0                0
en az baglanti    2600         40         264            0             0                0
tutarli karma     1200          7          66         1202             0                0
tutarli karma     2000         13         277          613             0                0
tutarli karma     2600         22         559          295             0                0

kural             20 no.lu öznenin payı  çıkarılınca taşınan
sirali                               30                 1181
en az baglanti                       15                 1181
tutarli karma                        29                   29
```

#### İyi Kural Kuyruğu Kaldırmadı

Yük 1200 satırları kuralı iyileştirmenin işe yaradığını söylüyor. Sıralı dağıtım **6** özneyi
aşırıyor; kapasiteye göre dağıtım ve en az bağlantı **hiçbirini**. Aşan birim **24**'ten
**0**'a iniyor. Buraya kadar bakan bir okuma, doğru kuralın kuyruğu kaldırdığı sonucuna
varırdı.

Yük 2600 satırları bunu tersine çeviriyor. Sıralı dağıtım **23** özneyi aşırıyor; kapasiteye
göre dağıtım ve en az bağlantı **kırk öznenin kırkını birden**. İyi olduğu söylenen iki
kural, aşan özne sayısını sıfırdan kırka çıkardı.

Aşan birim sütunu tam ters yönde okunuyor: sıralı **533**, kapasiteye göre **245**, en az
bağlantı **264**. Yani sıralı kural az sayıda özneyi çok, ötekiler bütün özneleri az
aşırıyor. **Kuyruk kalkmadı; acı herkese yayıldı.**

Bu iki okumadan hangisinin doğru olduğu ölçünün kararı değildir. Yirmi üç öznenin ağır
aşımı ile kırk öznenin hafif aşımı arasındaki seçim bir **politika** kararıdır: kırk özne
biraz yavaşlasın mı, yoksa on yedisi hiç etkilenmesin ve yirmi üçü ağır etkilensin mi?
Ölçüm bu soruyu yanıtlamaz, yalnız iki seçeneğin sayısını yan yana koyar.

Yükün toplam kapasitenin üstünde olduğu yerde bir alt sınır da vardır. Toplam kapasite
**2336**, yük **2600**; aradaki fark **264** birimdir ve yükün tamamını yerleştiren hiçbir
kural bunun altına inemez. En az bağlantı kuralının aşan birimi tam olarak **264**'tür —
yani bu kural, yerleştirilebilecek en iyi dağıtımı bulmuştur. Daha iyisi yoktur.

#### Aşım Sütununun Görmediği

O zaman kapasiteye göre dağıtımın **245**'i nedir? Alt sınırın altında bir sayı, ancak yükün
tamamı yerleştirilmediğinde çıkabilir.

Sağdaki **dağıtılmayan** sütunu bunu söylüyor. Oransal kural her özneye düşen payı tam sayıya
aşağı yuvarlıyor ve artan birimleri kimseye vermiyor: yük 2600'de **19** birim, 2000'de
**21**, 1200'de **20** birim hiçbir özneye ulaşmıyor. Bu birimler aşım sütununda da
görünmüyor, boşta kalan sütununda da — çünkü hiç dağıtılmadılar.

Sonuç şudur: kapasiteye göre dağıtımın aşım sütununu en iyi gösteren şey, kuralın
**yapmadığı iştir**. Ölçüm iki kuralı yan yana koyarken bu sütun olmasaydı, **245 < 264**
karşılaştırması yanlış bir sonuca götürürdü. **Dağıtılmayan birim de bir kuyruktur ve
kaldıracın aşım göstergesinde hiç görünmez.**

Aynı sütunun bir okuması daha var. Yük 1200'de sıralı dağıtım **6** özneyi aşırırken sistemde
**1160** birim boşta duruyor — toplam kapasitenin yarısı. Aşım ile boşluk aynı anda vardır.
**Yalnız aşımı sayan bir gösterge, kapasitenin yarısının kullanılmadığını göremez** ve
yalnız kullanımı sayan bir gösterge altı öznenin aştığını göremez. İki sütun ayrı ayrı
okunmak zorundadır.

#### En Az Bağlantının Göremediği

En az bağlantı kuralı ölçümün en iyi sonucunu verdi, ama bu sonuç iki koşula bağlıdır ve
ikisi de ölçümün dışındadır.

Birincisi maliyettir. Sıralı kural bir sayaç artırır, tutarlı karma bir karma hesaplar; en az
bağlantı her karar için kırk öznenin anlık durumunu karşılaştırır ve bunu gelen her iş için
yineler. Kararın kendisi bir işe dönüşür.

İkincisi ve daha ağır olanı şudur: **"en az" hangi kümede en az?** Ölçümdeki kural kırk
öznenin tamamını ve o ana kadar dağıtılmış her birimi görüyor. İşletmede dengeleyici çoğu
zaman tek değildir; aynı havuzun önünde birden çok dengeleyici durur ve her biri yalnız
**kendi** açtığı bağlantıları sayabilir. Her dengeleyici kendi görüşüne göre en az yüklü
özneyi seçer, hepsi aynı anda aynı özneyi seçer ve o özne, kimsenin göstergesinde
görünmeden aşar.

Bu, önceki dersin düz göstergesinin başka bir biçimidir. Orada kaldıraç **yanlış boyutu**
ölçüyordu; burada doğru boyutu **eksik kümede** ölçüyor. Tablodaki **264** birimlik en iyi
sonuç, kuralın kırk öznenin tamamını gördüğü varsayımına dayanır — `TY9`. Varsayım
düştüğünde sonuç da düşer ve düştüğünü söyleyen bir sütun tabloda yoktur.

#### Tutarlı Karmanın Ödediği Yer

Tutarlı karma satırları dağıtım açısından iyi değil: yük 1200'de **7** özne aşıyor,
sıralıdan bir fazla; 2600'de aşan birim **559**, sıralının **533**'ünün üstünde. Beklenen
bir sonuç, çünkü bu kural da kapasiteyi okumuyor ve üstüne karma dağılımının kendi
değişkenliğini ekliyor.

Kuralın ödediği yer alt tablodadır. Havuzdan tek bir özne çıkarıldığında sıralı kuralda
**1181** anahtar, en az bağlantı kuralında yine **1181** anahtar yer değiştiriyor — bin iki
yüzün neredeyse tamamı. Tutarlı karmada yer değiştiren anahtar sayısı **29** ve bu tam
olarak çıkarılan öznenin kendi payıdır. Kalan otuz dokuz öznenin anahtarları yerinde kalır.

Fark neden önemli? Çünkü bir anahtarın taşınması yalnız bir isteğin başka bir özneye gitmesi
demek değildir. Anahtara bağlı olarak o öznede biriktirilmiş ne varsa — oturum durumu,
ısıtılmış bir önbellek — yeni öznede yoktur. Sıralı kuralda bir öznenin havuzdan çıkması
kırk öznenin kırkında bu birikimi geçersiz kılar. **Tutarlı karma dağıtımı iyileştirmez;
üyelik değiştiğinde kuyruğun boyunu sınırlar.**

Bir özneyi havuzdan çıkarmak da bir kaldıraç hareketidir — hem de bu kursun en sık
çekilenlerinden biri, çünkü bakım, arıza ve sürüm değişimi hep buradan geçer. Kuralın
seçimi, o hareketin kırk özneden kaçını rahatsız edeceğini baştan belirler.

#### Özet

- Yük 1200'de sıralı dağıtım **6** özneyi **24** birimle aşırır, kapasiteye göre dağıtım ve
  en az bağlantı **hiçbirini**; kuralı iyileştirmek burada gerçekten kazandırır.
- Yük 2600'de aynı iki kural **kırk öznenin kırkını** aşırır, sıralı yalnız **23**'ünü; aşan
  birim sırasıyla **533**, **245** ve **264**'tür. Kuyruk kalkmadı, acı herkese yayıldı ve
  hangisinin doğru olduğu bir politika kararıdır.
- Toplam kapasite **2336**, yük **2600** olduğunda aşımın alt sınırı **264** birimdir; en az
  bağlantı kuralı tam bu sayıyı bulur ve daha iyisi yoktur.
- Kapasiteye göre dağıtımın **245**'i alt sınırın altındadır çünkü kural payları aşağı
  yuvarlar ve **19** birimi hiç dağıtmaz; dağıtılmayan birim aşım sütununda da boşta kalan
  sütununda da görünmez.
- Yük 1200'de altı özne aşarken sistemde **1160** birim boştadır; aşım ile boşluk aynı anda
  bulunur ve tek bir gösterge ikisini birden söylemez.
- Tutarlı karma dağıtımda sıralıdan iyi değildir, ama bir özne çıkarıldığında taşınan anahtar
  **1181** yerine **29**'dur — kuralın ödediği yer dağıtım değil, üyelik değişimidir.

#### Sonraki Adım

Bu iki derste dengeleyici hep aynı yerde durdu: kırk öznenin önünde, onların adına karar
vererek. Yükü kim gönderirse göndersin, kaldıraç öznelerin tarafındaydı ve amacı onları
korumaktı. Aynı aracı ters yöne çevrilebilir: istemcilerin önünde durup **onların adına**
karar verebilir. Sonraki ders bu iki duruşu — ters vekil ile ileri vekili — yan yana koyar
ve tek bir sayının, aynı sınırın, hangi tarafta durduğuna göre nasıl iki ayrı kuyruk
ürettiğini sayar.

### Ters Vekil ve İleri Vekil

Source: https://academia.sh/tr/kurslar/ag-isletimi/ters-vekil-ve-ileri-vekil

Aynı sınır sayısı iki vekilde iki ayrı kuyruk üretir; sınır 30'da ters vekil 6 özneyi korumaz ve 1160 birim boşta bırakır, ileri vekil aynı 1160 birimi kısılan meşru talep olarak sayar, üstelik kırk özneden 9'unu ve 430 birimi hiç göremediği için raporunda yalnız 993 birim görünür.

Önceki iki derste dengeleyici hep aynı yerde durdu: kırk öznenin önünde, onların adına karar
vererek. Yükü kim gönderirse göndersin kaldıraç öznelerin tarafındaydı ve amacı onları
korumaktı.

Aracı bu duruşa mahkûm değildir. Aynı düzenek ters yöne çevrilebilir: istemcilerin önünde
durup **onların adına** karar verebilir. Bu dersin sorusu vekilin ne yaptığı değil — **kimin
adına** yaptığı ve bu tercihin aynı sayıyı nasıl iki ayrı kuyruğa çevirdiğidir.

#### Aynı Aracı, İki Duruş

İkisi de **aracıdır (intermediary)**: isteği alır, kendi kararını uygular, karşı tarafa
iletir. Ayrım durdukları yerdedir.

**Ters vekil (reverse proxy)** öznelerin önünde durur. Dışarıdan bakan için tek adres odur;
arkasındaki kırk özne doğrudan görünmez. Sunucu tarafının onu koymasının nedenleri
sıralanabilir: isteği bir dağıtım kuralına sokmak, şifreli bağlantıyı burada sonlandırmak,
yanıtı saklamak ve arkadaki topolojiyi dışarıya kapatmak. Karar öznelerin adına alınır.
Özne bunu isteyip istemediği sorulmadan alınır — zaten kendi önündeki aracıyı seçen taraf o
değildir.

**İleri vekil (forward proxy)** istemcilerin önünde durur. Dışarıya çıkan her istek ondan
geçer; hedef tarafın gördüğü adres istemcinin değil vekilindir. İstemci tarafının onu
koymasının nedenleri de sıralanabilir: hangi hedeflere çıkılabileceğini sınırlamak, çıkan
isteği kaydetmek, sık istenen yanıtı saklamak ve istemciyi hedeften gizlemek. Karar
istemcilerin adına alınır.

Yük dengeleyici ile ters vekilin ilişkisi Sistem Tasarımı ve Dağıtık Sistemler
müfredatında ve Sunucu Tarafı Temelleri kursunda, ters vekilin üretim yapılandırması ise
Sunucu Güvenliği ve Üretime Alma kursunda ele alındı; o anlatı burada tekrarlanmıyor. Fark
tek cümledir: **orada vekilin rolü ve yapılandırması ölçüldü, burada tek bir sınır
sayısının kırk öznede bıraktığı kuyruk.**

Yapılandırma tarafında ikisi birbirine benzer ve tam da bu yüzden karıştırılır:

```text
# öğretilen yapılandırma dökümü, çalıştırılmamıştır

ters-vekil {
  dinle        *:443
  yukari-akis  ozne-01 ... ozne-40
  sinir        es-zamanli 30 / ozne
  amac         ozneyi korumak
}

ileri-vekil {
  dinle        ic-ag:3128
  cikis        her hedef
  sinir        hiz 30 / istemci
  amac         istemciyi sinirlamak ve gizlemek
}
```

İki dökümde de aynı sayı geçiyor. Ölçüm bu sayının ne yaptığını sorar.

#### Kaldıraç Tek Bir Sayıdır

Kaldıraç şudur: **bir sınır sayısı**, kırk özneye birden uygulanır. Ters vekilde bu sayı bir
**eşzamanlılık sınırı**dır — bir özneye aynı anda en çok bu kadar iş geçer. İleri vekilde bir
**hız sınırı**dır — bir istemci aynı anda en çok bu kadar iş çıkarabilir.

Neden kırk ayrı sınır yazılmadığı sorusu haklıdır ve yanıtı ölçünün dışındadır. Kırk ayrı
sayı yazılabilir; yazıldığı anda kırk ayrı bakım yükü doğar. Bir öznenin kapasitesi
değiştiğinde ona ait satırın da değişmesi gerekir; değişmezse sınır sessizce yanlışa döner ve
hiçbir gösterge bunu bildirmez. İşletmenin tek sayıya yönelmesi bir kolaycılık değil, bakım
maliyetinin doğrudan sonucudur — tek satır tek yerde durur ve kırk özneyi birden izler. Bu
kursun ölçtüğü kaldıraç–özne oranı da buradan doğar: tek satırın bedeli kuyruktur, kırk
satırın bedeli ise kırk satırın zamanla gerçekten kırk özneyi anlatmaz hâle gelmesidir.

Kuyruk her iki duruşta da vardır ama adı ve sahibi değişir.

Ters vekilde sınır **kapasitesinden büyük** olan özneyi korumaz: özne sınıra ulaşmadan kendi
kapasitesini aşar ve sınır hiç devreye girmez. Sınır **kapasitesinden küçük** olan özneyi ise
kapasitesinin altında tutar; aradaki fark kullanılmayan kapasitedir.

İleri vekilde aynı iki koşul tersine okunur. Talebi sınırın **üstünde** olan istemci kısılır
ve aradaki fark reddedilmiş meşru taleptir. Talebi sınırın **altında** kalan istemci
sınırdan hiç etkilenmez.

Bir fark daha var ve ölçümün en keskin sütununu o üretiyor. **Ters vekil atlatılmaz**: özneye
giden tek yol odur, kırk öznenin kırkı da önünden geçer. Bu, ölçümün varsayımı olduğu kadar
bir işletim koşuludur — öznenin adresi doğrudan erişilebilir kaldığında vekil aradan
çıkarılabilir ve ters vekilin verdiği bütün sözler o adresin kapalı tutulmasına dayanır.

**İleri vekil atlatılabilir**; istemcinin onu kullanması bir yapılandırma tercihidir ve kimi
özne doğrudan çıkacak biçimde ayarlanmıştır.

Ölçümün varsayımları:

- **TY14** — Kırk özne kursun sabit kümesidir ve değiştirilmez.
- **TY15** — Ters vekil kurgusunda özne bir sunucudur ve `kapasite` alanı onun karşılayabildiği
  iş miktarıdır — önceki iki dersteki okumanın aynısı.
- **TY16** — İleri vekil kurgusunda özne bir istemcidir ve `kapasite` alanı onun **meşru
  talebi** olarak okunur. **Küme değişmez, okuma değişir**; iki duruşun aynı sayılar üzerinde
  karşılaştırılabilmesinin koşulu budur.
- **TY17** — Sınır tek bir sayıdır ve özne başına uygulanır; öznelere ayrı ayrı sınır
  yazılmaz. Kaldıracın tekliği bu varsayımdadır.
- **TY18** — İleri vekili atlayan özneler kurgudaki `ozel` işaretli aygıtlardır. Atlama bir
  kusur değil, kayıtlı bir yapılandırma tercihidir; vekil onların trafiğini ne sınırlar ne
  görür.
- **TY19** — Ters vekil tek giriş noktasıdır; hiçbir özne onu atlayamaz.
- **TY20** — Ölçüm bir ağ ölçümü değildir; hiçbir bağlantı açılmaz. Sayılan şey sınırın kırk
  özne üzerindeki aritmetiğidir.

#### Ölçüm

```python
"""Ayni sinir, iki vekil: kimin adina karar verildigi kuyrugu degistirir."""
TOHUM = 20260812
SINIFLAR = ("etkilesim", "toplu", "yedek")


def uretec(tohum):
    d = tohum % 2147483646 + 1

    def r(n):
        nonlocal d
        d = (d * 48271) % 2147483647
        return d % n
    return r


def ozneler(sayi=40, tohum=TOHUM):
    r, liste = uretec(tohum), []
    for i in range(sayi):
        liste.append({"no": i + 1, "kapasite": 20 + r(81), "gecikme": 5 + r(45),
                      "sinif": SINIFLAR[r(3)], "ozel": r(9) == 0})
    return liste


def ters(oz, sinir):
    """Ozne sunucudur; sinir onun adina konur. Kuyruk: korunmayan ve bosta birakilan."""
    korunmayan = sum(1 for o in oz if o["kapasite"] < sinir)
    bosta = sum(max(0, o["kapasite"] - sinir) for o in oz)
    return korunmayan, bosta


def ileri(oz, sinir, gecen):
    """Ozne istemcidir; sinir onun adina konur. Kuyruk: kisilan ve hic gorunmeyen."""
    g = [o for o in oz if o["no"] in gecen]
    kisilan = sum(1 for o in g if o["kapasite"] > sinir)
    birim = sum(max(0, o["kapasite"] - sinir) for o in g)
    return kisilan, birim


oz = ozneler()
gecen = {o["no"] for o in oz if not o["ozel"]}
tum = {o["no"] for o in oz}
print(f"özne {len(oz)} | toplam talep {sum(o['kapasite'] for o in oz)} | "
      f"ileri vekilden geçen {len(gecen)} | vekili atlayan {len(oz) - len(gecen)} "
      f"({sum(o['kapasite'] for o in oz if o['ozel'])} birim)")
print()
print(f"{'sınır':>6s} | {'ters vekil':^22s} | {'ileri vekil (geçen 31)':^24s} | "
      f"{'kırkı da geçseydi':^27s}")
print(f"{'':>6s} | {'korunmayan':>10s} {'boşta':>11s} | "
      f"{'kısılan':>8s} {'kısılan birim':>15s} | {'kısılan':>8s} {'birim':>11s} "
      f"{'eşit':>5s}")
for sinir in (30, 45, 60, 75, 90):
    k, b = ters(oz, sinir)
    ki, bi = ileri(oz, sinir, gecen)
    kt, bt = ileri(oz, sinir, tum)
    print(f"{sinir:6d} | {k:10d} {b:11d} | {ki:8d} {bi:15d} | {kt:8d} {bt:11d} "
          f"{sum(1 for o in oz if o['kapasite'] == sinir):5d}")
print()
print(f"ters vekilden geçmeyen özne: {len(oz) - len(tum)} "
      f"(tek giriş noktasıdır, kırkı da geçer) | "
      f"ileri vekilin hiç görmediği özne: {len(oz) - len(gecen)}, "
      f"{sum(o['kapasite'] for o in oz if o['ozel'])} birim")
```

```
özne 40 | toplam talep 2336 | ileri vekilden geçen 31 | vekili atlayan 9 (430 birim)

 sınır |       ters vekil       |  ileri vekil (geçen 31)  |      kırkı da geçseydi     
       | korunmayan       boşta |  kısılan   kısılan birim |  kısılan       birim  eşit
    30 |          6        1160 |       27             993 |       33        1160     1
    45 |         12         711 |       23             620 |       28         711     0
    60 |         23         354 |       15             326 |       17         354     0
    75 |         29         128 |       10             125 |       11         128     0
    90 |         34          17 |        4              17 |        4          17     2

ters vekilden geçmeyen özne: 0 (tek giriş noktasıdır, kırkı da geçer) | ileri vekilin hiç görmediği özne: 9, 430 birim
```

#### Aynı Aritmetik, İki Ad

Tablonun en önemli özelliği iki sütununun **birebir aynı** olmasıdır. Ters vekilin "boşta"
sütunu **1160, 711, 354, 128, 17** okuyor; en sağdaki "kırkı da geçseydi" birim sütunu da
**1160, 711, 354, 128, 17**. Aynı sayılar, çünkü ikisi de aynı toplamdır: her öznenin
kapasitesi ile sınır arasındaki farkın pozitif kısmı.

Değişen tek şey o toplamın **adıdır**. Ters vekilde bu sayı, koruma uğruna kullanılmayan
kapasitedir: özne daha fazlasını karşılayabilirdi, sınır izin vermedi. İleri vekilde tam
aynı sayı, reddedilmiş meşru taleptir: istemci daha fazlasını isteyecekti, sınır izin
vermedi. **Ölçü değişmedi, kimin adına konduğu değişti.**

Bunun doğrudan bir sonucu var. Sınırı büyütmek ters vekilde **korumayı azaltır** —
korunmayan özne 30'da **6** iken 90'da **34**'e çıkar. Aynı hareket ileri vekilde
**kısıtlamayı azaltır** — kısılan özne 30'da **33** iken 90'da **4**'e iner. Kaldıracı aynı
yöne çevirmek iki duruşta zıt anlam taşır ve bir gösterge tablosunda ikisi aynı sayı olarak
görünür.

Pratikte bunun anlamı, sınırın doğru değerinin ölçümden çıkarılamamasıdır. Otuz mu doksan mı
sorusunun yanıtı, tablodaki hangi sütunun kabul edilebilir sayıldığına bağlıdır — ve o
kararı veren şey kaldıracın kendisi değil, kaldıracı kimin adına çektiğinizdir. İki tarafın
aynı sayı üzerinde anlaşamamasının nedeni de budur: birinin koruma dediği şey, ötekinin
reddedilmiş talebidir.

#### Tümleyen Kuyruk

İki kuyruk birbirinin tümleyenidir ve tabloda toplamları doğrulanabilir. Sınır 30'da
korunmayan **6**, kırkı da geçseydi kısılan **33**, sınıra tam eşit olan **1** özne var:
altı artı otuz üç artı bir, kırk eder. Sınır 90'da **34 + 4 + 2 = 40**. Aradaki üç satırda
eşit olan yok ve iki sütun doğrudan kırka tamamlanıyor: **12 + 28**, **23 + 17**, **29 + 11**.

Bunun anlamı şudur: kırk öznenin her biri, **her sınır değerinde**, iki kuyruktan tam olarak
birindedir. Sınırın altında kalan özne ters vekilde korunmuyordur; üstünde kalan özne ileri
vekilde kısılıyordur. Bir öznenin ikisinden birden kurtulduğu bir sınır değeri yoktur ve
kırkını birden kurtaran bir sayı hiç yoktur. Sınıra tam eşit olan özneler ise iki sütunda da
görünmez — kırk öznelik kümede bir ya da iki özne, yani ölçülebilen en küçük farkın
(**1/40 = 0,025**) bir ya da iki katı.

Tek sayılı bir kaldıracın yapabileceği tek şey, kırk özneyi bu iki kuyruk arasında bölmenin
**yerini** seçmektir. Bölmemek seçeneği kaldıracın elinde yoktur.

#### İleri Vekilin Göremediği

Son satır ikinci farkı veriyor. Ters vekil öznelere giden tek yol olduğu için kırkını birden
görür; atlayan **0**. İleri vekil ise kırk özneden yalnız **31**'inin trafiğini taşıyor:
**9** özne doğrudan çıkacak biçimde ayarlanmış ve **430** birimlik talebi vekile hiç
uğramıyor.

Bunun raporda karşılığı ortadaki sütunlardır. Sınır 30'da ileri vekilin kendi raporu
**993** birim kısıldığını söylüyor. Kırk öznenin tamamı vekilden geçseydi bu sayı **1160**
olacaktı. Aradaki **167** birim eksik değil — **hiç sayılmamış**. Vekilin raporunda ne
kısılmış olarak ne de serbest olarak görünüyor, çünkü o trafiğe hiç dokunulmadı.

Aynı boşluk kısılan özne sütununda da var: rapor **27** diyor, gerçek sayı **33**.
İstemci adına karar veren bir kaldıracın yapısal zayıflığı budur — **kararı uygulayabilmesi
için istemcinin ona uğramayı kabul etmesi gerekir.** Sunucu adına karar veren kaldıraç bu
onaya muhtaç değildir, çünkü kendisi zaten yolun üstündedir.

Dokuz öznenin atlamasının bir kusur olmadığını da eklemek gerekir; kayıtlı bir tercihtir ve
gerekçesi vardır. Kusur olan, **raporun bu dokuzu hiç anmamasıdır**: kapsam dışında kalanı
söylemeyen bir kapsam raporu, kapsadığı kadarını doğru saysa bile toplamı yanlış gösterir.

#### Vekilin Sildiği Ayrım

Adres gizlemenin karşı taraftaki karşılığı da bir kaldıraç sorunudur ve işletmede sık gözden
kaçar.

İleri vekilden geçen **31** özne, hedef tarafın gördüğü iletide **tek bir adres** olarak
görünür. Hedef taraf kendi kaldıracını — hız sınırını, eşzamanlılık sınırını, erişim
kuralını — o tek adrese uygular. Kırk öznenin otuz biri, karşı tarafın defterinde bir özneye
inmiştir. En yoğun istemciyi kısmak isteyen bir hedef otuz birini birden kısar; içlerinden
birini engellemek istediğinde otuz birini birden engeller. Bu kursun ölçtüğü oran — bir
kaldıraç, kaç özne — vekilin arkasında **ikinci kez** bozulur ve karşı taraf kaç özneye
dokunduğunu bilmez.

Ters vekilde aynı silme ters yöne çalışır. Dışarıdan bakan için arkadaki kırk özne tek
adrestir; hangi öznenin yanıt verdiği iletide yazmaz. Topolojiyi kapatmak zaten istenen
sonuçtur, ama yan etkisi ölçümü doğrudan vurur: bir yanıtın hangi özneden geldiği iletiden
çıkarılamaz. Bu bilgi ayrıca taşınmazsa kırk öznenin kuyruğu tek bir ortalamanın arkasına
düşer ve önceki iki dersteki tabloların hiçbiri kurulamaz.

İkisinin saklama yeteneği de aynı ayrımı taşır. Ters vekil öznelerin adına saklar: bir kez
üretilmiş yanıt birçok istemciye verilir. İleri vekil istemcilerin adına saklar: bir kez
alınmış yanıt birçok istemcinin aynı hedefe isteğine verilir. İki durumda da saklanan kopya
**kendisi için üretilmediği** bir isteğe gidebilir. Bu kararı yöneten kişiye özellik imi
Uygulama Katmanı Protokolleri kursunda ölçüldü ve burada tekrarlanmıyor; bu derste önemli
olan, saklama kararının da tek bir kaldıraç olduğu ve kırk özneye birden uygulandığıdır.

#### Özet

- Ters vekil öznelerin, ileri vekil istemcilerin adına karar verir; ikisi de aracıdır ve
  yapılandırmaları benzer, ayrım durdukları yerdedir.
- Tek bir sınır sayısı ters vekilde **korunmayan özne** ve **boşta bırakılan kapasite**,
  ileri vekilde **kısılan özne** ve **reddedilen meşru talep** üretir.
- Boşta bırakılan kapasite ile reddedilen talep **aynı toplamdır**: her iki sütun da
  **1160, 711, 354, 128, 17** okur; değişen yalnız sayının adıdır.
- İki kuyruk tümleyendir: her sınır değerinde korunmayan, kısılan ve sınıra eşit özneler
  kırka tamamlanır (**6 + 33 + 1**, **34 + 4 + 2**); hiçbir sayı kırkını birden kurtarmaz.
- Ters vekil ölçümde atlatılmaz ve kırkını görür; ileri vekili **9** özne atlar, **430** birim hiç
  uğramaz ve rapor **1160** yerine **993**, **33** yerine **27** gösterir.
- Vekil adres ayrımını da siler: ileri vekilin arkasındaki **31** özne hedef tarafta tek
  adrese iner ve karşı tarafın kaldıracı otuz birine birden dokunur; ters vekilin arkasında
  ise yanıtın hangi özneden geldiği iletide kalmaz.

#### Sonraki Adım

Bu üç derste kaldıraç hep tek bir noktada durdu: isteğin geçmek zorunda olduğu yerde. Ters
vekil öznelerin önünde, ileri vekil istemcilerin önünde, ama ikisi de **tek** bir yerde.
Sonraki ders bu noktayı çoğaltır: içerik istemciye yakın duran birçok kopyaya dağıtılırsa,
kaldıraç artık dağıtımı değil **neyin nerede duracağını** ayarlar. Ölçü de değişir — sorulan
şey kimin kısıldığı değil, **kenarın hangi özneyi hiç görmediğidir**: çekme modelinde ilk
isteğini bekleyen içerik, itme modelinde hiç istenmeyen içerik.

### İçerik Dağıtım Ağları

Source: https://academia.sh/tr/kurslar/ag-isletimi/icerik-dagitim-aglari

Çekme modelinde kenar yalnız istenmiş olanı taşır ve bedeli 33 ıskadır, itme modelinde ıska sıfırdır ama kenarda hiç istenmeyen 402 birim durur; kenara 800 birimlik sınır konduğunda çekme 245, popülerliği bilmeyen itme 379 ıska verir ve iki modelde de kenarın hiç görmediği nesne 25'e çıkar.

Önceki üç derste kaldıraç hep tek bir noktada durdu: isteğin geçmek zorunda olduğu yerde.
Ters vekil öznelerin önünde, ileri vekil istemcilerin önünde, ama ikisi de **tek** bir yerde
ve içeriğin tamamına erişimi olan bir yerde.

**İçerik dağıtım ağı (content delivery network)** bu noktayı çoğaltır: aynı içeriğin
kopyaları istemcilere yakın duran birçok **kenar önbelleğinde (edge cache)** tutulur ve istek
kaynak sunucuya kadar gitmez. Kaldıraç da değişir. Artık ayarlanan şey yükün nasıl
bölüneceği değil, **neyin nerede duracağıdır** — ve bu kaldıracın kuyruğu, kenarın hiç
görmediği içeriktir.

#### Kenarın Ölçtüğü Şey

Kenar önbelleğinin çalışma modelleri, hangi katmanların önbelleklenebileceği ve dağıtımın
tasarım kararları Sistem Tasarımı ve Dağıtık Sistemler müfredatının Trafik Katmanı
kursunda ele alındı; o tartışma burada tekrarlanmıyor. Fark tek cümledir: **orada dağıtım
modeli tasarım olarak karşılaştırıldı, burada tek bir yerleştirme kararının kırk nesnede
bıraktığı kuyruk sayılır.**

Bu dersin kurgusunda kırk özne birer **içerik nesnesidir**. Küme aynı kümedir; değişen tek
şey `kapasite` alanının okunuşudur — burada o alan nesnenin **boyutudur**. Kırk nesnenin
toplam boyutu, önceki derslerdeki toplam kapasiteyle aynı sayıdır.

Kenarın belirleyici özelliği **kaynak sunucudan küçük olmasıdır**. Küçük olmasaydı kenar
olmazdı; bütün içeriği taşıyan ikinci bir kaynak sunucu olurdu. Bu yüzden her kenar
önbelleği bir seçim yapmak zorundadır: kırk nesnenin hangileri orada duracak? Kaldıraç bu
seçimin kuralıdır ve iki temel biçimi vardır.

#### Çekme ve İtme

**Çekme (pull)** modelinde kenar boş başlar. Bir nesne ilk kez istendiğinde kenarda yoktur;
istek kaynak sunucuya gider, yanıt dönerken kenarda saklanır ve sonraki istekler oradan
karşılanır. Kenar hiçbir zaman istenmemiş bir nesneyi taşımaz — ama her nesnenin **ilk
isteği** kaçınılmaz olarak ıskalar.

**İtme (push)** modelinde içerik, istenmesi beklenmeden kenara yerleştirilir. İlk istek de
kenardan karşılanır ve ıska sıfırlanabilir. Karşılığında kenar, hiç istenmeyecek içeriği de
taşır ve onun için ayrılan yer başka bir şeye ayrılamaz.

Yapılandırma tarafında ikisi birkaç satırdır:

```text
# öğretilen yapılandırma dökümü, çalıştırılmamıştır

kenar {
  model      cekme
  kaynak     kaynak-sunucu
  saklama    ilk-istekte
  boyut      800 birim
  tahliye    en-az-kullanilan
}

kenar {
  model      itme
  kaynak     kaynak-sunucu
  yerlestir  yayim-aninda
  boyut      800 birim
  secim      nesne-sirasi
}
```

Son satır itme modelinin asıl sorusunu taşıyor: kenar bütün içeriği alamıyorsa **hangisini**
alacak? Çekme modeli bu soruyu sormaz, çünkü yanıtı istek akışından okur. İtme modeli
sormak zorundadır ve yanıtı **önceden** vermek zorundadır.

Ölçümün varsayımları:

- **TY21** — Kırk özne kursun sabit kümesidir. Bu derste her özne bir içerik nesnesidir ve
  `kapasite` alanı onun **boyutu** olarak okunur; küme değişmez, okuma değişir.
- **TY22** — İstek akışı altı yüz istekten oluşur ve popülerliği çarpıktır: az sayıda nesne
  isteklerin çoğunu alır, kuyruktaki nesneler hiç istenmez.
- **TY23** — **Popülerlik sırası nesne numarasından bağımsızdır.** Sıra ayrı bir tohumla
  karılır; böylece nesne numarasına göre seçim yapan bir itme kuralı popülerlik hakkında
  hiçbir bilgi taşımaz.
- **TY24** — Kenarda duran nesne için ıska yoktur; olmayan nesne için istek kaynak sunucuya
  gider ve bir ıska sayılır. Nesnelerin tazelik ömrü bu ölçümde sonsuzdur; saklanan kopya
  eskimez.
- **TY25** — Sınırlı kenarda tahliye kuralı **en az kullanılandır**: yer açmak gerektiğinde
  en uzun süredir istenmemiş nesne çıkarılır.
- **TY26** — Sınırlı itme, nesneleri **numara sırasına göre** seçer; bu, popülerliği
  bilmeyen bir yerleştirmenin en yalın biçimidir.
- **TY27** — Ölçüm bir ağ ölçümü değildir; hiçbir istek gönderilmez, hiçbir kenar kurulmaz.
  Sayılan şey kurgudaki yerleştirmenin kendisidir.

#### Ölçüm

```python
"""Kenar onbellegi: cekme ilk istegi bekler, itme hic istenmeyeni tasir."""
TOHUM = 20260812
SINIFLAR = ("etkilesim", "toplu", "yedek")
KENAR = 800


def uretec(tohum):
    d = tohum % 2147483646 + 1

    def r(n):
        nonlocal d
        d = (d * 48271) % 2147483647
        return d % n
    return r


def ozneler(sayi=40, tohum=TOHUM):
    r, liste = uretec(tohum), []
    for i in range(sayi):
        liste.append({"no": i + 1, "kapasite": 20 + r(81), "gecikme": 5 + r(45),
                      "sinif": SINIFLAR[r(3)], "ozel": r(9) == 0})
    return liste


def populerlik(oz, tohum=TOHUM + 17):
    """Populerlik sirasi nesne numarasindan bagimsizdir."""
    r, sira = uretec(tohum), [o["no"] for o in oz]
    for i in range(len(sira) - 1, 0, -1):
        j = r(i + 1)
        sira[i], sira[j] = sira[j], sira[i]
    return sira


def istekler(oz, sayi=600, tohum=TOHUM + 23):
    """Populerligi carpik istek akisi: kuyrukta hic istenmeyen nesneler kalir."""
    r, sira, liste = uretec(tohum), populerlik(oz), []
    for _ in range(sayi):
        liste.append(sira[min(r(len(oz)), r(len(oz)), r(len(oz)))])
    return liste


def cekme(oz, ist, sinir):
    """Nesne ilk istendiginde kenara girer; sinir varsa en eski kullanilan cikar."""
    boy = {o["no"]: o["kapasite"] for o in oz}
    kenar, kullanim, iska = [], 0, 0
    for n in ist:
        if n in kenar:
            kenar.remove(n)
            kenar.append(n)
            continue
        iska += 1
        if sinir is not None:
            while kullanim + boy[n] > sinir and kenar:
                kullanim -= boy[kenar.pop(0)]
            if kullanim + boy[n] > sinir:
                continue
        kenar.append(n)
        kullanim += boy[n]
    return set(kenar), kullanim, iska


def itme(oz, ist, sinir):
    """Kirk nesne onceden itilir; sinir varsa numara sirasina gore secilir."""
    boy, kenar, kullanim = {o["no"]: o["kapasite"] for o in oz}, set(), 0
    for o in oz:
        if sinir is None or kullanim + o["kapasite"] <= sinir:
            kenar.add(o["no"])
            kullanim += o["kapasite"]
    return kenar, kullanim, sum(1 for n in ist if n not in kenar)


oz = ozneler()
ist = istekler(oz)
boy = {o["no"]: o["kapasite"] for o in oz}
istenen = set(ist)
print(f"nesne {len(oz)} | toplam boyut {sum(boy.values())} | kenar sınırı {KENAR} birim")
print(f"istek {len(ist)} | istenen nesne {len(istenen)} | "
      f"hiç istenmeyen {len(oz) - len(istenen)} "
      f"({sum(boy[o['no']] for o in oz if o['no'] not in istenen)} birim)")
print()
print(f"{'model':<22s} {'kenardaki':>10s} {'kullanılan':>11s} {'ıska':>6s} "
      f"{'isabet':>7s} {'kenarın görmediği':>18s} {'boşa duran':>11s}")
for ad, kenar, kullanim, iska in (
        ("çekme, sınırsız", *cekme(oz, ist, None)),
        ("çekme, sınırlı", *cekme(oz, ist, KENAR)),
        ("itme, sınırsız", *itme(oz, ist, None)),
        ("itme, sınırlı", *itme(oz, ist, KENAR))):
    print(f"{ad:<22s} {len(kenar):10d} {kullanim:11d} {iska:6d} {len(ist) - iska:7d} "
          f"{len(oz) - len(kenar):18d} "
          f"{sum(boy[n] for n in kenar if n not in istenen):11d}")
```

```
nesne 40 | toplam boyut 2336 | kenar sınırı 800 birim
istek 600 | istenen nesne 33 | hiç istenmeyen 7 (402 birim)

model                   kenardaki  kullanılan   ıska  isabet  kenarın görmediği  boşa duran
çekme, sınırsız                33        1934     33     567                  7           0
çekme, sınırlı                 15         788    245     355                 25           0
itme, sınırsız                 40        2336      0     600                  0         402
itme, sınırlı                  15         798    379     221                 25          30
```

#### İlk İsteğin Bedeli

Çekme modelinin sınırsız satırı, modelin saf hâlini gösteriyor. Altı yüz isteğin **33**'ü
ıskalıyor ve bu sayı bir tesadüf değil: istenen nesne sayısı da **33**. Çekme modelinde her
nesne **tam olarak bir kez** ıskalar — ilk istendiğinde. Geri kalan **567** istek kenardan
karşılanıyor.

Bu modelin kuyruğu bu yüzden çok belirli bir kuyruktur: **her nesnenin ilk isteyeni.** O
istek kaynak sunucuya kadar gider, en uzun gecikmeyi görür ve bir sonraki isteyen için yolu
açar. Kuyrukta olmak burada bir kusur değil, modelin çalışma biçimidir; ama kuyrukta olanın
kim olduğu önemlidir.

Bu kuyruk eşit dağılmaz. Popüler bir nesnede tek ıska yüzlerce isabetin arasında kaybolur ve
o nesneyi isteyenlerin neredeyse hiçbiri bedeli ödemez. Nadiren istenen bir nesnede ise
**her** isteyen pratikte ilk isteyendir: iki istek arasındaki süre saklamanın ömründen
uzunsa, kopya her seferinde yeniden getirilir. Yani çekme modelinin bedelini asıl ödeyen,
zaten en az hizmet alan azınlıktır — ve toplam isabet oranına bakan bir gösterge bu azınlığı
hiç göstermez, çünkü **567** isabetin yanında **33** ıska iyi bir orandır.

Sağdaki sütun ikinci sayıyı veriyor: kenarın hiç görmediği nesne **7**. Kırk nesnenin
yedisi altı yüz istek boyunca bir kez bile istenmedi ve çekme modeli onları kenara hiç
almadı. Bu, modelin kendi ölçüsüne göre kusursuz bir davranıştır — boşa duran birim **0**.
Kenarda ne varsa istenmiştir.

#### Hiç İstenmeyenin Bedeli

İtme modelinin sınırsız satırı, çekmenin ödediği bedeli sıfırlıyor: ıska **0**, altı yüz
isteğin altı yüzü kenardan karşılanıyor. İlk isteyen diye bir kuyruk kalmıyor.

Bedel sağdaki sütunda duruyor. Kenar **2336** birimin tamamını taşıyor, ama bunun **402**
birimi hiç istenmeyen yedi nesneye ait. Kenar alanının yaklaşık altıda biri, altı yüz istek
boyunca bir kez bile okunmayan içerikle dolu.

İki modelin kuyruğu bu yüzden birbirinin tersidir. Çekmenin kuyruğu **zamandadır**: nesne
kenara girene kadar geçen ilk istek. İtmenin kuyruğu **yerdedir**: kenarda duran ama hiç
okunmayan içerik. Birini sıfırlayan model ötekini büyütür ve ikisini birden sıfırlayan bir
model yoktur — çünkü neyin isteneceğini önceden bilmenin yolu yoktur.

#### Sınır Konduğunda

Üstteki iki satır kenarın sınırsız olduğunu varsayıyordu ve bu varsayım kenarın tanımına
aykırıdır. Alt satırlar **800** birimlik gerçekçi bir sınırla aynı ölçümü yineliyor.

Çekme modelinde ıska **33**'ten **245**'e çıkıyor. Sebep tahliyedir: kenar dolduğunda en az
kullanılan nesne çıkarılır ve çıkarılan nesne yeniden istendiğinde yeniden ıskalar. Artık
"her nesne bir kez ıskalar" kuralı geçerli değil; bir nesne kenara girip çıktığı kadar
ıskalar. Kenarın hiç görmediği nesne de **7**'den **25**'e çıkıyor — çünkü kenarda hiç yer
bulamayan nesneler var.

İtme modelinde aynı sınır daha ağır ödetiyor: ıska **379**. Altı yüz isteğin yarısından
fazlası kaynak sunucuya gidiyor. Sebep açıktır ve `TY23` ile `TY26` tam olarak bunu ölçmek
için konmuştu: itme kuralı nesneleri numara sırasına göre seçiyor, numara sırası ise
popülerlikle ilgisiz. Kenar **798** birim doluyor, kırkta **15** nesne taşıyor — çekmeyle
neredeyse aynı doluluk — ama **yanlış on beş nesneyi** taşıyor.

Üstüne, sınırlı itme hâlâ **30** birimlik hiç istenmeyen içerik taşıyor. Yer kıtken bile
kaldıraç, kıt yerin bir kısmını kimsenin istemediği şeye ayırıyor.

Buradaki asıl ders yerleştirme kuralının kendisiyle ilgilidir. **İtme modeli bir tahmin
gerektirir ve tahminin yanlışlığı ölçülmedikçe görünmez.** Çekme modeli tahmin gerektirmez;
karşılığında her yeni nesne için bir ıska öder ve bu bedel her zaman görünür. Kırk nesnelik
bir kümede ölçülebilen en küçük fark **1/40 = 0,025**'tir; **245** ile **379** arasındaki
fark bunun çok üstündedir ve iki modelin sıralaması bu kümeyle savunulabilir.

#### Kenar Tek Değildir

Ölçüm tek bir kenar önbelleği modelledi ve bu, içerik dağıtım ağının tanımına aykırıdır: ağ,
kenarı çoğalttığı için ağdır. Çoğalmanın iki modele etkisi de doğrudandır.

Çekme modelinde ilk isteğin bedeli **kenar başına** ödenir. Her kenar kendi ilk isteğini
kendisi ıskalar, çünkü bir kenarın sakladığı kopya öteki kenarda yoktur. Ölçümdeki **33**
ıska tek bir kenarın soğuk başlangıcıdır; kenar sayısı arttıkça bu bedel onunla birlikte
çarpılır. Aynı nesneyi isteyen iki istemci ayrı kenarlara düşerse ikisi de ilk isteyendir.

Bu, çekme modelinin en sık gözden kaçan maliyetidir: kenar eklemek istemcinin gördüğü
gecikmeyi düşürür ama kaynak sunucuya düşen ıska sayısını **artırır**. Kenar sayısını
artırmak kuyruğu kaldırmaz, çoğaltır — önceki derslerdeki örüntünün aynısı.

İtme modelinde çarpım yerde görünür. Hiç istenmeyen **402** birim her kenarda ayrı ayrı
durur; kırk nesneyi çok sayıda kenara itmek, kimsenin istemediği içeriği de o kadar kez
taşımak demektir.

Aradaki dengeyi kuran ara biçim, kenarların kaynak sunucudan değil birbirinden ya da ortak
bir üst katmandan çekmesidir. İlk isteyen yine ıskalar, ama ıska kaynak sunucuya değil daha
yakın bir kopyaya gider. Kaldıraç yine tektir: hangi kenarın kimden çekeceği tek bir kuralla
yazılır ve kırk nesnenin kırkına birden uygulanır.

#### Saklananın Eskimesi

`TY24` ölçümde saklanan kopyanın eskimediğini varsaydı ve bu varsayımın gerçek olmadığını
söylemek gerekir. İçerik değişirse kenardaki kopya yanlışa döner ve kenar bunu kendiliğinden
bilmez.

Bunu kapatan şey üçüncü bir kaldıraçtır: **geçersiz kılma**. İçerik değiştiğinde
kenarlardaki kopyalarının düşürülmesi gerekir ve bu da tek bir karardır — hangi nesnelerin,
hangi kenarlarda düşürüleceği tek bir kuralla yazılır.

Kuyruğu iki uçludur ve artık tanıdıktır. Kural dar yazılırsa değişmiş içeriğin eski kopyası
kenarda kalır ve **her** isteyene yanlış yanıt verilir; üstelik böyle bir kopya, ona
bakılmadığı sürece hiçbir belirti vermez. Kural geniş yazılırsa — örneğin her yayımda kenarın
tamamı düşürülürse — hiç değişmemiş nesneler de kenardan çıkar ve çekme modelinin ilk istek
bedeli baştan ödenir. Ölçümdeki **33** ıska, geniş bir geçersiz kılma kuralında her yayımda
yeniden doğar; sınırlı kenardaki **245** ise tahliye ile geçersiz kılmanın üst üste
binmesiyle daha da büyür.

Tazelik ömrü, doğrulayıcı alanlar ve önbellek direktiflerinin kendisi Sunucu Tarafı ve
Uygulama Katmanı Protokolleri kurslarında ölçüldü; burada tekrarlanmıyor. Bu dersin
ekseninde önemli olan, geçersiz kılmanın da **tek karar, çok özne** biçiminde olması ve
kuyruğunun iki ucunun birlikte kapanmamasıdır.

#### Özet

- İçerik dağıtım ağı kaldıracı yükü değil **yerleştirmeyi** ayarlar: kırk nesneden
  hangilerinin kenarda duracağını. Kuyruk, kenarın hiç görmediği içeriktir.
- Çekme modelinde her nesne tam bir kez ıskalar: **33** istenen nesne, **33** ıska, **567**
  isabet, boşa duran birim **0**; kenar yalnız istenmiş olanı taşır.
- İtme modelinde ıska **0**'dır ama kenarda hiç istenmeyen **402** birim durur; iki modelin
  kuyruğu birbirinin tersidir — biri zamanda, öteki yerde.
- **800** birimlik sınır çekmede ıskayı **33**'ten **245**'e çıkarır; tahliye edilen nesne
  yeniden istendiğinde yeniden ıskalar ve kenarın hiç görmediği nesne **7**'den **25**'e
  çıkar.
- Aynı sınırda popülerliği bilmeyen itme **379** ıska verir: **798** birimle çekmeyle aynı
  kadar dolu, ama yanlış **15** nesneyle dolu ve üstüne **30** birimi hiç istenmeyen içerik.
- İtme bir tahmin gerektirir ve tahminin yanlışlığı ölçülmedikçe görünmez; çekme tahmin
  gerektirmez ve bedelini her zaman görünür biçimde öder.

#### Sonraki Adım

Bu derse kadarki dört kaldıraç da tek bir soruyu farklı biçimlerde sordu: iş **nereye**
gitsin? Dengeleyici özneye, vekil kime ait olduğuna, kenar hangi kopyaya. Hiçbiri işlerin
birbirinden **farklı önemde** olabileceğini hesaba katmadı; kırk özne de aynı sırada
bekliyordu. Sonraki ders bu varsayımı kaldırır: trafik sınıflara ayrılır, bir sınıf öne
alınır ve öteki bekletilir. Ölçü de doğrudan bunu sorar — bir sınıfın kazandığı gecikme
**kimin kuyruğundan** alınmıştır ve iki sayı her zaman birlikte yazılır.

### Hizmet Kalitesi

Source: https://academia.sh/tr/kurslar/ag-isletimi/hizmet-kalitesi

Üç sıralama kuralı aynı kırk öznede koşturulur ve karşılanamayan 433 birim üçünde de aynı kalır; katı öncelik etkileşim sınıfının beklemesini 1,13 turdan 0,00'a indirirken yedek sınıfını 1,28'den 5,76 tura ve 433 birimlik kuyruğa gönderir, genel ortalama ise 1,19'dan 0,40'a inerek iyileşme gösterir.

Buraya kadarki dört kaldıraç aynı soruyu farklı biçimlerde sordu: iş **nereye** gitsin?
Dengeleyici hangi özneye, vekil kimin adına, kenar hangi kopyaya. Hiçbiri işlerin birbirinden
**farklı önemde** olabileceğini hesaba katmadı; kırk özne de aynı sırada bekliyordu.

**Hizmet kalitesi (quality of service)** bu varsayımı kaldırır. Trafik sınıflara ayrılır, bir
sınıf öne alınır, öteki bekletilir. Kaldıraç artık işin yerini değil **sırasını** ayarlar. Ve
sıra, kapasitenin yetmediği bir hatta, sıfır toplamlı bir şeydir: bir sınıfın kazandığı
gecikme başka bir sınıfın kuyruğundan alınır. Bu dersin kuralı, o iki sayının **her zaman
birlikte** yazılmasıdır.

#### Üç Adım

Hizmet kalitesi tek bir düzenek değil, birbirini izleyen üç adımdır.

**Sınıflandırma**, gelen her birime bir sınıf etiketi verir. Etiket iletinin bir alanından,
bağlantı noktasından, gelen arayüzden ya da önceden konmuş bir imden okunabilir. Bu adım bir
karar vermez; yalnız kimin hangi kümede olduğunu söyler.

**Önceliklendirme**, sınıflar arasında bir sıra kurar. Hat boşaldığında hangi sınıfın
kuyruğundan alınacağını belirler. Kapasite talebin üstündeyse bu adımın hiçbir etkisi yoktur;
etkisi yalnız sıkışıklıkta görünür.

**Şekillendirme**, bir sınıfın alabileceği payı yukarıdan sınırlar. Önceliklendirmeden farkı
şudur: öncelik bir sınıfa **ne zaman** hizmet verileceğini söyler, şekillendirme **en çok ne
kadar** alabileceğini. İkisi birlikte kullanıldığında bir sınıf hem öncelikli hem sınırlı
olabilir — öne geçer ama hattı tümüyle yutamaz.

Üç adımın hiçbiri kapasite yaratmaz ve bu, hizmet kalitesinin en sık yanlış anlaşılan
yanıdır. Hat talebi karşılıyorsa üç adım da hiçbir şey yapmaz. Kuralların etkisi yalnız
**darboğazda** görünür; bu yüzden hizmet kalitesi kuralı trafiğin geçtiği her noktaya değil,
kapasitenin yetmediği noktaya yazılır. Başka bir yere yazılan kural yapılandırmada durur,
ölçümde hiç görünmez ve yanlış bir güven verir.

Yapılandırma tarafında üçü de aynı yerde durur:

```text
# öğretilen kural sözdizimi, çalıştırılmamıştır

siniflandir {
  etkilesim  im = ivedi
  toplu      im = toplu
  yedek      kalan
}

sirala {
  kural      kati-oncelik
  sira       etkilesim, toplu, yedek
}

sekillendir {
  etkilesim  en-cok %45
  toplu      en-cok %40
  yedek      en-cok %15
  artan      paylastir
}
```

#### Sınıflandırmanın Kendi Kuyruğu

Ölçüme geçmeden önce bir uyarı gerekir. Aşağıdaki kurgu sınıfları **doğru bilir**: kırk
öznenin sınıfı kurgunun kendisinden gelir ve kâhin odur. İşletmede böyle değildir.

Sınıflandırıcı da bir kaldıraçtır ve kendi kuyruğu vardır. Etiketi iletide yazana bakarak
verir; yazanı doğrulayan bir şey yoktur — Uygulama Katmanı Protokolleri kursunun bıraktığı
gözlem burada da geçerlidir. Bir birim yanlış sınıflandırıldığında sonraki iki adım
**kusursuz çalışarak** yanlış sonucu üretir: öncelik kuralı doğru uygulanır, şekillendirme
doğru uygulanır, ama yanlış özneye. Ve bu, sonucun kendisinde bir belirti bırakmaz.

Kuyruğun iki ucu buradadır. Sınıflandırma dar yazılırsa gerçekten ivedi olan trafik kalan
sınıfına düşer ve öncelikten hiç yararlanamaz. Geniş yazılırsa ivedi sınıfı şişer;
önceliklendirmenin anlamı, ayırdığı kümenin küçük kalmasına bağlıdır. Herkesin öncelikli
olduğu bir sıralama, sıralamanın olmadığı durumla aynıdır.

Ölçümün varsayımları:

- **TY28** — Kırk özne kursun sabit kümesidir; her öznenin sınıfı kurgudan gelir ve
  **sınıflandırma kusursuz kabul edilir**. Ölçülen şey sıralamanın sonucudur, etiketin
  doğruluğu değil.
- **TY29** — Yirmi tur koşturulur. Her turda her özne değişken bir talep üretir; talep
  büyüklüğü öznenin kapasitesine bağlıdır.
- **TY30** — Hat her turda **150** birim taşır. Toplam talep bu kapasitenin üstündedir;
  **karşılanamayacak birim sayısı kuraldan bağımsız olarak sabittir.**
- **TY31** — Bekleme, bir birimin geldiği tur ile hizmet aldığı tur arasındaki farktır ve tur
  cinsinden sayılır. Aynı turda hizmet alan birimin beklemesi sıfırdır.
- **TY32** — Sınıfsız kuralda tek bir kuyruk vardır ve birimler geliş sırasına göre hizmet
  alır. Katı öncelikte üst sınıfın kuyruğu boşalmadan alt sınıfa geçilmez.
- **TY33** — Şekillendirmede her sınıfa tur başına bir tavan ayrılır; tavanlardan artan
  kapasite ikinci geçişte sırayla dağıtılır, yani hat boş kalmaz.
- **TY34** — Ölçüm bir ağ ölçümü değildir; hiçbir paket gönderilmez. Sayılan şey kurgudaki
  sıralamanın kendisidir.

#### Ölçüm

```python
"""Hizmet kalitesi: bir sinifin kazandigi gecikme baska bir sinifin kuyrugudur."""
TOHUM = 20260812
SINIFLAR = ("etkilesim", "toplu", "yedek")
TUR, HAT = 20, 150
PAY = {"etkilesim": 45, "toplu": 40, "yedek": 15}


def uretec(tohum):
    d = tohum % 2147483646 + 1

    def r(n):
        nonlocal d
        d = (d * 48271) % 2147483647
        return d % n
    return r


def ozneler(sayi=40, tohum=TOHUM):
    r, liste = uretec(tohum), []
    for i in range(sayi):
        liste.append({"no": i + 1, "kapasite": 20 + r(81), "gecikme": 5 + r(45),
                      "sinif": SINIFLAR[r(3)], "ozel": r(9) == 0})
    return liste


def talepler(oz, tohum=TOHUM + 31):
    """Her turda her ozne degisken bir talep uretir."""
    r, akis = uretec(tohum), []
    for _ in range(TUR):
        tur = []
        for o in oz:
            for _ in range(1 + r(o["kapasite"] // 8 + 1)):
                tur.append(o)
        akis.append(tur)
    return akis


def kosu(oz, akis, kural):
    """Tek bir siralama kurali kirk oznenin birimlerini hatta sokar."""
    kuyruk = {s: [] for s in SINIFLAR}
    bekleme = {s: [] for s in SINIFLAR}
    hizmet = {o["no"]: 0 for o in oz}
    ortak = []

    def gecir(liste, sinir):
        n = 0
        while n < sinir and liste:
            gelis, o = liste.pop(0)
            bekleme[o["sinif"]].append(t - gelis)
            hizmet[o["no"]] += 1
            n += 1
        return n

    for t in range(TUR):
        for o in akis[t]:
            (ortak if kural == "sinifsiz" else kuyruk[o["sinif"]]).append((t, o))
        kalan = HAT
        if kural == "sinifsiz":
            kalan -= gecir(ortak, kalan)
        elif kural == "kati oncelik":
            for s in SINIFLAR:
                kalan -= gecir(kuyruk[s], kalan)
        else:
            for s in SINIFLAR:
                kalan -= gecir(kuyruk[s], min(HAT * PAY[s] // 100, kalan))
            for s in SINIFLAR:
                kalan -= gecir(kuyruk[s], kalan)
    for gelis, o in ortak:
        kuyruk[o["sinif"]].append((gelis, o))
    return kuyruk, bekleme, hizmet


oz = ozneler()
akis = talepler(oz)
print(f"tur {TUR} | hat kapasitesi {HAT}/tur, toplam {TUR * HAT} birim | "
      f"toplam talep {sum(len(t) for t in akis)} | "
      f"karşılanamayacak {sum(len(t) for t in akis) - TUR * HAT}")
for s in SINIFLAR:
    print(f"  {s:10s} özne {sum(1 for o in oz if o['sinif'] == s):2d} "
          f"talep {sum(1 for t in akis for o in t if o['sinif'] == s):5d}")
print()
print(f"{'kural':<15s} {'sınıf':<11s} {'hizmet':>7s} {'ort. bekleme':>13s} "
      f"{'en uzun':>8s} {'kuyrukta':>9s} {'kuyruklu özne':>14s}")
for kural in ("sinifsiz", "kati oncelik", "sekillendirme"):
    kuyruk, bekleme, hizmet = kosu(oz, akis, kural)
    for s in SINIFLAR:
        b = bekleme[s]
        print(f"{kural:<15s} {s:<11s} {len(b):7d} "
              f"{sum(b) / len(b) if b else 0:13.2f} {max(b) if b else 0:8d} "
              f"{len(kuyruk[s]):9d} "
              f"{len({o['no'] for _, o in kuyruk[s]}):14d}")
    tum = [x for s in SINIFLAR for x in bekleme[s]]
    print(f"{'':<15s} {'-- genel':<11s} {len(tum):7d} "
          f"{sum(tum) / len(tum):13.2f} {max(tum):8d} "
          f"{sum(len(kuyruk[s]) for s in SINIFLAR):9d} "
          f"{len({o['no'] for s in SINIFLAR for _, o in kuyruk[s]}):14d}")
```

```
tur 20 | hat kapasitesi 150/tur, toplam 3000 birim | toplam talep 3433 | karşılanamayacak 433
  etkilesim  özne 11 talep   829
  toplu      özne 20 talep  1974
  yedek      özne  9 talep   630

kural           sınıf        hizmet  ort. bekleme  en uzun  kuyrukta  kuyruklu özne
sinifsiz        etkilesim       714          1.13        3       115             11
sinifsiz        toplu          1736          1.19        3       238             20
sinifsiz        yedek           550          1.28        3        80              9
                -- genel       3000          1.19        3       433             40
kati oncelik    etkilesim       829          0.00        0         0              0
kati oncelik    toplu          1974          0.03        1         0              0
kati oncelik    yedek           197          5.76       13       433              9
                -- genel       3000          0.40       13       433              9
sekillendirme   etkilesim       829          0.00        0         0              0
sekillendirme   toplu          1731          1.14        3       243             20
sekillendirme   yedek           440          2.85        7       190              9
                -- genel       3000          1.08        7       433             29
```

#### Kimden Alındı

Tablonun okunması gereken ilk sütunu en sağdaki değil, üç `-- genel` satırının **kuyrukta**
değeridir. Üçü de **433**. Toplam talep **3433**, hat yirmi turda **3000** birim taşıyor ve
aradaki fark hiçbir kuralla kapanmıyor.

Bu, kursun ikinci iddiasının bu konudaki son biçimidir. **Sıralama kuralı karşılanamayan
birimi yok etmez; kimin taşıyacağını seçer.** Üç kuralın hiçbiri hattı büyütmedi, hiçbiri
talebi küçültmedi; yalnız aynı 433 birimi farklı öznelerin üstüne dağıttılar.

Dağıtımın kendisi doğrudan okunuyor. Sınıfsız kuralda kuyruk üçe bölünmüş: etkileşim **115**,
toplu **238**, yedek **80**. Katı önceliğe geçildiğinde etkileşimin **115**'i ve toplunun
**238**'i sıfırlanıyor, ikisi de yedek sınıfının üstüne biniyor: **80 + 115 + 238 = 433**.
Yedek sınıfının kuyruğu **80**'den **433**'e çıkıyor ve o sınıfın **630** birimlik talebinin
yalnız **197**'si hizmet alıyor.

Beklemede aynı hesap tur cinsinden görünüyor. Etkileşim sınıfının ortalama beklemesi
**1,13** turdan **0,00**'a iniyor — hiçbir birimi hiç beklemiyor, en uzun beklemesi de
**0**. Kazanç tam **1,13** turdur. Aynı hareketle yedek sınıfının ortalama beklemesi
**1,28**'den **5,76** tura, en uzun beklemesi **3**'ten **13** tura çıkıyor. **Etkileşimin
kazandığı 1,13 tur, yedeğin ödediği 4,48 turdur.** İki sayı ayrı ayrı yazıldığında ikisi de
doğrudur; yalnız biri yazıldığında kural ya kusursuz ya da felaket görünür.

Şekillendirme satırları ara noktayı veriyor ve tam olarak bir ara nokta olduğunu gösteriyor.
Etkileşim yine **0,00** bekliyor — yani üst sınıfın kazancı korunuyor. Ama yedeğin bekleme
süresi **5,76** yerine **2,85**, kuyruğu **433** yerine **190**. Fark, toplu sınıfının
üstlendiği paydadır: onun kuyruğu **238**'den **243**'e çıkmış ve beklemesi **1,19**'dan
**1,14**'e inmiş. Aynı 433 birim, bu kez **243 + 190** biçiminde bölünüyor.

Şekillendirmenin yaptığı şey, katı önceliğin tek bir sınıfa yıktığı yükü iki sınıfa
paylaştırmaktır. Kuyruğu kaldırmıyor; **kuyruğun kimde biriktiğini** ayarlıyor — kursun
başından beri her kaldıraçta çıkan sonucun aynısı.

#### Bekletmek ile Atmak

Ölçümdeki şekillendirme, sınırı aşan birimi **bekletti**: birim kuyrukta kaldı ve sırası
gelince hizmet aldı. Bu, iki seçenekten yalnız biridir. İkincisi, sınırı aşan birimi
**atmaktır** — bu kursta ona **atarak sınırlama (policing)** denir. Kaldıraç aynı kaldıraç,
tavan aynı tavan; değişen tek şey tavanın üstündeki birime ne olduğudur.

Ayrımın kuyruğa etkisi doğrudandır. Bekleten kural, karşılanamayan **433** birimi kuyrukta
tutar; bu birimler geç de olsa hizmet alır ve tabloda bekleme süresi olarak görünür. Atan
kural onları hiç göstermez: kuyruk sütunu **0** okur, bekleme süreleri düşer, gösterge
temizlenir. Kaybolan birimler ise hiçbir sütunda yoktur.

Üstelik atmak, atılan birimi ortadan kaldırmayabilir. Üst katman kaybı fark edip yeniden
gönderirse aynı iş hatta **ikinci kez** gelir — bu kez daha geç ve ek yükle. Ağ Modelleri
ve Protokoller kursunun Taşıma Katmanı konusunda ölçülen yeniden iletim davranışı burada
bir işletme sorunu hâline gelir: sınırı atarak uygulamak, talebi azaltmak yerine
artırabilir.

Ters yönde de bir sınır vardır. Bekletmek her zaman daha iyi görünse de kuyruğun kendisi bir
maliyettir. Kuyruk derinleştikçe bekleme büyür ve derin bir ortak kuyrukta ivedi bir birim
kendisinden önce gelmiş çok sayıda toplu birimin arkasında oturur. Ölçümdeki sınıfsız kural
tam olarak bu durumdur: etkileşim sınıfının **1,13** turluk beklemesi, kendi trafiğinden
değil, **önündeki başka sınıfların birimlerinden** gelir. Sınıflandırmanın var olma nedeni
de budur — kuyruğu bölmeden, kuyruğun derinliği herkese aynı bedeli ödetir.

#### Genel Ortalamanın Söylemediği

Son okuma `-- genel` satırlarındadır ve bir gösterge tablosu tuzağıdır.

Genel ortalama bekleme sınıfsız kuralda **1,19** tur, katı öncelikte **0,40** tur. Yalnız bu
sayıya bakan bir gösterge, katı önceliğe geçmenin genel gecikmeyi **üç kattan fazla**
iyileştirdiğini söyler. Sayı yanlış değildir: hizmet alan üç bin birimin ortalaması gerçekten
düşmüştür, çünkü ağırlığın çoğu artık hiç beklemeyen iki sınıftadır.

Aynı satırın yanındaki iki sütun tersini söylüyor. En uzun bekleme **3** turdan **13** tura
çıkmış; kuyruğu taşıyan özne sayısı **40**'tan **9**'a inmiş. Kırk özne biraz beklerken
dokuz özne çok bekliyor ve ortalama tam da bu yüzden düşüyor.

Kuyruklu özne sütunundaki **40 → 9** düşüşü kendi başına bir iyileşme gibi okunabilir —
"kuyrukta bekleyen özne sayısı dörtte bire indi" cümlesi doğrudur ve tamamen yanıltıcıdır.
Kırk öznelik bir kümede ölçülebilen en küçük fark **1/40 = 0,025**'tir; buradaki değişim
bunun otuz bir katıdır ve yönü ölçüyle değil politikayla belirlenir.

Şekillendirme satırı bu tuzağı da yumuşatıyor: genel ortalama **1,08**, en uzun bekleme
**7**, kuyruğu taşıyan özne **29**. Üç sayının hiçbiri en iyisi değil, ama üçü birden hiçbir
sınıfı tek başına bırakmıyor. Hangi satırın seçileceği ölçünün kararı değildir — ölçüm
yalnız kimin ödediğini söyler.

#### Özet

- Hizmet kalitesi üç adımdır: sınıflandırma etiketi verir, önceliklendirme sırayı kurar,
  şekillendirme tavanı koyar; ilk adım yanlışsa sonraki ikisi kusursuz çalışarak yanlış
  sonucu üretir.
- Toplam talep **3433**, hat kapasitesi **3000**; karşılanamayan **433** birim üç kuralın
  üçünde de aynıdır. Sıralama kuralı kuyruğu yok etmez, taşıyanı seçer.
- Katı öncelikte etkileşimin **115** ve toplunun **238** birimlik kuyruğu yedek sınıfına
  biner: **80 + 115 + 238 = 433** ve yedeğin **630** birimlik talebinin yalnız **197**'si
  hizmet alır.
- Etkileşim sınıfının kazandığı **1,13** turluk bekleme, yedek sınıfının ödediği **4,48**
  turdur; iki sayı birlikte yazılmazsa aynı kural ya kusursuz ya felaket görünür.
- Şekillendirme aynı **433** birimi **243 + 190** biçiminde iki sınıfa böler; üst sınıfın
  **0,00** kazancını korur ama alt sınıfın beklemesini **5,76** yerine **2,85**'te tutar.
- Genel ortalama katı öncelikte **1,19**'dan **0,40**'a **iner** — aynı anda en uzun bekleme
  **3**'ten **13**'e çıkarken ve kuyruğu taşıyan özne **40**'tan **9**'a düşerken.

#### Sonraki Adım

Bu beş derste kaldıraç trafiği gerçekten yönetti: dağıttı, sınırladı, yerleştirdi, sıraladı.
Her derste kuyruğu da sayabildik — kaç özne aştı, kaç birim boşta kaldı, kaç nesne hiç
görünmedi, kim kimin gecikmesini ödedi. Ama bu sayıların hepsini yazabilmemizin tek bir
nedeni vardı: kurguyu biz kurduk ve kâhin elimizdeydi. Kapasiteyi, popülerliği, sınıfı ve
gerçek talebi baştan biliyorduk.

İşletmede hiçbiri bilinmez. Son derste görüldüğü gibi, kaldıracın kendi göstergesi
iyileştiğini söylerken kuyruk büyümüş olabilir ve gösterge yalan söylemiyordur. Öyleyse
sıradaki soru kaldıraçla ilgili değildir: **kaldıracın ne yaptığını nereden biliyoruz?**
Sonraki konu bu soruyu üstlenir ve önce en temelinden başlar — ağın kendi durumunu hangi
kayıtlarla, hangi sayaçlarla bildirdiğini tanımlar.

## Gözlemlenebilirlik

Akış kayıtları ve sayaç toplama, sorgu tabanlı izleme ile olay bildiriminin ayrımı, yakalama filtrelerinin gördüğü ve göremediği, ve uçtan uca sağlık göstergelerinin hangi özneyi hiç raporlamadığı.

### Ağ Telemetrisi

Source: https://academia.sh/tr/kurslar/ag-isletimi/ag-telemetrisi

Örnekleme oranı tek bir kaldıraçtır ve kırk özneye birden uygulanır: birde birden birde yirmiye inildiğinde kayıt 400'den 20'ye, görülen ağır olay 22'den 2'ye düşer, 20 ağır olay kaçar ve kırk öznenin 26'sı raporda hiç görünmez.

Önceki ders hizmet kalitesini kurdu. Sınıflandırma, önceliklendirme ve şekillendirme tek bir
kaldıraçtı; bir sınıfın kazandığı gecikme başka bir sınıfın kuyruğuydu ve iki sayı birlikte
yazıldı.

Bu ders o iki sayının nereden geldiğini sorar. Kaldıraç trafiği yönetiyordu — peki kaldıracın
ne yaptığını **nereden biliyoruz**? Operatörün elinde ağın kendisi yoktur; ağın kendisi
hakkında ürettiği kayıtlar vardır. **Telemetri (telemetry)** bu kayıtların toplanmasıdır.
Dersin sorusu telemetrinin ne söylediği değil, **ne söylemediğidir** — çünkü toplamayı
yöneten ayar da bir kaldıraçtır ve onun da bir kuyruğu vardır.

#### Telemetri Neyi Toplar

Ağ aygıtının ürettiği veri iki ayrı sınıfa ayrılır ve ikisi ayrı soruları yanıtlar.

**Akış kaydı (flow record)** bir özettir. Aygıt, aynı adres–bağlantı noktası–protokol
beşlisini paylaşan paketleri tek bir mantıksal akış sayar ve akış bittiğinde ya da bir süre
dolduğunda tek satır yazar: kim kiminle konuştu, ne kadar sürdü, kaç paket ve kaç bayt geçti.
Akış kaydı **özneyi adlandırır**.

**Sayaç (counter)** bir birikimdir. Aygıt her arayüzde giren bayt, çıkan bayt ve düşen paket
gibi değerleri artırarak tutar; okuyucu iki okuma arasındaki farkı alır. Sayaç
adlandırmaz — geçen trafiğin ne kadar olduğunu söyler, kimin olduğunu söylemez. Anlık bir
değeri taşıyan **ölçer (gauge)** ve dağılımı taşıyan **histogram** aynı sınıftadır.

Ölçüt türlerinin ayrımı **Gözlemlenebilirlik ve Güvenilirlik** kursunda, zaman serisi sorgusu
ve toplulaştırma **Gözlemlenebilirlik ve İşletim** kursunda kuruldu; ikisi de burada
tekrarlanmaz. Bu derste özne bir hizmet değil **ağ aygıtıdır** ve ölçülen şey toplulaştırmanın
sonucu değil, **toplulaştırmaya hiç girmemiş özne sayısıdır.**

Aradaki asıl gerilim şudur: sayaç ucuzdur ve hiçbir olayı kaçırmaz, ama hiçbir olayı da
adlandırmaz. Akış kaydı adlandırır, ama pahalıdır — her akış için aygıtın işlemcisi, belleği
ve raporlama bağlantısı çalışır. Pahalı olduğu için **azaltılır** ve azaltmanın adı
örneklemedir.

#### Akış Kaydının Biçimi

Aşağıdaki döküm bir akış kaydının ve bir arayüz sayacının taşıdığı alanları gösterir. Biçim
örneğidir; ölçüm değildir ve çalıştırılmamıştır.

```text
# ogretilen dokum , calistirilmamistir

akış kaydı
  gözlem aygıtı     aygit-07
  kaynak            istasyon.ornek
  hedef             ornek.test
  protokol          TCP
  paket / bayt      143 / 20416
  başlangıç         00:00:12.400
  süre              840 ms
  örnekleme oranı   birde 10

arayüz sayacı (birikimli)
  giren bayt        918233100
  çıkan bayt        640112940
  düşen paket       1204
```

Kayıttaki `örnekleme oranı` alanı önemlidir: kaydın kendisi, kendisinin bir örnek olduğunu
bildirir. Okuyucu bu alanı görmezse kaydı tam sayım sanır. Sayaç tarafında böyle bir alan
yoktur ve gerek de yoktur — sayaç örneklenmez.

#### Kaydın Yolculuğu

Kaydın üretilmesi ile okunması arasında iki mesafe vardır ve ikisi de ölçüyü etkiler.

Birincisi **zamandır**. Akış kaydı akış bittiğinde yazılır; dakikalarca süren bir aktarım,
bittiği ana kadar hiçbir satır üretmez. Aygıtlar bunu bir etkinlik zaman aşımıyla gevşetir:
belirli bir süre dolduğunda akış hâlâ sürüyor olsa bile ara kayıt yazılır ve akış aynı
tanımla devam eder. Ara kayıt üretilmiyorsa uzun akış, tam da sorun çıkardığı sırada
görünmez; üretiliyorsa aynı akış raporda birden çok satırla temsil edilir ve akış sayan bir
gösterge onu birden çok akış sanır.

İkincisi **yoldur**. Kayıt, aygıttan toplayıcıya ağ üzerinden taşınır — yani telemetri, kendi
ölçtüğü ağı kullanır. Bunun iki sonucu vardır. Ağ bozulduğunda kayıt kaybı, ölçülmek istenen
olayla **aynı anda** olur; en çok bilgiye ihtiyaç duyulan dakikada en az kayıt gelir. İkinci
sonuç daha sessizdir: taşıma güvenilir değilse düşen kaydın içeriği geri gelmez. Kaybın
kendisi gizli kalmak zorunda değildir — akış kaydı protokolleri kayıt akışına bir sıra
numarası koyar ve toplayıcı numaradaki boşluktan kaç kaydın düştüğünü çıkarır; çıkaramadığı
şey, düşenlerin **ne** olduğudur. Sayaç bu noktada yine ayrılır: sayaç birikimlidir ve
iki okuma arasında kaç okuma kaçarsa kaçsın fark doğru kalır.

#### Örnekleme Bir Kaldıraçtır

Örnekleme oranı tek bir sayıdır. Operatör onu bir kez ayarlar ve ayar **kırk özneye birden**
uygulanır. Kaldıracın kuyruğu — yanlış hizmet ettiği azınlık — burada iki ayrı biçimde
görünür. Birincisi **kaçan ağır olay**: kaydedilmediği için hiç bilinmeyen sorun. İkincisi
daha sinsidir: **hiç görünmeyen özne**. Bir aygıt raporun tek bir satırında bile yoksa,
gösterge tablosunda o aygıt için ne yüksek bir değer vardır ne düşük bir değer; hiçbir değer
yoktur ve boşluk sağlıkla aynı renkte görünür.

Ölçümün varsayımları:

- **GB1** — Kırk özne kursun sabit topluluğudur ve bu derste değiştirilmez; özneler
  kapasite, gecikme ve sınıf bakımından birbirinden ayrıdır.
- **GB2** — Gözlem penceresinde dört yüz olay geçer. Her olay bir özneye aittir ve olayların
  bir bölümü **ağır** olarak imlenir; ağırlık kurgunun kendisinden gelir.
- **GB3** — Kâhin kurgudur: hangi olayın ağır olduğunu ve hangi özneye ait olduğunu biz
  yazdığımız için biliriz. Ölçüm bu bilgiyi kullanmaz, yalnız sonucu onunla karşılaştırır.
- **GB4** — Örnekleme deterministiktir: sıra numarası `birde` değerine bölünen olay
  kaydedilir. Rastgele örnekleme farklı bir kayıt kümesi verir, ama kayıt sayısını ve
  aşağıdaki eğilimi değiştirmez.
- **GB5** — Her akış kaydı sabit **64 bayttır**. Bayt sütunu kayıt hacminin göreli
  büyüklüğünü gösterir; bir ağ ölçümü değil, kayıt sayımının çarpımıdır.
- **GB6** — Kestirim şu kuralla yapılır: görülen ağır olay sayısı örnekleme oranıyla
  çarpılır. Örnekten toplama gidilirken kullanılan olağan yol budur.

#### Ölçüm

```python
"""Ag telemetrisi: ornekleme orani tek kaldirac, olculen sey kuyruk.

Bolum 1 - kirk ozne ve dort yuz olay.
Bolum 2 - bes ornekleme orani: kayit, gorulen agir olay, kacan, hic gorunmeyen ozne.
"""
TOHUM = 20260812
KAYIT_BAYTI = 64


def uretec(tohum):
    d = tohum % 2147483646 + 1

    def r(n):
        nonlocal d
        d = (d * 48271) % 2147483647
        return d % n
    return r


def ozneler(sayi=40, tohum=TOHUM):
    r, liste = uretec(tohum), []
    for i in range(sayi):
        liste.append({"no": i + 1, "kapasite": 20 + r(81), "gecikme": 5 + r(45),
                      "sinif": ("etkilesim", "toplu", "yedek")[r(3)],
                      "ozel": r(9) == 0})
    return liste


def olaylar(oz, sayi=400, tohum=TOHUM + 3):
    r, liste = uretec(tohum), []
    for i in range(sayi):
        o = oz[r(len(oz))]
        liste.append({"no": i + 1, "ozne": o["no"], "agir": r(25) == 0})
    return liste


def ornekle(ol, birde):
    """Her `birde` olaydan biri kaydedilir."""
    return [o for o in ol if o["no"] % birde == 0]


def gorunen(ol, birde):
    """Kayit sayisi, gorulen agir olay, kacan agir olay, gorulen ozne kumesi."""
    k = ornekle(ol, birde)
    agir = sum(1 for o in k if o["agir"])
    return len(k), agir, sum(1 for o in ol if o["agir"]) - agir, {o["ozne"] for o in k}


oz = ozneler()
ol = olaylar(oz)
print(f"özne {len(oz)} | olay {len(ol)} | ağır olay {sum(o['agir'] for o in ol)} | "
      f"olay üreten özne {len({o['ozne'] for o in ol})}")
print()
print(f"{'birde bir':>10s} {'kayıt':>6s} {'bayt':>6s} {'görülen ağır':>13s} "
      f"{'kaçan ağır':>11s} {'kestirilen ağır':>16s} {'hiç görünmeyen özne':>20s}")
for birde in (1, 2, 5, 10, 20):
    k, agir, kacan, gor = gorunen(ol, birde)
    print(f"{birde:10d} {k:6d} {k * KAYIT_BAYTI:6d} {agir:13d} {kacan:11d} "
          f"{agir * birde:16d} {len(oz) - len(gor):20d}")

k10 = {o["ozne"] for o in ornekle(ol, 10)}
sayim = {o["no"]: sum(1 for x in ol if x["ozne"] == o["no"]) for o in oz}
kayip = [n for n in sayim if n not in k10]
print()
print(f"birde 10 | görünmeyen özne {len(kayip)}"
      f" | olay ortalamaları: görünmeyen "
      f"{sum(sayim[n] for n in kayip) / len(kayip):.2f}, "
      f"görünen {sum(sayim[n] for n in sayim if n in k10) / len(k10):.2f}")
print(f"görünmeyen öznenin en çok olayı {max(sayim[n] for n in kayip)}"
      f" | en az olaylı özne {min(sayim.values())} olayla"
      f" | en çok olaylı özne {max(sayim.values())} olayla")
```

```
özne 40 | olay 400 | ağır olay 22 | olay üreten özne 40

 birde bir  kayıt   bayt  görülen ağır  kaçan ağır  kestirilen ağır  hiç görünmeyen özne
         1    400  25600            22           0               22                    0
         2    200  12800             9          13               18                    1
         5     80   5120             7          15               35                    8
        10     40   2560             2          20               20                   17
        20     20   1280             2          20               40                   26

birde 10 | görünmeyen özne 17 | olay ortalamaları: görünmeyen 8.18, görünen 11.35
görünmeyen öznenin en çok olayı 13 | en az olaylı özne 5 olayla | en çok olaylı özne 18 olayla
```

#### Sayıların Okunması

İlk satır ölçünün temelini verir. Tam sayımda kayıt **400**, görülen ağır olay **22**, kaçan
**0**, hiç görünmeyen özne **0**. Kırk öznenin kırkı da en az bir olay üretmiştir; yani
görünmezlik topluluğun bir özelliği değil, kaldıracın ürettiği bir sonuçtur.

**Kaçan ağır olay.** Birde ikide kayıt yarıya iner ve görülen ağır olay 22'den **9**'a düşer:
**13** ağır olay kaçar. Buradaki oransızlık dikkat çekicidir — kayıt yarıya inerken ağır
olayın görünürlüğü yarıdan fazla düşmüştür. Nedeni ağır olayların az olmasıdır: yirmi iki
tanenin sabit adımlı bir elemeye nasıl dağıldığı şansa kalır. Birde onda görülen ağır olay
**2**'ye iner ve **20** ağır olay kaçar. Birde yirmide kayıt yarıya daha inmesine karşın
görülen ağır olay yine **2** kalır; azalma düzgün değildir, çünkü sayılan şey artık istatistik
değil, tesadüftür.

**Kestirimin yanılması.** Örnekten toplama gidilen olağan yol, görülen sayıyı örnekleme
oranıyla çarpmaktır. Sütun bu kestirimi veriyor: gerçek değer **22** iken kestirim sırasıyla
**22**, **18**, **35**, **20** ve **40** çıkıyor. Birde beşte kestirim gerçeğin bir buçuk
katı, birde yirmide neredeyse iki katı. Aynı çarpım kayıt sayısı için uygulansaydı her
satırda tam **400** verirdi — çünkü toplam büyük ve düzgün dağılmıştır. Kural şudur:
**örnekleme toplamı korur, azınlığı korumaz.** Ağır olay bir azınlıktır ve ölçünün asıl
aradığı şey odur.

**Hiç görünmeyen özne.** Son sütun bu dersin ana sayısıdır. Birde ikide **1** özne raporun
hiçbir satırında yoktur; birde beşte **8**, birde onda **17**, birde yirmide **26**.
Kırk öznenin yirmi altısı, yani üçte ikiden fazlası, gösterge tablosunda hiç yoktur.

Son iki satır bu kayboluşun kime dokunduğunu söylüyor. Birde onda görünmeyen **17** öznenin
olay ortalaması **8,18**, görünen yirmi üçünkü **11,35**. Kayıp rastgele değildir: az konuşan
özne önce düşer. Ama eleme keskin bir eşik de değildir — görünmeyen öznelerden birinin **13**
olayı vardır, yani topluluğun en az olaylı öznesinin (**5** olay) iki katından fazla trafik
üretmiş bir aygıt da rapordan çıkabilmiştir. Kayıp hem eğilimlidir hem tesadüflüdür ve
ikisi bir arada olduğu için operatör kimin görünmediğini rapora bakarak kestiremez.

Sonuç, kursun üçüncü iddiasıdır: **kaldıraç kuyruğu görünmez kılar.** Örnekleme oranı bir
başarım ayarı olarak kurulur ve gerçekten de kayıt hacmini 25 600 bayttan 1 280 bayta indirir.
Ama aynı ayar, hangi öznenin raporlanacağına da karar verir ve bu kararı kimse açıkça
almamıştır. Kırk öznede ölçülebilen en küçük fark **1/40 = 0,025**'tir; 26 özne bunun yirmi
altı katıdır ve ölçüm bandının çok içindedir.

#### Gösterge Tablosunda Boşluk

Görünmeyen öznenin en tehlikeli yanı, gösterge tablosunun onu **eksik göstermemesidir**.
Aşağıdaki tablo biçimi bunu somutlaştırır; ölçüm değildir ve çalıştırılmamıştır.

```text
# ogretilen gosterge tablosu bicimi , calistirilmamistir

en cok trafik ureten aygitlar    (pencere: son 5 dk, kaynak: akis kaydi)
  sira  aygit       akis   bayt        agir olay
     1  aygit-31      14   1.2 GB              1
     2  aygit-07      12   0.9 GB              0
     3  aygit-22      11   0.8 GB              1
   ...
    23  aygit-16       1   0.1 GB              0

  toplam listelenen aygit : 23
```

Tablo yirmi üç aygıt listeler ve doğrudur — listelenen her satır gerçekten üretilmiş bir
kayda dayanır. Yanlış olan hiçbir şey yoktur. Eksik olan şey, tablonun **kırk aygıtlık bir
topluluktan** üretildiğinin hiçbir yerde yazmamasıdır. `toplam listelenen aygıt` alanı
23 der; `envanterdeki aygıt` diye bir alan yoktur. Sıralama listesi yalnızca **veri üretmiş**
olanı sıralayabilir, çünkü sıralamanın girdisi kayıttır ve kaydı olmayan aygıt sıralamaya
hiç girmez.

Ayrım şudur: sıfır değerli bir satır bir bilgidir, **olmayan bir satır bilgi değildir.**
Birincisi "bu aygıttan trafik geçmedi" der; ikincisi hiçbir şey demez ve okuyan kişi onu
birinciyle karıştırır. Gösterge tablosuna envanterin toplam sayısı yazılmadıkça bu ayrım
görünmez kalır.

#### Görünmezliği Daraltmak

Örnekleme kaldıracının kuyruğu kaldırılamaz — kayıt azaltılıyorsa bir şey görünmeyecektir.
Kuyruğun **kimden** oluşacağı ise seçilebilir.

**Birinci daraltma — ağır olayı örneklemenin dışına almak.** Ağır olarak imlenen olay,
örnekleme oranı ne olursa olsun kaydedilir. Bu, kaçan ağır olayı **0**'a indirir ve kayıt
hacmini yalnız ağır olay sayısı kadar artırır; birde yirmide 20 kayıt yerine 42 kayıt olur.
Bedeli, ağırlığın **aygıtta** belirlenmesi zorunluluğudur — aygıt neyin ağır olduğunu bilmek
zorundadır.

**İkinci daraltma — özne başına en az bir kayıt.** Örnekleme oranı korunur, ama her özne için
pencerede en az bir kayıt zorunlu tutulur. Hiç görünmeyen özne **0** olur ve kayıt hacmi en
çok kırk kayıt artar. Bu, görünürlüğü hacimden değil **kapsamdan** satın alır.

**Üçüncü daraltma — sayacı akış kaydının yanında tutmak.** Sayaç örneklenmez. Akış kaydı
bir özneyi hiç göstermese bile, o öznenin arayüz sayacı okunmaya devam eder ve trafiğin
varlığını bildirir. Sayaç kimin konuştuğunu söylemez, ama **birinin konuştuğunu** söyler; iki
kaynak birlikte okunduğunda sessizlik ile görünmezlik ayrılabilir.

Üçünün ortak yanı, kararı örtük olmaktan çıkarmalarıdır. Örnekleme oranı tek başına
bırakıldığında da bir görünürlük politikası uygular; fark, o politikanın yazılmamış olmasıdır.

#### Özet

- Telemetri iki kaynaktan gelir: akış kaydı özneyi adlandırır ama pahalı olduğu için
  örneklenir, sayaç örneklenmez ama özneyi adlandırmaz.
- Örnekleme oranı tek bir kaldıraçtır ve kırk özneye birden uygulanır; birde birden birde
  yirmiye inildiğinde kayıt **400**'den **20**'ye, kayıt hacmi 25 600 bayttan 1 280 bayta iner.
- Görülen ağır olay **22**'den **2**'ye düşer ve **20** ağır olay kaçar; azalma düzgün
  değildir, çünkü ağır olay bir azınlıktır ve elemeye dağılışı tesadüfe kalır.
- Örnekten yapılan kestirim toplamı korur, azınlığı korumaz: gerçek 22 iken kestirim
  **22 / 18 / 35 / 20 / 40** çıkar.
- Hiç görünmeyen özne **0**'dan **26**'ya çıkar; kaldıraç bir başarım ayarı olarak kurulur ama
  kimin raporlanacağını da o seçer ve boşluk gösterge tablosunda sağlıkla aynı renktedir.

#### Sonraki Adım

Bu derste kayıtları aygıt üretiyor ve toplayıcı onları alıyordu; kimin ne zaman konuştuğu
sorulmadı. Oysa toplama iki ayrı biçimde kurulabilir: toplayıcı aygıtlara **sorar**, ya da
aygıt kendiliğinden **bildirir**. İki modelin tur maliyeti Uygulama Katmanı Protokolleri
kursunda ölçüldü ve burada tekrarlanmayacak. Sonraki ders aynı ayrımı bu kursun ölçüsüyle
ele alır: sorgu tabanlı izlemede ve olay bildiriminde **kaç özne hiç raporlanmıyor** ve iki
modelin görmediği özneler aynı özneler mi?

### Aygıt İzleme Protokolleri

Source: https://academia.sh/tr/kurslar/ag-isletimi/aygit-izleme-protokolleri

Sorgu tabanlı izleme ile olay bildirimi aynı kırk aygıtı ayrı biçimlerde kaybeder: yedi yüz milisaniyelik bir tarama bütçesinde yoklama en iyi durumda 29 aygıt görür, dokuz olaylık bildirim eşiğinde 25 aygıt konuşur ve iki modelin birlikte hiç görmediği aygıt sayısı 6'dır.

Önceki ders telemetriyi kaydın kendisinden okudu: akış kayıtları ve sayaçlar aygıtta üretiliyor
ve bir toplayıcıya gidiyordu. Kaydın **kim tarafından başlatıldığı** sorulmadı. Oysa toplama
iki ayrı biçimde kurulabilir ve seçim tek başına bir kaldıraçtır.

Birinci biçimde yönetici sorar: aygıtları sırayla dolaşır, her birinden değerleri ister ve
yanıtı yazar. İkinci biçimde aygıt bildirir: bir eşik aşıldığında ya da bir durum değiştiğinde
yöneticiye kendiliğinden ileti gönderir. İki modelin **tur maliyeti ve yakalama gecikmesi**
Uygulama Katmanı Protokolleri kursunda ölçüldü ve burada tekrarlanmayacak. Bu dersin sorusu
başkadır: aynı kırk aygıtta, iki model **kaç özneyi hiç raporlamıyor** — ve raporlamadıkları
özneler aynı özneler mi?

#### İki Modelin İleti Biçimi

Sorgu tabanlı izlemede aygıt bir **nesne ağacı** sunar. Her ölçülebilir değerin bir nesne
kimliği vardır ve yönetici kimliği vererek değeri ister. Ağaç sıralıdır, bu yüzden yönetici
bilmediği bir dalı da "bir sonrakini ver" diyerek gezebilir. Olay bildiriminde yön terstir:
aygıt aynı nesne kimliğini ve değeri, sorulmadan gönderir. Bildirimin onaylanan ve
onaylanmayan iki biçimi vardır; aradaki fark önceki kursta ölçüldü ve burada yalnız
anılıyor. Üçüncü bir biçim abonelik kurar: yönetici bir yol ve bir aralık bildirir, aygıt o
yolu düzenli olarak ya da her değişimde akıtır.

```text
# ogretilen ileti bicimi , calistirilmamistir

sorgu tabanli izleme
  yonetici -> aygit   sorgu    nesne kimligi 1.3.6.1.2.1.2.2.1.10.3
  aygit -> yonetici   yanit    deger 918233100, tur sayac32
  yonetici -> aygit   sonraki  agacta bir sonraki dal

olay bildirimi
  aygit -> yonetici   bildirim        nesne kimligi, deger, zaman damgasi
  aygit -> yonetici   onayli bildirim yonetici onaylar, gelmezse aygit yineler

abonelik
  yonetici -> aygit   abone ol  yol /arayuzler/arayuz/sayaclar, aralik 10 s
  aygit -> yonetici   akis      her aralikta ya da her degisimde
```

Biçimin kendisi ölçüye girmez. Ölçüye giren şey, her modelin **neyin raporlanacağına karar
veren ayarıdır**.

#### Yoklamanın Bütçesi

Yoklayan modelde yönetici listeyi baştan gezer ve her aygıtı sırayla sorar. Tarama bir dönem
içinde bitmek zorundadır: bir sonraki dönem başladığında tarama yeniden baştan başlar. Bu
tarama bir **süre bütçesi** demektir.

Bütçeyi harcayan iki şey vardır. Yanıt veren aygıt kendi gecikmesi kadar süre yer. Yanıt
vermeyen aygıt ise **zaman aşımı** kadar süre yer — hem de hiçbir veri vermeden. Yöneticinin
elindeki ayar bu zaman aşımı eşiğidir ve iki yöne birden çeker.

Eşik düşük tutulursa yavaş aygıt yanıt yetiştiremeden kesilir ve raporlanmaz; buna karşılık
her kesme ucuzdur, tarama listenin sonuna varır. Eşik yükseltilirse yavaş aygıtlar da yanıt
verebilir, ama her yanıt daha çok süre yer ve bütçe listenin sonuna varmadan tükenir. Bu
durumda listenin **kuyruğundaki** aygıtlar hiç sorulmaz bile. İki neden ayrı ayrı sayılmalıdır:
zaman aşımına uğrayan aygıt sorulmuş ama yanıtlamamıştır, hiç sorulmayan aygıt ise
yöneticinin haberi bile olmadan dışarıda kalmıştır.

#### Bildirimin Eşiği

Bildiren modelde tarama yoktur, dolayısıyla süre bütçesi de yoktur. Onun yerine aygıtta bir
**bildirim eşiği** durur: aygıt her olayı değil, ancak eşiği aşan bir etkinlik gördüğünde
konuşur. Eşik olmasaydı yönetici pencereye düşen her olayı ayrı bir iletiyle alırdı ve bu,
tarama bütçesinden çok daha büyük bir yük olurdu.

Eşiğin doğurduğu sessizlik iki anlama gelir ve ileti bunları ayırmaz. Bir aygıt susuyorsa ya
gerçekten eşiği aşmamıştır ya da konuşamayacak durumdadır. Yoklamada sessizlik en azından
**sorulmuş** bir sessizliktir; bildirimde sorulmamıştır bile.

Ölçümün varsayımları:

- **GB7** — Kırk özne kursun sabit topluluğudur; her öznenin bir yanıt gecikmesi vardır ve
  bu gecikme sorgunun süre maliyetidir.
- **GB8** — Tarama dönemi bütçesi **700 ms**'dir. Kırk aygıtın gecikme toplamı bu bütçenin
  üstündedir, yani tarama en iyi durumda bile listenin tamamına yetişmez.
- **GB9** — Tarama listeyi özne sırasına göre gezer ve her dönem baştan başlar; kuyruktaki
  aygıtlar sıraya hiç girmez. Sıra karıştırılırsa görünmeyen özneler değişir, sayıları değişmez.
- **GB10** — Zaman aşımına uğrayan sorgu bütçeden **zaman aşımı kadar** süre yer ve hiçbir
  değer getirmez.
- **GB11** — Bildirim eşiği pencerede üretilen olay sayısı üzerinden tanımlıdır: aygıt ancak
  eşik kadar ya da daha çok olay ürettiyse bildirim gönderir ve gönderdiğinde olaylarının
  tamamını gönderir.
- **GB12** — Raporlanan aygıtın ağır olaylarının tümü görünür; raporlanmayan aygıtın ağır
  olaylarının tümü kaçar. Kâhin kurgudur ve hangi olayın ağır olduğunu biz yazdığımız için
  bilinir.
- **GB13** — İki modelin karşılaştırıldığı satırda yoklama için zaman aşımı **30 ms**, bildirim
  için eşik **9 olay** seçilmiştir; bu iki ayar birbirine yakın büyüklükte kör nokta üretir.

#### Ölçüm

```python
"""Aygit izleme: sorgu tabanli izleme ile olay bildiriminin hic raporlamadigi ozne.

Bolum 1 - yoklama: sure butcesi sabit, kaldirac zaman asimi esigi.
Bolum 2 - bildirim: kaldirac bildirim esigi (pencerede en az kac olay).
Bolum 3 - iki modelin hic gormedigi ozne kumelerinin kesisimi.
"""
TOHUM = 20260812
SURE_BUTCESI = 700  # ms, bir tarama donemi


def uretec(tohum):
    d = tohum % 2147483646 + 1

    def r(n):
        nonlocal d
        d = (d * 48271) % 2147483647
        return d % n
    return r


def ozneler(sayi=40, tohum=TOHUM):
    r, liste = uretec(tohum), []
    for i in range(sayi):
        liste.append({"no": i + 1, "kapasite": 20 + r(81), "gecikme": 5 + r(45),
                      "sinif": ("etkilesim", "toplu", "yedek")[r(3)],
                      "ozel": r(9) == 0})
    return liste


def olaylar(oz, sayi=400, tohum=TOHUM + 3):
    r, liste = uretec(tohum), []
    for i in range(sayi):
        o = oz[r(len(oz))]
        liste.append({"no": i + 1, "ozne": o["no"], "agir": r(25) == 0})
    return liste


def yoklama(oz, zamanasimi, butce=SURE_BUTCESI):
    """Tarayici listeyi bastan gezer; her sorgu aygitin gecikmesi kadar surer,
    yanitsiz aygit zaman asimi kadar sure yer. Butce bitince tarama durur."""
    gecen = sorulan = 0
    gorulen = set()
    for o in oz:
        maliyet = min(o["gecikme"], zamanasimi)
        if gecen + maliyet > butce:
            break
        gecen += maliyet
        sorulan += 1
        if o["gecikme"] <= zamanasimi:
            gorulen.add(o["no"])
    return sorulan, gecen, gorulen


def bildiren(oz, ol, esik):
    """Aygit ancak penceredeki olay sayisi esigi asarsa bildirim gonderir."""
    sayim = {o["no"]: 0 for o in oz}
    for x in ol:
        sayim[x["ozne"]] += 1
    konusan = {n for n, c in sayim.items() if c >= esik}
    return sum(sayim[n] for n in konusan), konusan


def kacan(ol, gorulen):
    return sum(1 for x in ol if x["agir"] and x["ozne"] not in gorulen)


oz = ozneler()
ol = olaylar(oz)
print(f"özne {len(oz)} | olay {len(ol)} | ağır olay {sum(o['agir'] for o in ol)}"
      f" | gecikme {min(o['gecikme'] for o in oz)}–{max(o['gecikme'] for o in oz)} ms"
      f" | tam tarama süresi {sum(o['gecikme'] for o in oz)} ms")
print()
print(f"{'zaman aşımı':>12s} {'sorulan':>8s} {'harcanan ms':>12s} "
      f"{'yanıtlayan':>11s} {'zaman aşımı yiyen':>18s} {'hiç sorulmayan':>15s} "
      f"{'kaçan ağır':>11s}")
yok_gorulen = {}
for za in (10, 20, 30, 40, 50):
    s, g, gor = yoklama(oz, za)
    yok_gorulen[za] = gor
    print(f"{za:12d} {s:8d} {g:12d} {len(gor):11d} {s - len(gor):18d} "
          f"{len(oz) - s:15d} {kacan(ol, gor):11d}")
print()
print(f"{'bildirim eşiği':>15s} {'bildiren özne':>14s} {'iletiler':>9s} "
      f"{'hiç raporlanmayan':>18s} {'kaçan ağır':>11s}")
bil_gorulen = {}
for esik in (1, 6, 9, 12, 15):
    ileti, kon = bildiren(oz, ol, esik)
    bil_gorulen[esik] = kon
    print(f"{esik:15d} {len(kon):14d} {ileti:9d} {len(oz) - len(kon):18d} "
          f"{kacan(ol, kon):11d}")
print()
a, b = yok_gorulen[30], bil_gorulen[9]
ya, yb = set(o["no"] for o in oz) - a, set(o["no"] for o in oz) - b
print(f"yoklama (zaman aşımı 30) görmedi {len(ya)} | bildirim (eşik 9) görmedi {len(yb)}")
print(f"ikisinin de görmediği {len(ya & yb)} | yalnız birinin gördüğü {len(ya ^ yb)}"
      f" | birlikte görülen {len(oz) - len(ya & yb)}")
print(f"ikisi birlikte kaçan ağır olay {kacan(ol, a | b)}")
```

```
özne 40 | olay 400 | ağır olay 22 | gecikme 6–48 ms | tam tarama süresi 935 ms

 zaman aşımı  sorulan  harcanan ms  yanıtlayan  zaman aşımı yiyen  hiç sorulmayan  kaçan ağır
          10       40          385          10                 30               0          18
          20       40          634          18                 22               0           9
          30       36          698          24                 12               4           8
          40       29          664          26                  3              11           5
          50       29          678          29                  0              11           4

 bildirim eşiği  bildiren özne  iletiler  hiç raporlanmayan  kaçan ağır
              1             40       400                  0           0
              6             37       385                  3           1
              9             25       301                 15           3
             12             13       184                 27          15
             15              5        83                 35          16

yoklama (zaman aşımı 30) görmedi 16 | bildirim (eşik 9) görmedi 15
ikisinin de görmediği 6 | yalnız birinin gördüğü 19 | birlikte görülen 34
ikisi birlikte kaçan ağır olay 1
```

#### Yoklama Tablosunun Okunması

Kırk aygıtın gecikme toplamı **935 ms**'dir ve bütçe **700 ms**. Tarama, hiçbir zaman aşımı
olmasa bile listenin tamamına yetişemez; bu, kaldıracın hareket alanının en baştan sınırlı
olduğu anlamına gelir.

Zaman aşımı **10 ms** iken tarama ucuzdur: kırk aygıtın kırkı da sorulur ve toplam **385 ms**
harcanır. Ama yanıtlayan yalnız **10** aygıttır — otuzu eşiğin altına sığamamıştır. Rapor
kırk aygıtın dörtte birini gösterir ve **18** ağır olay kaçar.

Eşik **50 ms**'ye çıkarıldığında zaman aşımı yiyen aygıt **0**'a iner; artık her sorulan aygıt
yanıt verir. Karşılığında tarama **29** aygıtta durur ve **11** aygıt hiç sorulmaz. Yanıtlayan
sayısı 10'dan **29**'a çıkmıştır, ama kırka hiçbir zaman ulaşmaz.

Arada duran **30 ms** satırı iki nedenin aynı anda çalıştığı yerdir: **12** aygıt zaman aşımına
uğrar, **4** aygıt hiç sorulmaz, geriye **24** yanıtlayan kalır. Aynı raporda iki ayrı
görünmezlik nedeni vardır ve gösterge tablosunda ikisi de aynı boşluk olarak durur.

Kaçan ağır olay sütunu bu eğilimi izler ama hiçbir satırda sıfıra inmez: **18, 9, 8, 5, 4**.
En cömert ayarda bile yirmi iki ağır olayın dördü hiçbir sorguya girmez.

#### Bildirim Tablosunun Okunması

Bildirim eşiği **1** olduğunda hiçbir aygıt susmaz: kırkı da konuşur, **0** aygıt görünmez
kalır ve hiçbir ağır olay kaçmaz. Bedeli sütunda duruyor — **400** ileti. Yoklama en pahalı
satırında kırk sorgu atıyordu; bildirim burada onun on katı ileti üretiyor. Bildirim yükü
özne sayısına değil, **olay sayısına** bağlıdır ve bu, iki modelin en temel yapısal farkıdır.

Eşik **9**'a çekildiğinde ileti **301**'e iner ve **25** aygıt konuşur; **15** aygıt hiç
raporlanmaz. Eşik **15**'te yük **83** iletiye kadar düşer ama artık yalnız **5** aygıt
konuşmaktadır ve **35** aygıt sessizdir. Yirmi iki ağır olayın **16**'sı kaçar.

Dikkat çeken şey, eşiğin yükü doğrusaldan hızlı düşürmesidir: 400'den 83'e inerken görünen
aygıt 40'tan 5'e iner. Eşik, çok olay üreten azınlığı tutar ve geri kalanı düşürür. Yoklamanın
kaybettiği aygıt **yavaş** aygıttı; bildirimin kaybettiği aygıt **sessiz** aygıttır.

#### Kör Noktalar Aynı Değil

Son üç satır dersin asıl sonucudur. Yoklama zaman aşımı 30 ms ile **16** aygıtı, bildirim eşik
9 ile **15** aygıtı hiç raporlamıyor. Sayılar birbirine yakın; ama **ikisinin de görmediği
aygıt yalnız 6**'dır. Otuz bir kör nokta yirmi beş ayrı aygıta düşüyor ve bu aygıtların
**on dokuzu** yalnız tek bir modelin kör noktasında.

Bunun doğrudan bir işletme sonucu vardır. İki model birlikte çalıştırıldığında görülen aygıt
sayısı **34**'e çıkar ve ikisinin birlikte kaçırdığı ağır olay **22**'den **1**'e iner. Tek
başına en iyi yoklama ayarı 4 ağır olay kaçırıyordu, en iyi bildirim ayarı ise kırk aygıtın
tamamını konuşturmak pahasına çalışıyordu; ikisi üst üste konduğunda tek bir ağır olay dışında
her şey görünür hâle gelir.

Bunun nedeni modellerin kalitesi değil, **kör noktalarının bağımsız olmasıdır.** Yoklama
gecikmeye göre eler, bildirim etkinliğe göre eler; bir aygıtın hem yavaş hem sessiz olması
ise ayrı bir tesadüftür ve kırk aygıtta yalnız altısında gerçekleşir. Kuyruk kalkmaz — altı
aygıt hâlâ hiçbir raporda yoktur — ama kuyruğun kimden oluştuğu ölçülebilir hâle gelir.

#### Envanter ve Canlılık

Ölçümün kırk özneyi baştan bildiği bir yeri vardır ve bu, kurgunun operatöre verdiği bir
kolaylıktır. Sahada iki modelin de bir **envantere** ihtiyacı vardır, ama ihtiyaçları farklı
yöndedir.

Yoklama envanteri **girdi** olarak kullanır: listede olmayan aygıt hiç sorulmaz, dolayısıyla
envanterdeki bir eksiklik doğrudan görünmez bir özneye dönüşür. Bunun bir iyi yanı vardır —
liste bilindiği için **kimin yanıt vermediği** de bilinir. Yukarıdaki tabloda "zaman aşımı
yiyen" sütunu tam olarak bu bilgidir ve bir sorunun adıdır.

Bildirim envanteri **çıktı** olarak üretir: yönetici, kendisine ileti gönderen aygıtları
tanır. Envanterde olmayan bir aygıt konuşursa yönetici onu öğrenir; bu, yoklamanın
yapamayacağı bir şeydir. Ama tersi de doğrudur: hiç konuşmayan aygıt envanterde hiç
belirmez ve **yokluğu bir sorun olarak görünmez.** Önceki dersteki sıralama listesinde
olduğu gibi, olmayan bir satır bilgi taşımaz.

Bu asimetriyi kapatan yaygın düzenek **canlılık bildirimidir**: aygıt, söyleyecek bir şeyi
olmasa da düzenli aralıklarla kısa bir ileti gönderir. Yönetici artık sessizliği ölçebilir,
çünkü sessizlik bir ileti eksikliği hâline gelmiştir. Maliyeti hesaplanabilir bir yüktür —
kırk aygıt ve dakikada bir bildirim, bir saatte 2 400 ileti demektir ve bu yük olay sayısından
bağımsızdır. Kazancı ise ölçüde doğrudan görünür: bildirim eşiği 15 iken **35** aygıt
sessizdir; canlılık bildirimi eklendiğinde bu otuz beşin hepsi görünür hâle gelir, yalnız
**neyi yaptıkları** değil, **var oldukları** bilgisiyle.

#### Özet

- Sorgu tabanlı izlemede yönetici sorar, olay bildiriminde aygıt konuşur; iki modelin tur
  maliyeti önceki kursta ölçüldü, burada ölçülen **kaç öznenin hiç raporlanmadığıdır**.
- Yoklamanın kaldıracı zaman aşımı eşiğidir ve iki yönden birden keser: eşik düşükken **30**
  aygıt zaman aşımına uğrar, eşik yüksekken **11** aygıt hiç sorulmaz; yanıtlayan sayısı
  700 ms bütçede en çok **29**'dur.
- Bildirimin kaldıracı eşiktir ve yükü olay sayısına bağlar: eşik 1'de **400** ileti ile
  **0** görünmeyen, eşik 15'te **83** ileti ile **35** görünmeyen aygıt.
- Yoklama **yavaş** aygıtı, bildirim **sessiz** aygıtı kaybeder; iki modelin kör noktaları
  bağımsız olduğu için 16 ve 15 kişilik iki kümenin kesişimi yalnız **6** aygıttır.
- İki model birlikte kullanıldığında görülen aygıt **34**'e çıkar ve kaçan ağır olay
  **1**'e iner; kuyruk kalkmaz, ama kimin kuyrukta olduğu artık bilinir.

#### Sonraki Adım

Bu iki model de aygıtın **kendi anlattığına** dayanıyordu: yanıtı da bildirimi de aygıt
üretiyor ve içeriğine aygıt karar veriyordu. Bir aygıtın hiç raporlamadığı bir davranış varsa,
onu aygıta sorarak öğrenmenin yolu yoktur. Sonraki ders bu yüzden kaynağı değiştirir ve
paketin kendisine bakar: hattan geçen baytları süzen bir filtre kurulduğunda, filtrenin
**göremediği** ne kadardır — dar bir filtre kaç akışı, geniş bir filtre kaç baytı kaçırır?

### Paket Çözümleme Araçları

Source: https://academia.sh/tr/kurslar/ag-isletimi/paket-cozumleme-araclari

Yakalama filtresi tek bir kaldıraçtır ve iki ucundan da kaybettirir: doksan sekiz akışlık bir pencerede en dar filtre 91 akışı hiç görmez ve 22 ağır olayın 21'ini kaçırır, süzgeçsiz yakalama ise 776 196 baytı tampona sığmadığı için düşürür.

Önceki iki ders de aygıtın **kendi anlattığına** dayanıyordu. Akış kaydını aygıt üretiyor,
sorguya aygıt yanıt veriyor, bildirimi aygıt gönderiyordu. Aygıtın hiç raporlamadığı bir
davranış varsa onu aygıta sorarak öğrenmenin yolu yoktur.

Bu ders kaynağı değiştirir ve hattan geçen baytın kendisine bakar. Bir noktaya konan
çözümleyici, oradan geçen paketleri kopyalar ve kaydeder. Kopyalama sınırsız değildir:
hangi paketlerin kopyalanacağını bir **yakalama filtresi (capture filter)** seçer ve
kopyalar sınırlı bir tampona yazılır. Filtre bir kaldıraçtır — tek bir kural, kırk öznenin
bütün trafiğine birden uygulanır. Bu dersin ölçtüğü şey filtrenin gördüğü değil, **göremediğidir.**

Çözümleyici araçlarının kullanımı ve yakalama yordamı **Güvenlik Araçları ve Sızma Testi**
kursunun konusudur ve burada tekrarlanmaz; araç adı da yazılmaz. Burada ölçülen şey aracın
değil, **kuralın** kendisidir.

#### Yakalamanın İki Sınırı

Yakalama iki ayrı yerde kaybeder ve ikisi ters yönde çalışır.

**Birinci sınır filtredir.** Filtreden geçmeyen paket hiç kopyalanmaz. Bu bir kayıp değil,
bir seçimdir — ta ki aranan davranış filtrenin dışında kalana kadar. Dar bir filtre, ilgisiz
trafiği eleyerek tamponu korur; karşılığında elediği şeyi bir daha geri getiremez, çünkü
kopyalanmamış paket yoktur.

**İkinci sınır tampondur.** Filtreden geçen paketler bir tampona yazılır ve tampon
dolduğunda gelen paket düşer. Bu düşme **sessizdir**: kaydın içinde "burada bir paket
düştü" diyen bir satır yoktur, yalnız olmayan paketler vardır. Geniş bir filtre tamponu
hızla doldurur ve düşme, filtrenin ilgilendiği trafiğin tam ortasında gerçekleşir.

İki sınır aynı kaldıraca bağlıdır. Filtre daraltıldığında birinci sınır büyür, ikinci sınır
küçülür; genişletildiğinde tersi olur. Ortada kayıpsız bir ayar yoktur, yalnız kaybın
**nereye** düşeceğine dair bir seçim vardır.

#### Filtre Sözdizimi

Yakalama filtreleri paketin başlık alanları üzerinde yazılır. Aşağıdaki döküm öğretilen
sözdizimini gösterir; çalıştırılmamıştır ve hiçbir sayı iddiası taşımaz.

```text
# ogretilen filtre sozdizimi , calistirilmamistir

tek alan
  tcp                        protokol alanina bakar
  port 443                   kaynak ya da hedef kapi
  src port 443               yalnizca kaynak kapi
  host istasyon.ornek        kaynak ya da hedef konak

bilesik
  tcp and port 443
  tcp and (port 80 or port 443 or port 8080)
  not port 22

paket ici konum
  tcp[13] & 2 != 0           SYN bayragi kurulmus segmentler
  ip[6:2] & 0x1fff = 0       bolunmemis ilk parca
```

İki şey dikkat ister. Birincisi, filtre pratikte **başlık alanlarını** adresler; yükün
içindeki bir baytı okumak da olanaklıdır, ama değişken uzunluklu başlığın boyunu kuralın
içinde hesaplamayı gerektirir ve kural hızla okunmaz hâle gelir. Asıl sınır başka yerdedir:
karar paket paket verilir, akışın bütününe bakılamaz. İkincisi, `not port 22`
gibi bir olumsuzlama filtreyi genişletir — dar görünen bir kural, dışarıda bıraktığı şey
küçükse aslında geniş bir kuraldır. Filtrenin genişliğinin ölçüsü sözdiziminin uzunluğu
değil, **eşleşen akış sayısıdır.**

#### Kesme Uzunluğu ve Akış Yeniden Kurma

Her paketten ne kadar saklanacağını **kesme uzunluğu** belirler. Yalnız başlıklar
saklanacaksa paket başına birkaç düzine bayt yeter; yükün tamamı isteniyorsa paketin tamamı
yazılır ve tampon aynı sürede on kat daha hızlı dolar.

Kesme uzunluğu, **akış yeniden kurmayı** doğrudan sınırlar. Yeniden kurma, aynı akışa ait
paketlerin sıra numaralarına göre birleştirilip özgün bayt akışının geri elde edilmesidir.
Başlıklar yeterlidir eğer soru "bu akış ne zaman başladı, kaç bayt taşıdı, nasıl kapandı"
ise. Soru "bu akışta ne taşındı" ise başlık yetmez ve kesilmiş bir kayıt bu soruyu hiçbir
zaman yanıtlayamaz.

Yeniden kurmanın ikinci koşulu **sürekliliktir**: akışın paketlerinden biri düşmüşse akış
tam olarak kurulamaz. Bu yüzden ölçümde bir akış üç ayrı sonuca düşebilir — tam yakalanmış,
yarım kalmış ya da tampona hiç sığmamış.

Ölçümün varsayımları:

- **GB14** — Kırk özne kursun sabit topluluğudur; her özne pencerede bir ile dört arası
  akış üretir ve akışlar başlangıç zamanına göre sıralanır.
- **GB15** — Yakalama tamponu **1 200 000 bayttır** ve pencere boyunca boşaltılmaz. Gerçek
  bir yakalamada tampon diske boşaltılır; burada sabit tutulması, düşmenin filtre genişliğine
  bağımlılığını yalıtmak içindir.
- **GB16** — Kesme uzunluğu **96 bayt/paket** olarak sabittir ve bu derste kaldıraç değildir.
  Yalnız filtre değiştirilir.
- **GB17** — Tampon zaman sırasına göre dolar. Dolduğu ana kadar biten akış tam yakalanır,
  o anı bölen akış yarım kalır, sonra başlayan akış hiç yazılmaz.
- **GB18** — Düşen paket iz bırakmaz; ölçüm düşen baytı kâhinden okur, kayıttan değil.
  Gerçek bir yakalamada bu sayı ancak sayaçla kestirilebilir.
- **GB19** — Ağır olay kâhinin bilgisidir. Bir öznenin tek bir akışı bile yakalanmışsa o
  öznenin ağır olayları görünür sayılır; hiçbir akışı yakalanmamışsa hepsi kaçar.
- **GB20** — Filtreler iç içedir: her filtre bir öncekinin eşleştirdiği akışların tümünü
  eşleştirir. Genişlik böylece tek yönlü bir eksende ölçülür.
- **GB21** — Gözlem noktası kırk öznenin bütün akışlarını görür. Bu bir kolaylıktır ve
  sahada karşılığı yoktur; ölçüm bu yüzden yalnız filtre ile tamponun kaybını sayar,
  konumun kaybını saymaz.

#### Ölçüm

```python
"""Paket cozumleme: yakalama filtresi tek kaldirac, olculen sey filtrenin goremedigi.

Bolum 1 - kirk oznenin akislari, zaman sirasina dizilmis.
Bolum 2 - bes filtre genisligi: dar filtre kac akis, genis filtre kac bayt kaciriyor.
"""
TOHUM = 20260812
TAMPON = 1_200_000   # bayt, yakalama tamponu
KESME = 96           # bayt, paket basina saklanan en cok bayt


def uretec(tohum):
    d = tohum % 2147483646 + 1

    def r(n):
        nonlocal d
        d = (d * 48271) % 2147483647
        return d % n
    return r


def ozneler(sayi=40, tohum=TOHUM):
    r, liste = uretec(tohum), []
    for i in range(sayi):
        liste.append({"no": i + 1, "kapasite": 20 + r(81), "gecikme": 5 + r(45),
                      "sinif": ("etkilesim", "toplu", "yedek")[r(3)],
                      "ozel": r(9) == 0})
    return liste


def olaylar(oz, sayi=400, tohum=TOHUM + 3):
    r, liste = uretec(tohum), []
    for i in range(sayi):
        o = oz[r(len(oz))]
        liste.append({"no": i + 1, "ozne": o["no"], "agir": r(25) == 0})
    return liste


def akislar(oz, tohum=TOHUM + 7):
    """Her ozne bir ile dort arasinda akis uretir; liste zaman sirasina dizilir."""
    r, liste = uretec(tohum), []
    for o in oz:
        for _ in range(1 + r(4)):
            liste.append({"ozne": o["no"], "protokol": ("TCP", "UDP", "ICMP")[r(3)],
                          "kapi": (22, 53, 80, 123, 443, 8080)[r(6)],
                          "paket": 20 + r(400), "boy": 64 + r(1400),
                          "baslangic": r(1000)})
    return sorted(liste, key=lambda a: (a["baslangic"], a["ozne"]))


def yakala(ak, filtre, tampon=TAMPON, kesme=KESME):
    """Filtreden gecen akis tampona yazilir; tampon dolunca kalan bayt duser."""
    dolu = eslesen = tam = yarim = sigmayan = dusen = 0
    gorulen = set()
    for a in ak:
        if not filtre(a):
            continue
        eslesen += 1
        boyut = a["paket"] * min(a["boy"], kesme)
        if dolu + boyut <= tampon:
            dolu, tam = dolu + boyut, tam + 1
            gorulen.add(a["ozne"])
        elif dolu < tampon:
            yarim += 1
            dusen += dolu + boyut - tampon
            dolu = tampon
            gorulen.add(a["ozne"])
        else:
            sigmayan += 1
            dusen += boyut
    return eslesen, tam, yarim, sigmayan, dusen, gorulen


FILTRELER = {
    "TCP kapı 443": lambda a: a["protokol"] == "TCP" and a["kapi"] == 443,
    "TCP üç kapı": lambda a: a["protokol"] == "TCP" and a["kapi"] in (80, 443, 8080),
    "yalnız TCP": lambda a: a["protokol"] == "TCP",
    "TCP ve UDP": lambda a: a["protokol"] in ("TCP", "UDP"),
    "süzgeçsiz": lambda a: True,
}

oz = ozneler()
ol = olaylar(oz)
ak = akislar(oz)
print(f"özne {len(oz)} | akış {len(ak)} | paket {sum(a['paket'] for a in ak)}"
      f" | ağır olay {sum(o['agir'] for o in ol)}")
print(f"tampon {TAMPON} bayt | kesme {KESME} bayt/paket"
      f" | kesmeli toplam {sum(a['paket'] * min(a['boy'], KESME) for a in ak)} bayt"
      f" | kesmesiz {sum(a['paket'] * a['boy'] for a in ak)} bayt")
print()
print(f"{'filtre':<13s} {'eşleşen':>8s} {'dışarıda':>9s} {'tam':>4s} {'yarım':>6s} "
      f"{'sığmayan':>9s} {'düşen bayt':>11s} {'görünmeyen':>11s} {'kaçan ağır':>11s}")
for ad, f in FILTRELER.items():
    e, tam, yarim, sig, dusen, gor = yakala(ak, f)
    kacan = sum(1 for x in ol if x["agir"] and x["ozne"] not in gor)
    print(f"{ad:<13s} {e:8d} {len(ak) - e:9d} {tam:4d} {yarim:6d} {sig:9d} "
          f"{dusen:11d} {len(oz) - len(gor):11d} {kacan:11d}")
```

```
özne 40 | akış 98 | paket 20631 | ağır olay 22
tampon 1200000 bayt | kesme 96 bayt/paket | kesmeli toplam 1976196 bayt | kesmesiz 15032397 bayt

filtre         eşleşen  dışarıda  tam  yarım  sığmayan  düşen bayt  görünmeyen  kaçan ağır
TCP kapı 443         7        91    7      0         0           0          33          21
TCP üç kapı         17        81   17      0         0           0          23          13
yalnız TCP          38        60   38      0         0           0          15           6
TCP ve UDP          65        33   58      1         6      188868          11           4
süzgeçsiz           98         0   65      1        32      776196           5           2
```

#### Dar Filtrenin Kaçırdığı

İlk satır en dar kuraldır ve tam olarak istendiği gibi çalışır: eşleşen **7** akışın
yedisi de eksiksiz yakalanır, tampondan tek bayt düşmez, kayıt küçüktür ve okunması kolaydır.
Bu satırda hiçbir şey bozulmamıştır.

Bozulan şey satırın sağındadır. Doksan sekiz akışın **91**'i filtrenin dışında kalmıştır ve
kırk öznenin **33**'ü kayıtta hiç görünmez. Yirmi iki ağır olayın **21**'i kaçar. Kayıt
temizdir, çünkü içine yalnız bakılması istenen şey girmiştir; sorun da tam budur — kayıt,
kendisine ne sorulacağı bilindiği varsayımıyla kurulmuştur.

Filtre genişledikçe bu taraf iyileşir. `TCP üç kapı` ile görünmeyen özne **23**'e,
`yalnız TCP` ile **15**'e iner; kaçan ağır olay **13** ve **6** olur. Üçüncü satıra kadar tampon hiç
zorlanmaz: düşen bayt **0**'dır. Kaldıraç bu aralıkta bedelsiz görünür.

#### Geniş Filtrenin Kaçırdığı

Dördüncü satırda ikinci sınır devreye girer. `TCP ve UDP` filtresi **65** akış eşleştirir ama
bunların yalnız **58**'i tam yakalanır: **1** akış yarım kalır ve **6** akış tampona hiç
sığmaz. Düşen bayt **188 868**'dir.

Süzgeçsiz yakalamada tablo tersine döner. Filtre artık hiçbir şeyi dışarıda bırakmaz —
`dışarıda` sütunu **0**. Buna karşılık doksan sekiz akışın yalnız **65**'i tam yakalanır,
**32**'si tampona hiç sığmaz ve **776 196** bayt düşer. Kesmeli toplam **1 976 196** bayttır;
yani yakalanmak istenen verinin yaklaşık beşte ikisi kayda hiç girmez.

En çarpıcı sütun görünmeyen öznedir: süzgeçsiz yakalamada bu sayı **5**'tir ve sıfır değildir.
Filtre hiçbir özneyi elemediği hâlde beş özne kayıtta yoktur, çünkü onların akışları tamponun
dolduğu andan sonra başlamıştır. **Filtreyi genişletmek görünürlüğü artırmadı, kaybı
filtreden tampona taşıdı.**

İki kayıp arasındaki nitelik farkı önemlidir. Filtrenin elediği akış **bilinerek** elenmiştir;
kuralı okuyan kişi neyin dışarıda kaldığını söyleyebilir. Tampondan düşen akış ise bilinmeden
düşmüştür ve kaydın kendisinde bunu gösteren hiçbir alan yoktur. İkinci kayıp, birinciden
daha az bayt götürse bile daha tehlikelidir, çünkü kaydı okuyan kişi eksikliği fark etmez.

#### Sayılmayan Üçüncü Kayıp

Ölçüm, gözlem noktasının kırk öznenin bütün akışlarını gördüğünü varsayar. Bu varsayım
sahada tutmaz ve tutmadığı yerde üçüncü bir kayıp doğar.

Çözümleyici bir noktaya konur ve yalnız o noktadan **geçen** paketi görür. İki özne
birbiriyle o noktanın berisinde konuşuyorsa aralarındaki trafik hiçbir zaman kopyalanmaz —
filtre ne kadar geniş olursa olsun, tampon ne kadar büyük olursa olsun. Aynı biçimde, bir
anahtarın bir bağlantı noktasına konan çözümleyici öteki bağlantı noktalarının kendi
aralarındaki trafiği görmez; bunun için trafiğin ayrıca yansıtılması gerekir ve yansıtma da
kendi sınırını taşır: yansıtılan bağlantı noktasının hızı, kaynakların toplam hızından
düşükse yansıtma sırasında da paket düşer.

Bu kaybın diğer ikisinden farkı, **filtre kuralına bakarak kestirilememesidir.** Dar filtrenin
neyi elediği kuralın kendisinde yazılıdır; tampondan düşenin miktarı bir sayaçtan okunabilir.
Konumun görmediği ise ancak topolojiden çıkarılabilir ve yakalama kaydında hiçbir izi yoktur.
Üç kaybın ortak sonucu şudur: **kaydın boş olması, orada bir şey olmadığı anlamına gelmez.**

#### Kayıpları Daraltmak

Kaldıracın kuyruğu kaldırılamaz; üç daraltma onu ölçülebilir kılar.

**Birinci daraltma — düşmeyi saymak.** Yakalama arayüzü, düşen paket için bir sayaç tutar.
Sayaç örneklenmez ve filtreden etkilenmez; kayıt eksikse bunu söyleyen tek alan odur. Kayıt
her açıldığında sayacın da okunması, `sığmayan` sütununun sahadaki karşılığını verir.

**İkinci daraltma — kesme uzunluğunu soruya göre seçmek.** Ölçümdeki pencerede paketlerin
tamamı saklansaydı toplam **15 032 397** bayt olurdu; 96 baytlık kesmeyle **1 976 196** bayta
iner, yani yaklaşık yedide bire. Aynı tampon, aynı filtreyle yedi kat uzun bir pencereyi
kapsar. Soru akışın varlığı ve zamanlaması ise bu takas bedavaya yakındır. Soru içerikse
kesme kaldırılmalıdır, ama o zaman pencere kısaltılmalıdır; iki ayarın çarpımı sabittir.

**Üçüncü daraltma — filtreyi soruya değil, kâhine göre yazmak.** Yukarıdaki ölçümde en dar
filtre yirmi iki ağır olayın yirmi birini kaçırıyordu. Ağır olayların hangi kapılarda
geçtiği bilinmediği için dar filtre kumar oynamaktadır. Uygulanabilir kural şudur: yakalama
filtresi, telemetride **görünmeyen özneleri** kapsayacak biçimde yazılır. Önceki iki ders
kimin görünmediğini sayıyordu; bu ders o listenin nereye yazılacağını söyler.

#### Özet

- Yakalama iki yerde kaybeder: filtreden geçmeyen paket hiç kopyalanmaz, tampona sığmayan
  paket sessizce düşer; iki kayıp aynı kaldıracın ters yönleridir.
- En dar filtre **7** akış yakalar ve hiç bayt düşürmez, ama **91** akışı dışarıda bırakır,
  **33** özneyi hiç göstermez ve 22 ağır olayın **21**'ini kaçırır.
- Süzgeçsiz yakalama hiçbir akışı dışarıda bırakmaz ama **32** akış tampona sığmaz ve
  **776 196** bayt düşer; kesmeli toplamın yaklaşık beşte ikisi kayda girmez.
- Süzgeçsiz yakalamada bile **5** özne görünmez: filtre elemediği hâlde tamponun dolduğu
  andan sonra başlayan akışlar kayda hiç girmez.
- Filtrenin elediği akış bilinerek elenmiştir, tampondan düşen akış bilinmeden düşer; ikinci
  kayıp daha küçük olduğunda bile daha tehlikelidir çünkü kayıtta hiçbir iz bırakmaz.
- Üçüncü bir kayıp ölçümün dışındadır ve gözlem noktasından gelir: o noktadan geçmeyen
  trafik hiçbir filtre genişliğiyle görünmez ve bu eksiklik ne kuraldan ne sayaçtan
  okunabilir — yalnız topolojiden çıkarılabilir.

#### Sonraki Adım

Buraya kadarki üç ölçüm de ağın **içinden** bakıyordu: aygıtın kaydı, aygıtın yanıtı, hattan
geçen paket. Üçünün de öznesi tek tek aygıtlardı. İşletmede sorulan asıl soru ise uçtan uca
sorulur — bir uçtan öbür uca erişilebiliyor mu ve ne kadar sürede? Sonraki ders bu tek
göstergeyi kurar ve tersinden sorar: uçtan uca ölçülen bir sağlık değeri kırk öznenin
**hangisini temsil etmiyor** ve gösterge yeşilken kaç özne kuyrukta kalıyor?

### Erişilebilirlik ve Gecikme Ölçümü

Source: https://academia.sh/tr/kurslar/ag-isletimi/erisilebilirlik-ve-gecikme-olcumu

Uçtan uca sağlık göstergesi bir örneklemedir: dört hedefli bir sınama listesinde kırk öznenin 36'sı hiç sınanmaz, hizmet erişilebilirliği 37,5 ile 62,5 arasında salınırken gerçek değer 57,5'te durur ve göstergenin çözünürlüğü özne sayısı değil hedef sayısıdır.

Önceki üç ders de ağın içinden bakıyordu: aygıtın ürettiği kayıt, aygıtın verdiği yanıt,
hattan geçen paket. Üçünün de öznesi tek tek aygıtlardı ve üçünde de ölçülen şey kaç aygıtın
görünmediğiydi.

İşletmede sorulan asıl soru ise dışarıdan sorulur ve tek cümledir: **bir uçtan öbür uca
gidilebiliyor mu ve ne kadar sürede?** Bu soruyu yanıtlayan sınamalar bir sayıya toplanır ve
o sayı gösterge tablosunun en üstüne yazılır. Bu dersin sorusu, o tek sayının **kim adına**
konuştuğudur.

#### İki Ayrı Sözcük

Bu derste birbirine karıştırılan iki kavram ayrı adlarla anılır ve ayrım bağlayıcıdır.

**Erişilebilirlik** bir uçtan bir hedefe gidilip gidilemediğidir. Ölçen şey bir
**erişilebilirlik sınamasıdır**: bir yankı isteği gönderilir, yanıt beklenir, sonuç ikili
çıkar. Sınamanın kendisi ve yanıtsızlığın kaç ayrı nedene uyduğu **Linux Ağ Yönetimi ve Sorun
Giderme** kursunda kuruldu; burada sınama bir yordam olarak değil, bir **veri kaynağı** olarak
kullanılır.

**Hizmet erişilebilirliği** ise bir orandır: sınamaların kaçının başarılı olduğu. İkili bir
sonuçtan türetilir ve yüzde olarak yazılır. Gösterge tablosunda gördüğümüz sayı budur.

Aradaki fark ölçünün merkezindedir. Erişilebilirlik **bir özne hakkındadır**; hizmet
erişilebilirliği **bir küme hakkındadır** ve kümenin kim olduğunu sınama listesi belirler.
Liste bir kaldıraçtır: tek bir yapılandırma dosyası, kırk öznenin hangisinin adına
konuşulacağını seçer.

Gösterge tasarımı, uyarı eşikleri ve hata bütçesi **Gözlemlenebilirlik ve Güvenilirlik**
kursunun konusudur ve burada tekrarlanmaz. Burada ölçülen şey göstergenin nasıl tasarlanacağı
değil, tasarlanmış bir göstergenin **hangi özneyi temsil etmediğidir.**

#### Sınama Nasıl Kurulur

```text
# ogretilen sinama tanimi ve gosterge tablosu bicimi , calistirilmamistir

sinama tanimi
  ad              uctan-uca-erisim
  hedef listesi   aygit-03, aygit-11, aygit-27, aygit-38
  yordam          erisilebilirlik sinamasi, 5 deneme, 1 s aralik
  basari kosulu   en az 4 deneme yanit aldi
  gecikme degeri  denemelerin ortancasi
  pencere         24 sa

gosterge tablosu
  hizmet erisilebilirligi   ....%
  ortalama gecikme          .... ms
  en yavas hedef            .... ms
  hedef sayisi              4
```

Tanımın en önemli satırı `hedef listesi`dir ve gösterge tablosunda görünmez. Tabloda
`hedef sayısı` alanı bulunsa bile hedeflerin **kimler olduğu** ve envanterin **kaç özne**
içerdiği yazmaz. Gösterge yüzdeyi bildirir, paydayı bildirmez.

#### Gösterge Bir Örneklemedir

Sınama listesi kırk özneden bir alt küme seçer ve gösterge yalnız o alt kümeyi ölçer.
Bu, ilk dersteki örnekleme oranıyla aynı yapıdadır — orada olaylar seçiliyordu, burada
özneler seçiliyor. Kaldıracın kuyruğu da aynı biçimde iki katlıdır: listede olmayan özne
göstergeye hiç girmez ve listede olmayan bir özne bozuksa **gösterge yeşil kalır.**

İkinci ve daha az fark edilen sonuç **çözünürlüktür**. Dört hedefli bir sınamada oran ancak
0, 25, 50, 75 ve 100 değerlerini alabilir; ölçülebilen en küçük fark **100/4 = 25 puandır**.
Böyle bir göstergeye yüzde birlik bir eşik koymak, ölçünün altındaki bir farkı bildirmesini
istemektir.

Ölçümün varsayımları:

- **GB22** — Kırk özne kursun sabit topluluğudur ve bu derste değiştirilmez.
- **GB23** — Bir özne, pencerede en az bir ağır olay ürettiyse **erişilemez** sayılır.
  Kâhin kurgudur; sınama bu bilgiyi kullanmaz, yalnız sonucu onunla karşılaştırılır.
- **GB24** — Her hedef bir kez sınanır ve sınama ikili sonuç verir. Deneme yinelemesi ve
  başarı koşulu sonucu değiştirmez, yalnız gürültüyü azaltır; ölçüm bu yüzden tek denemeyi
  alır.
- **GB25** — Ölçülen gecikme, hedefin kendi gecikmesidir. Yol üzerindeki aygıtların katkısı
  bu derste modellenmez; modellenseydi ölçülen değerler büyür, aşağıdaki eğilim değişmezdi.
- **GB26** — Sınama listesinin sırası kurgudan gelen sabit bir dizidir ve listeler iç içedir:
  sekiz hedefli liste, dört hedefli listenin tümünü içerir. Sıra değişirse görünmeyen özneler
  değişir, sayıları benzer kalır.
- **GB27** — `hizmet erişilebilirliği` yalnız sınanan hedefler üzerinden hesaplanır; sınanmayan
  özne paya da paydaya da girmez. Sahadaki hesap da böyledir.
- **GB28** — Kırk öznede ölçülebilen en küçük fark **1/40 = 0,025**'tir; dört hedefli bir
  listede ise **1/4 = 0,25**. Göstergenin çözünürlüğü envantere değil, listeye bağlıdır.
- **GB29** — Sınamalar bağımsız kabul edilir: her hedefin sonucu yalnız kendi durumundan
  gelir, yol paylaşımı modellenmez. Modellenseydi göstergenin salınımı artardı.

#### Ölçüm

```python
"""Uctan uca saglik: sinama listesi tek kaldirac, olculen sey gostergenin temsil etmedigi.

Bolum 1 - kirk ozne; agir olay ureten ozne erisilemez sayilir.
Bolum 2 - bes sinama listesi: hizmet erisilebilirligi, gecikme gostergesi ve kuyruk.
"""
TOHUM = 20260812


def uretec(tohum):
    d = tohum % 2147483646 + 1

    def r(n):
        nonlocal d
        d = (d * 48271) % 2147483647
        return d % n
    return r


def ozneler(sayi=40, tohum=TOHUM):
    r, liste = uretec(tohum), []
    for i in range(sayi):
        liste.append({"no": i + 1, "kapasite": 20 + r(81), "gecikme": 5 + r(45),
                      "sinif": ("etkilesim", "toplu", "yedek")[r(3)],
                      "ozel": r(9) == 0})
    return liste


def olaylar(oz, sayi=400, tohum=TOHUM + 3):
    r, liste = uretec(tohum), []
    for i in range(sayi):
        o = oz[r(len(oz))]
        liste.append({"no": i + 1, "ozne": o["no"], "agir": r(25) == 0})
    return liste


def sinama_sirasi(oz, tohum=TOHUM + 11):
    """Sinama listesinin sirasi; onekleri ic ice hedef kumeleri verir."""
    r, kalan, sira = uretec(tohum), [o["no"] for o in oz], []
    while kalan:
        sira.append(kalan.pop(r(len(kalan))))
    return sira


oz = ozneler()
ol = olaylar(oz)
gec = {o["no"]: o["gecikme"] for o in oz}
agir = {o["no"]: 0 for o in oz}
for x in ol:
    if x["agir"]:
        agir[x["ozne"]] += 1
erisilemez = {n for n, c in agir.items() if c >= 1}
sira = sinama_sirasi(oz)

print(f"özne {len(oz)} | ağır olay {sum(agir.values())} | erişilemez özne "
      f"{len(erisilemez)} | gerçek hizmet erişilebilirliği "
      f"{100 * (len(oz) - len(erisilemez)) / len(oz):.1f}%")
print(f"gerçek gecikme: ortalama {sum(gec.values()) / len(oz):.1f} ms, "
      f"en yavaş {max(gec.values())} ms, en hızlı {min(gec.values())} ms")
print()
print(f"{'hedef':>6s} {'sınanmayan':>11s} {'hizmet eriş.':>13s} {'çözünürlük':>11s} "
      f"{'ort. ms':>8s} {'en yavaş':>9s} {'görünmeyen':>11s} {'kaçan ağır':>11s}")
for sayi in (4, 8, 16, 32, 40):
    h = sira[:sayi]
    basarili = [n for n in h if n not in erisilemez]
    print(f"{sayi:6d} {len(oz) - sayi:11d} {100 * len(basarili) / sayi:12.1f}% "
          f"{100 / sayi:10.1f}p {sum(gec[n] for n in h) / sayi:8.1f} "
          f"{max(gec[n] for n in h):9d} {len(erisilemez - set(h)):11d} "
          f"{sum(c for n, c in agir.items() if n not in h):11d}")
```

```
özne 40 | ağır olay 22 | erişilemez özne 17 | gerçek hizmet erişilebilirliği 57.5%
gerçek gecikme: ortalama 23.4 ms, en yavaş 48 ms, en hızlı 6 ms

 hedef  sınanmayan  hizmet eriş.  çözünürlük  ort. ms  en yavaş  görünmeyen  kaçan ağır
     4          36         50.0%       25.0p     22.0        40          15          20
     8          32         37.5%       12.5p     21.6        40          12          15
    16          24         62.5%        6.2p     21.1        40          11          14
    32           8         56.2%        3.1p     26.0        48           3           3
    40           0         57.5%        2.5p     23.4        48           0           0
```

#### Temsil Edilmeyen Özne

Dört hedefli listede gösterge **50,0%** yazar. Bu sayının arkasında iki başarılı ve iki
başarısız sınama vardır — toplam dört gözlem. Aynı anda kırk öznenin **36**'sı hiç
sınanmamıştır, **15** erişilemez özne hiçbir sınamada görünmez ve **20** ağır olay
göstergeye hiç girmez.

Buradaki yapı ilk dersin sonucuyla aynıdır ve tersinden okunur. Orada rapor edilmeyen özne
gösterge tablosunda boşluk bırakıyordu; burada boşluk bile bırakmaz, çünkü gösterge tek bir
yüzdedir ve yüzdenin içinde boşluk görünmez. **Sınanmayan özne göstergeyi ne yükseltir ne
düşürür; göstergenin dışındadır.**

On altı hedefte sınanmayan özne **24**'e, otuz iki hedefte **8**'e iner. Görünmeyen erişilemez
özne aynı hızda azalmaz: 15, 12, 11, 3. Üçüncü satırda listenin genişlemesi hedef sayısını
ikiye katlar ama görünmeyen erişilemez özneyi yalnız birer birer düşürür — çünkü listeye
eklenen hedefler çoğunlukla zaten çalışan öznelerdir. Kapsamı büyütmek, kuyruğu orantılı
olarak küçültmez.

#### Göstergenin Kendi Gürültüsü

Sağdaki sütunlar kadar önemli olan şey soldaki yüzdenin nasıl davrandığıdır. Sınama listesi
büyürken gösterge sırasıyla **50,0**, **37,5**, **62,5**, **56,2** ve **57,5** okur. Gerçek
değer bütün pencere boyunca **57,5**'tir ve hiç değişmemiştir. Ağda hiçbir şey olmadan
gösterge **37,5 ile 62,5 arasında**, yani yirmi beş puanlık bir bantta salınmıştır.

Nedeni çözünürlük sütununda yazılıdır. Dört hedefli bir listede tek bir sınamanın sonucu
göstergeyi **25 puan** oynatır; sekiz hedefte **12,5**, kırk hedefte **2,5** puan. Bir uyarı
eşiği bu çözünürlüğün altına konursa uyarı ağı değil, listeyi ölçer.

Bunun doğrudan bir işletme sonucu vardır: **küçük hedef listesiyle hesaplanan bir hizmet
erişilebilirliği oranı, eğilim olarak okunamaz.** İki ardışık pencerede 50 ve 75 görülmesi
bir iyileşme değil, tek bir öznenin durum değiştirmesidir. Ölçünün bandı, bölenin
kendisidir.

#### Ortalamanın Gizlediği

Gecikme sütunları üçüncü bir kuyruk gösterir. Dört hedefte ölçülen ortalama **22,0 ms**, kırk
öznenin gerçek ortalaması **23,4 ms**. Aradaki fark küçüktür ve gösterge bu yüzden doğru
görünür.

Yanıltıcı olan sütun ortalama değil, **en yavaş** olandır. Dört, sekiz ve on altı hedefli
listelerin üçünde de ölçülen en yavaş değer **40 ms**'dir. Topluluğun gerçek en yavaş öznesi
ise **48 ms**'dir ve ancak otuz iki hedefli listede görünür. Yani gösterge, on altı hedefe
kadar kuyruğu sekiz milisaniye eksik bildirir ve bunu hiçbir belirti vermeden yapar.

Ortalama ile en yavaş arasındaki ilişki de tersine döner: otuz iki hedefte ortalama **26,0**
ms'ye **çıkar**, çünkü listeye yavaş özneler girmiştir. Gösterge kötüleşmiş görünür ama ağ
değişmemiştir; yalnız görüş alanı genişlemiştir. **Bir göstergenin kötüleşmesi, ölçtüğü
şeyin kötüleştiği anlamına gelmez.**

#### Sınamalar Bağımsız Değildir

Ölçüm her hedefi ayrı bir gözlem sayar ve yüzdeyi buna göre hesaplar. Sahada bu varsayım
yalnız kısmen tutar, çünkü sınamalar **aynı noktadan** başlar ve yolları ortaktır.

Bir sınama noktasından çıkan bütün hedefler ilk birkaç aygıtı paylaşır. Paylaşılan bir aygıt
bozulursa hedeflerin tümü birden başarısız olur ve gösterge **%0**'a düşer. Kırk öznenin
otuz dokuzu sağlam olsa bile tablo tam bir kesinti bildirir. Ters durum daha sinsidir:
sınama noktasından uzaktaki bir aygıt bozulduğunda ona giden hedef sayısı bir ya da iki
olduğu için gösterge yalnız birkaç puan düşer ve eşiğin altında kalır.

Bu yüzden tek noktadan ölçülen bir yüzde, bir **konum** hakkında bilgi vermez. Yüzdenin
düşmesi "ağın şu kadarı bozuk" demek değil, "bu noktadan bakınca şu kadarı görünmüyor"
demektir. Konumu ayırt etmenin yolu bölenle oynamak değil, **sınama noktasını çoğaltmaktır**:
aynı hedef listesi iki ayrı noktadan koşturulduğunda, yalnız bir noktadan başarısız olan
hedefler o noktaya özgü bir sorunu, iki noktadan da başarısız olanlar hedefin kendisindeki
bir sorunu gösterir.

Ölçümde bu ayrım modellenmedi; sınamalar bağımsız kabul edildi ve her hedefin sonucu yalnız
kendi durumundan geldi. Modellenseydi hizmet erişilebilirliği sütunundaki salınım **artardı**,
çünkü paylaşılan bir aygıtın durumu birden çok hedefi aynı yönde iterdi. Bağımsızlık
varsayımı göstergeyi olduğundan kararlı gösterir.

#### Etkin ve Edilgen Ölçüm

Yukarıdaki ölçüm **etkin ölçümdür**: sınama trafiğini ölçen taraf üretir. Bu konunun ilk üç
dersi ise **edilgen ölçümdü** — hiçbir paket eklenmeden, zaten var olan trafikten okunuyordu.
İkisinin kuyrukları ters yerlerdedir ve bu, dördünü birlikte okumanın gerekçesidir.

Edilgen ölçüm yalnız **konuşan** özneyi görür. Trafiği olmayan bir aygıt akış kaydı üretmez,
yakalamaya girmez ve bildirim göndermez; ilk derste kaybolan yirmi altı özne bu yüzden
kaybolmuştu. Buna karşılık edilgen ölçüm gerçek kullanıcı trafiğini ölçer: gördüğü gecikme,
birinin gerçekten yaşadığı gecikmedir.

Etkin ölçüm tersini yapar. Sınama trafiğini kendisi ürettiği için sessiz özneyi de ölçebilir;
listeye konan bir aygıt hiç kullanılmıyor olsa bile sınanır. Bedeli iki katlıdır. Ölçtüğü
gecikme kimsenin yaşamadığı bir gecikmedir — sınama paketleri gerçek yükün yolundan, gerçek
yükün boyutundan ve gerçek yükün sınıfından farklı olabilir. İkincisi, ölçüm **listeyle
sınırlıdır**: etkin ölçüm neyi ölçeceğini bilmek zorundadır, edilgen ölçüm ise bilmediğini de
görebilir.

İki yöntemin ortak boşluğu yoktur ve bu bir tesadüf değildir. Edilgen ölçümün göremediği özne
sessiz olandır; etkin ölçümün göremediği özne listede olmayandır. Bir aygıtın hem sessiz hem
listede olmaması ayrı bir eksikliktir ve envanterin kendisinden gelir. Aynı sonuç izleme
modellerinin karşılaştırmasında da çıkmıştı: **bağımsız kör noktalar üst üste konduğunda
kuyruk küçülür, ama envanterin görmediği özne hiçbirinde görünmez.**

#### Kuyruğu Daraltmak

Üç daraltma, göstergenin kimin adına konuştuğunu görünür kılar.

**Birinci daraltma — paydayı yazmak.** Gösterge tablosuna `hedef sayısı` ile birlikte
`envanterdeki özne` alanı konur. Dört hedefli bir listede tablo "%50, 4/40 özne" der ve
okuyan kişi neyin ölçülmediğini görür. Bu, hiçbir ölçüm eklemeden yapılan bir düzeltmedir.

**İkinci daraltma — çözünürlüğü eşiğe bağlamak.** Uyarı eşiği, listenin çözünürlüğünden
büyük seçilir. Dört hedefli bir liste için 25 puandan küçük bir eşik tanımlanamaz; tanımlanmak
isteniyorsa liste büyütülmelidir. Eşik ile bölen birlikte kararlaştırılır.

**Üçüncü daraltma — hedef listesini önceki derslerin çıktısıyla beslemek.** Telemetride hiç
görünmeyen özne, izlemede hiç raporlanmayan özne ve yakalamada hiç yakalanmayan özne, sınama
listesinin **ilk adaylarıdır**. Üç ders de kimin görünmediğini sayıyordu; bu ders o listenin
nereye yazılacağını söyler. Böyle beslenen bir liste, rastgele seçilmiş bir listeden daha
küçük olduğu hâlde daha çok kuyruk kapatır.

#### Özet

- Erişilebilirlik bir özne hakkındadır ve ikili sonuç verir; hizmet erişilebilirliği bir
  orandır ve kümesini sınama listesi belirler — liste bir kaldıraçtır.
- Dört hedefli listede gösterge **50,0%** yazarken kırk öznenin **36**'sı hiç sınanmaz,
  **15** erişilemez özne görünmez ve **20** ağır olay göstergeye hiç girmez.
- Liste genişledikçe sınanmayan özne 36'dan 0'a iner ama görünmeyen erişilemez özne aynı
  hızda azalmaz (15, 12, 11, 3): kapsamı büyütmek kuyruğu orantılı küçültmez.
- Gerçek değer **57,5%**'te sabitken gösterge **37,5** ile **62,5** arasında salınır;
  çözünürlük dört hedefte **25**, kırk hedefte **2,5** puandır ve uyarı eşiği bu bandın
  altına konamaz.
- Ölçülen en yavaş değer on altı hedefe kadar **40 ms**'de kalır, gerçek en yavaş **48
  ms**'dir; otuz iki hedefte ortalama yükselir çünkü ağ değil, görüş alanı değişmiştir.

#### Sonraki Adım

Bu konu boyunca dokunulan her kaldıraç **gözlemin** kaldıracıydı. Örnekleme oranı, zaman
aşımı eşiği, yakalama filtresi ve sınama listesi — dördü de neyin görüleceğini belirliyor,
ama ağın kendisine dokunmuyordu. Yanlış ayarlanmış bir örnekleme oranı bir aygıtı raporun
dışına düşürür; bir bağlantıyı düşürmez. Ölçünün bütün ağırlığı buradan geliyordu: kuyrukta
kalan özne zarar görmüyor, yalnız görünmüyordu.

Sonraki konu bu ayrımı kaldırır. Kaldıraç artık gözlemin değil, **yapılandırmanın kendisi**
olursa ne olur? Tek bir kural yine kırk özneye birden uygulanır, ama bu kez uygulandığı anda
aygıtların davranışı değişir ve kuyrukta kalan özne raporun dışına değil, hizmetin dışına
düşer.

## Otomasyon ve Bulut Ağı

Elle yapılandırmanın hata modları, aygıt yapılandırmasının veri modeliyle tanımı, protokol tabanlı yapılandırma erişimi, toplu değişiklik ve doğrulama, bulut ağının temel nesneleri, hibrit bağlantı seçenekleri ve laboratuvarda topoloji doğrulama.

### Ağ Otomasyonunun Gerekçesi

Source: https://academia.sh/tr/kurslar/ag-isletimi/ag-otomasyonunun-gerekcesi

Elle yapılandırmada hata dokunuş sayısıyla büyür: kırk aygıtta 122 alan dokunuşu 12 hata ve 10 hatalı aygıt üretir. Şablon dokunuşu 1'e indirir ama beklenen hatalı aygıt 9,76'dan 11,34'e çıkar ve şablonun dışında kalan altı aygıtlık kuyruk yerinde durur.

Önceki ders uçtan uca sağlık göstergelerini ölçtü ve buraya kadar dokunulan her kaldıraç
aynı türdendi: **gözlemin** kaldıracı. Örnekleme oranı, yakalama filtresi, sorgu aralığı —
üçü de ağın ne yaptığını değil, ağın ne kadarını gördüğümüzü belirliyordu. Yanlış ayarlanmış
bir örnekleme oranı bir aygıtı bozmaz, yalnızca gizler; kaldıracı geri çevirdiğinizde aygıt
oradadır.

Bu konu kaldıracı değiştiriyor. Kaldıraç artık **yapılandırmanın kendisi**. Yanlış yazılmış
bir şablon bir aygıtı gizlemez, onu değiştirir; ve değişiklik uygulandıktan sonra kaldıracı
geri çevirmek eski durumu geri getirmez, çünkü eski durum artık hiçbir yerde durmuyordur.
Bu dersin sorusu otomasyonun iyi bir fikir olup olmadığı değil — elle yapılandırmanın
hatasının **neyle** büyüdüğü, otomasyonun bu büyümeyi nasıl kestiği ve kestikten sonra
geriye **hangi kuyruğun** kaldığıdır.

#### Dokunuş: Elle Yapılandırmanın Birimi

Elle yapılandırmanın birimi aygıt değildir, **alandır**. Bir operatör kırk aygıtı
yapılandırırken kırk kez değil, her aygıtta o aygıtın gerektirdiği alan sayısı kadar karar
verir ve o kadar kez yazar. Aygıtlar birbirinin aynı olmadığı için bu sayı da aynı değildir.

```text
# ogretilen yapilandirma dokumu , calistirilmamistir

aygıt 14                          aygıt 33
  arayuz    : ana                   arayuz      : ana
  adres     : /24                   adres       : /24
  zamanlayici: 400 ms               oncelik     : etkilesim
                                    yerel_kural : var
```

İki aygıt, dört ve dört değil, üç ve dört alan. Kapasitesi yüksek olan aygıt bir bağlantı
toplama alanı ister, gecikmesi yüksek olan bir zamanlayıcı ister, etkileşim sınıfındaki bir
öncelik alanı ister ve şablonun dışında kalması gereken **özel** aygıt hiçbir şablonun
taşımadığı bir yerel kural ister. Yapılandırmanın toplam yüzeyi aygıt sayısı değil, bu
alanların toplamıdır.

Bunun doğrudan sonucu şudur: **elle yapılandırmada hata, aygıt sayısıyla değil, dokunuş
sayısıyla büyür** — ve dokunuş sayısı aygıt sayısıyla birlikte büyüdüğü için sonuç aynı
kapıya çıkar. Kırk aygıtlık bir değişiklik on aygıtlık bir değişikliğin dört katı hata
üretmez; dokunuş sayısı kaç katına çıktıysa o kadar katına çıkarır.

#### Elle Yapılandırmanın Hata Modları

Dört mod ayrılır ve dördü ayrı ayrı sayılabilir.

**Yanlış yazılan alan.** Değer yazılır, sözdizimi doğrudur, aygıt kabul eder ve yanlıştır.
Aygıt bir kusur bildirmez çünkü kusur yoktur; niyet ile yazılan arasındaki fark aygıtın
göremeyeceği bir farktır.

**Atlanan aygıt.** Kırk aygıtın otuz dokuzu değişir, biri değişmez. Bu aygıt uzun süre
çalışmaya devam eder ve fark ancak onu ötekilerden ayıran bir olay olduğunda görülür.

**Sıraya bağlı kısmi uygulama.** Değişiklik yarıda kesilirse aygıtların bir kısmı yeni, bir
kısmı eski yapılandırmayla kalır. Ağ bu iki kümenin arasında tutarsız davranır.

**Belge ile aygıtın ayrışması.** Yazılı yapılandırma bir yerde durur, aygıttaki gerçek
yapılandırma başka bir şeydir. Bu farka **yapılandırma sapması (configuration drift)** denir
ve Kablosuz Ağlar ve Ağ Güvenliği kursunda sınırın niyet edilen hâli ile gerçekten geçen
arasındaki fark olarak kuruldu. Burada aynı fark **yapılandırmanın kendisinde** ölçülür.

Dördünün ortak yanı, hiçbirinin aygıt tarafından bildirilmemesidir. Aygıt kendisine yazılanı
uygular; yazılanın doğru olup olmadığı aygıtın bilgisi dışındadır.

#### Şablon Tek Dokunuştur

Otomasyonun tek bir yapısal iddiası vardır: **dokunuş sayısını aygıt sayısından bağımsız
kılmak.** Yapılandırma bir kez yazılır, bir kez gözden geçirilir ve kırk aygıta bir işlemle
uygulanır. Yazılan şey komut dizisi değil, **istenen son durumdur** — bu yaklaşıma
**bildirimsel (declarative)** denir; aracın ne yapacağını değil, sonucun ne olacağını
tanımlar.

Kod olarak altyapı yordamının kendisi ve araç seçimi Kod Olarak Altyapı kursunun konusudur ve
burada tekrarlanmaz. Bu kursta nesne bir sunucu ya da bir bulut kaynağı değil, **ağ
aygıtıdır**; ve ölçülen şey yordamın verimi değil, **şablonun dışında kalan azınlıktır.**

Dokunuşu bire indirmenin bir bedeli var ve bedel hatanın yayılımıdır. Elle yapılandırmada
yanlış yazılan bir alan **bir** aygıtı bozar. Şablonda yanlış yazılan bir alan **kırk** aygıtı
birden bozar. Hata olasılığı düşmez, hatanın büyüklüğü değişir: elle yapılandırma çok sayıda
küçük hata üretir, şablon az sayıda çok büyük hata üretir.

Ölçümün varsayımları:

- **OT1** — Kırk aygıtlık özne kümesi kursun sabitidir ve bu derste değiştirilmez. Kâhin
  kurgunun kendisidir: hangi aygıtın özel olduğunu biz yazdığımız için biliriz.
- **OT2** — Bir aygıtın elle yazılması gereken alanları niteliklerinden türetilir: her
  aygıtta arayüz ve adres, etkileşim sınıfında öncelik, gecikmesi 30 birimin üstündeyse
  zamanlayıcı, kapasitesi 80 birimin üstündeyse toplama, özel aygıtta yerel kural.
- **OT3** — Elle yazılan her alanda hata olasılığı binde 80'dir ve alanlar bağımsızdır. Bu
  oran bir ölçüm değil, kurgunun varsayımıdır; değiştirilirse bütün satırlar aynı yönde
  ölçeklenir.
- **OT4** — Şablon dört alan taşır ve bir kez yazılır. Aynı alan başına oranla şablonun
  hatalı çıkma olasılığı hesaplanır; şablon hatalıysa kırk aygıtın kırkı birden hatalıdır.
- **OT5** — Şablon aygıtın sınıfına göre yazılır. Sınıfı şablonunkiyle uyuşmayan özel aygıt
  sapar; sapma aygıtın kusuru değil, şablonun kapsam kararıdır.
- **OT6** — Rapor etkileşim sınıfının göstergeleri üzerine kuruludur; başka sınıftaki bir
  sapma rapora hiç düşmez. Bu bir varsayımdır, bir ölçüm değil.

#### Ölçüm

```python
"""Elle yapilandirma ile sablonun hata modeli.

Bolum 1 - elle kampanya: dokunus sayisi ozne sayisiyla buyur, hata onunla.
Bolum 2 - sablon tek dokunustur; hata yayilir, beklenen sayi dusmez.
Bolum 3 - sablonun kendi kuyrugu: disinda kalan ve raporda gorunmeyen.
"""
TOHUM = 20260812
HATA_BINDE = 80


def uretec(tohum):
    d = tohum % 2147483646 + 1

    def r(n):
        nonlocal d
        d = (d * 48271) % 2147483647
        return d % n
    return r


def ozneler(sayi=40, tohum=TOHUM):
    r, liste = uretec(tohum), []
    for i in range(sayi):
        liste.append({"no": i + 1, "kapasite": 20 + r(81),
                      "gecikme": 5 + r(45),
                      "sinif": ("etkilesim", "toplu", "yedek")[r(3)],
                      "ozel": r(9) == 0})
    return liste


def alanlar(o):
    """Aygitin elle yazilmasi gereken yapilandirma alanlari."""
    a = ["arayuz", "adres"]
    if o["sinif"] == "etkilesim":
        a.append("oncelik")
    if o["gecikme"] > 30:
        a.append("zamanlayici")
    if o["kapasite"] >= 80:
        a.append("toplama")
    if o["ozel"]:
        a.append("yerel_kural")
    return a


def elle(oz, kac, tohum):
    """Kac aygita tek tek dokunulur; her alanda binde HATA_BINDE hata."""
    r, hatali = uretec(tohum), set()
    dokunus = hata = 0
    for o in oz[:kac]:
        for _ in alanlar(o):
            dokunus += 1
            if r(1000) < HATA_BINDE:
                hata += 1
                hatali.add(o["no"])
    return dokunus, hata, len(hatali)


def uygula(oz, sablon_sinifi):
    """Tek sablon kirk aygita uygulanir; ozel aygitlar sapar."""
    uyan = sapan = gizli = 0
    for o in oz:
        if o["sinif"] == sablon_sinifi or not o["ozel"]:
            uyan += 1
        else:
            sapan += 1
            if o["sinif"] != "etkilesim":
                gizli += 1
    return uyan, sapan, gizli


oz = ozneler()
oran = HATA_BINDE / 1000
print(f"özne {len(oz)} | elle yazılacak toplam alan "
      f"{sum(len(alanlar(o)) for o in oz)} | alan başına hata {oran:.3f}")
print()
print(f"{'kampanya':>9s} {'dokunuş':>8s} {'hata':>5s} {'hatalı aygıt':>13s} "
      f"{'dokunuş başına hata':>20s}")
for kac in (10, 20, 40):
    d, h, a = elle(oz, kac, TOHUM + 7)
    print(f"{kac:9d} {d:8d} {h:5d} {a:13d} {h / d:20.3f}")

print()
p = 1 - (1 - oran) ** 4
print(f"{'yordam':<12s} {'dokunuş':>8s} {'hatalı çıkma':>13s} "
      f"{'etkilenen aygıt':>16s} {'beklenen hatalı aygıt':>22s}")
d, h, a = elle(oz, 40, TOHUM + 7)
print(f"{'elle':<12s} {d:8d} {'-':>13s} {a:16d} {d * oran:22.2f}")
print(f"{'şablon':<12s} {1:8d} {p:13.3f} {len(oz):16d} {p * len(oz):22.2f}")

print()
print(f"{'şablon sınıfı':<14s} {'uyan':>6s} {'sapan':>6s} "
      f"{'raporda görünmeyen':>19s}")
for s in ("etkilesim", "toplu", "yedek"):
    u, sp, g = uygula(oz, s)
    print(f"{s:<14s} {u:6d} {sp:6d} {g:19d}")
```

```
özne 40 | elle yazılacak toplam alan 122 | alan başına hata 0.080

 kampanya  dokunuş  hata  hatalı aygıt  dokunuş başına hata
       10       30     3             3                0.100
       20       60     5             5                0.083
       40      122    12            10                0.098

yordam        dokunuş  hatalı çıkma  etkilenen aygıt  beklenen hatalı aygıt
elle              122             -               10                   9.76
şablon              1         0.284               40                  11.34

şablon sınıfı    uyan  sapan  raporda görünmeyen
etkilesim          34      6                   6
toplu              34      6                   3
yedek              34      6                   3
```

#### Elle Yapılandırmanın Ödettiği

Üst tablo iddiayı doğrudan veriyor. Kampanya on aygıttan kırk aygıta çıktığında dokunuş
**30**'dan **122**'ye, hata **3**'ten **12**'ye çıkıyor. Sağdaki sütun ise neredeyse sabit
kalıyor: dokunuş başına hata **0,100**, **0,083** ve **0,098**. Bu sabitlik ölçümün asıl
sonucudur — hata bir yetenek sorunu değil, **bir çarpma işlemidir**. Operatör daha dikkatli
olduğunda oran düşer; aygıt sayısı arttığında çarpan büyür ve dikkatin ne kadar düştüğünü
hiçbir gösterge söylemez.

Hatalı aygıt sayısı hata sayısından küçüktür: **12** hata **10** aygıta dağılıyor, yani iki
aygıt birden fazla yanlış alan taşıyor. Bu ayrım işletmede önemlidir çünkü onarımın birimi
aygıttır, alan değil; on aygıta dönmek gerekir, on ikisine değil.

Üç satırın hiçbirinde sıfır yok. Kampanya küçültülerek hata sıfırlanmıyor, yalnızca
küçültülüyor — ve küçültmenin bedeli aynı değişikliğin daha çok parçaya bölünmesidir.

#### Otomasyonun Ödettiği

Orta tablo iki yordamı yan yana koyuyor ve beklenmedik bir yerde buluşuyorlar. Elle
yapılandırma **122** dokunuşta **10** hatalı aygıt bırakıyor; beklenen değer **9,76**. Şablon
dokunuşu **1**'e indiriyor ama şablonun hatalı çıkma olasılığı **0,284**'tür ve şablon
hatalıysa etkilenen aygıt **40**'tır. Beklenen hatalı aygıt **11,34**.

Yani otomasyon beklenen hata sayısını **düşürmedi** — bu kurguda hafifçe yükseltti. Değişen
şey **dağılımdır**. Elle yapılandırma her seferinde on civarında hatalı aygıt üretir. Şablon
ise seferlerin çoğunda **sıfır**, kalanında **kırk** üretir. Aynı ortalama, bambaşka bir
işletme: birincisi sürekli ve dayanılabilir bir onarım yükü, ikincisi seyrek ama ağın
tamamını kapsayan bir olay.

Bu yüzden otomasyonun gerekçesi "daha az hata" değildir. Gerekçe üç yerdedir: hata
**tek bir yerde** durur ve orada gözden geçirilebilir; değişiklik **uygulanmadan önce**
sınanabilir; ve uygulandıktan sonra **aynı biçimde geri alınabilir**. Elle yapılandırmada
bunların üçü de yoktur, çünkü niyetin yazılı bir hâli yoktur.

#### Otomasyonun Kaldırmadığı Kuyruk

Alt tablo bu dersin asıl sonucunu taşıyor ve konu boyunca değişmeden kalacak. Şablon hangi
sınıfa göre yazılırsa yazılsın uyan aygıt **34**, sapan aygıt **6**'dır. Kırk aygıtın
dokuzu özeldir ve şablonun sınıfıyla uyuşan üçü dışında kalan **altısı** her seferinde
kaldıracın dışında kalır. Sapan sayısı kaldıracın niteliğine göre değişmiyor — çünkü sapma
şablonun yanlış yazılmasından değil, **tek bir şablonun kırk farklı aygıtı temsil etme
iddiasından** doğuyor.

Sağdaki sütun ise değişiyor: raporda görünmeyen sapan **6**, **3** ve **3**. Etkileşim
sınıfına göre yazılan şablonda sapanların hepsi başka sınıflardadır ve raporda **hiçbiri**
görünmez; öteki iki şablonda altının yarısı görünür. Kuyruğun büyüklüğü sabittir, **görünen
kısmı değildir.** Bu ayrım konunun eksenidir ve dördüncü derste tam olarak ödenecektir.

Kırk öznelik bir kümede ölçülebilen en küçük fark **1/40 = 0,025**'tir. Altı ile üç
arasındaki fark bunun yüz yirmi katıdır ve ölçüm bandının rahatça içindedir.

#### Envanterin Sınırı

Yukarıdaki üç tablo aynı sessiz kabulü paylaşıyor: kırk aygıtın kırkı da biliniyor. Ölçüm
kırk özne üzerinde koşuyor çünkü özne kümesi kurgunun kendisi; işletmede bu küme bir
**envanterden** gelir ve envanter de elle ya da bir keşif yordamıyla yazılmıştır.

Bunun sonucu hem elle yordamı hem otomasyonu ilgilendirir. Envanterde olmayan bir aygıta
operatör dokunmaz, şablon da dokunmaz. Elle yapılandırmada bu aygıt en azından bir gün birine
görünme şansı taşır — biri onu yanlışlıkla bulur. Şablonla yönetilen bir ağda ise aygıt hiçbir
raporda, hiçbir uygulama özetinde ve hiçbir sapma listesinde geçmez; çünkü bütün bu belgeler
envanteri gezerek üretilir. **Kaldıraç envanterin dışına uzanmaz ve envanterin dışında kaldığı
için de kimseye bunu bildirmez.**

Bu, kaldıracın kuyruğunun ikinci biçimidir. Birincisi ölçtüğümüz altı sapan aygıttı: bilinen
ama şablona sığmayan azınlık. İkincisi hiç bilinmeyen azınlıktır ve bu dersin kurgusunda
sayısı sıfırdır, çünkü envanteri biz yazdık. Gerçek bir ağda o sayı sıfır değildir ve ölçüsü,
envanterin bağımsız bir keşifle karşılaştırılmasıdır — bir kaldıracın ne yaptığını yine başka
bir kaldıraçla sorarız.

#### Geri Alınamazlık ve Üç Koruma

Bu konudaki her toplu değişiklik **geri alınamaz bir işlemdir**: kırk aygıta uygulanan bir
şablon, uygulandığı anda kırk aygıttaki önceki durumu siler. Bir aygıtın yapılandırmasını
boşaltan, arayüzünü kapatan ya da yönetim erişimini kesen bir değişiklik ağı ikiye bölebilir
ve bölünmüş ağın öteki yarısına ulaşıp düzeltme yapmak mümkün olmayabilir. Böyle bir
değişikliğin komutu bu kursta **çalıştırılabilir biçimde yazılmaz**; yazılan şey ne yaptığı
ve geri alınamaz olduğudur.

Buna karşı üç koruma vardır ve üçü birlikte kullanılır.

**Kuru çalışma (dry run)** değişikliği uygulamadan sonucunu hesaplar: hangi aygıtta hangi
alanın değişeceğini önceden listeler. Yukarıdaki altı sapan aygıtı raporun göremediği yerde
bile gösterebilen tek yordam budur, çünkü kuru çalışma raporu değil **niyeti** aygıtın gerçek
durumuyla karşılaştırır.

**Kademeli yayma (staged rollout)** değişikliği kırk aygıta birden değil, dilimler hâlinde
uygular. Amaç hatayı önlemek değil, hatanın etkilediği aygıt sayısını sınırlamaktır.

**Geri alma (rollback)** önceki durumun uygulanabilir bir kopyasını saklar. Kopya yoksa geri
alma yoktur; bu yüzden geri alma bir işlem değil, değişiklikten **önce** verilmiş bir
karardır.

Kimlik bilgisi, anahtar ve erişim belirteci bu konudaki hiçbir örnekte yazılmaz; aygıta
erişimin nereden geldiği işletmenin ayrı bir kararıdır ve yapılandırma metninin içinde
durmaz.

#### Özet

- Elle yapılandırmanın birimi aygıt değil alandır; kırk aygıt **122** alan dokunuşu ister ve
  hata dokunuş sayısıyla büyür — **30/60/122** dokunuşta **3/5/12** hata.
- Dokunuş başına hata oranı **0,100 / 0,083 / 0,098** ile neredeyse sabit kalır; hata bir
  yetenek sorunu değil, dokunuş sayısıyla yapılan bir çarpmadır.
- Şablon dokunuşu **1**'e indirir ama hatayı yayar: beklenen hatalı aygıt **9,76**'dan
  **11,34**'e çıkar. Değişen şey ortalama değil, dağılımdır — çoğu seferde **0**, kalanında
  **40**.
- Otomasyonun gerekçesi az hata değil; niyetin tek bir yerde durması, uygulanmadan
  sınanabilmesi ve aynı biçimde geri alınabilmesidir.
- Şablon hangi sınıfa göre yazılırsa yazılsın uyan **34**, sapan **6**'dır; değişen tek şey
  raporda görünmeyen sapanın **6**, **3** ve **3** olmasıdır.

#### Sonraki Adım

Bu dersin şablonu bir kabul üzerine kuruluydu: kırk aygıtın yapılandırması **aynı alanlarla**
tarif edilebilir. Ölçüm bu kabulün altısında tutmadığını gösterdi ve nedeni alan listesindeki
son satırdı — özel aygıtın istediği yerel kural, hiçbir şablonun taşımadığı bir alandı.
Sonraki ders bu alanın peşine düşer: aygıt yapılandırması bir veri modeliyle tanımlandığında
model neyi temsil edebilir, hangi aygıt modele sığmaz ve modelin dışında kalan alan nereye
gider.

### Yapılandırma Modelleri

Source: https://academia.sh/tr/kurslar/ag-isletimi/yapilandirma-modelleri

Aygıt yapılandırması bir veri modeliyle tanımlandığında model genişledikçe kapsanan alan 80'den 113'e çıkar ve eksik temsil edilen aygıt 30'dan 9'a iner; kalan dokuz alan hiçbir modele girmez çünkü değer kaynağı aygıtın kendisidir.

Önceki ders şablonu bir kabul üzerine kurdu: kırk aygıtın yapılandırması aynı alanlarla
tarif edilebilir. Ölçüm bu kabulün tutmadığı yeri de gösterdi — alan listesindeki son satır,
özel aygıtın istediği yerel kuraldı ve hiçbir şablon onu taşımıyordu. O satırın nereye
gittiği açıkta kaldı.

Bu dersin sorusu tam olarak odur. Bir aygıtın yapılandırması metin olmaktan çıkıp bir **veri
modeliyle** tanımlandığında, model neyi temsil edebilir? Hangi aygıt modele sığmaz? Ve
modelin dışında kalan alan yok mu olur, yoksa gözden mi kaybolur? Ölçülen şey modelin
kapsadığı değil, **kapsamadığıdır**.

#### Model Bir Sözleşmedir

Elle yapılandırmanın çıktısı bir metindir ve metnin anlamı onu okuyan aygıtın içindedir.
Aynı metni iki ayrı yönetim aracı, iki ayrı biçimde yorumlayabilir; hangisinin haklı olduğunu
söyleyecek bir yer yoktur.

**Yapılandırma modeli (configuration model)** bu boşluğu kapatır. Model, yapılandırmanın
hangi alanlardan oluştuğunu, her alanın türünü, hangi koşulda zorunlu olduğunu ve hangi
değer aralığını kabul ettiğini **aygıttan bağımsız** bir yerde bildirir. Bildirimsel
yapılandırmanın "istenen son durum" dediği şey, ancak böyle bir modelle yazılabilir; model
yoksa istenen durumun yazılacağı bir dilbilgisi de yoktur.

Modelin üç işi vardır. **Doğrulama:** modele uymayan bir yapılandırma aygıta gönderilmeden
reddedilir. **Karşılaştırma:** iki yapılandırma alan alan karşılaştırılabilir, çünkü ikisi de
aynı alan kümesiyle yazılmıştır — yapılandırma sapması ancak bu karşılaştırmayla ölçülebilir.
**Üretim:** aynı model üzerinden farklı aygıtlar için farklı değerler üretilebilir.

```text
# ogretilen model semasi , calistirilmamistir

aygit:
  arayuz      : metin       , zorunlu                        , ortak deger
  adres       : adres       , zorunlu                        , aygita ozgu
  oncelik     : sayi 0-7    , sinif etkilesim ise zorunlu    , ortak deger
  zamanlayici : sayi (ms)   , gecikme esigin ustundeyse zor. , aygita ozgu
  toplama     : liste       , kapasite esigin ustundeyse zor., ortak deger
  # yerel_kural : modelde karsiligi yok
```

Şemanın son satırı yorum içinde duruyor ve bu dersin ölçtüğü şey odur.

#### Değerin Kaynağı: Üç Sınıf

Bir alanın modelde bulunması, o alanın değerinin nereden geleceğini söylemez. Üç kaynak
ayrılır ve ayrım modelin sınırını belirler.

**Ortak değer.** Alan bütün aygıtlarda aynıdır. Şablon değeri bir kez taşır ve kırk aygıta
aynı değeri yazar. Bu, kaldıracın en verimli çalıştığı yerdir.

**Aygıta özgü değer.** Alan modelde vardır ama değeri aygıdın kendi niteliğinden türer —
adres envanterden gelir, zamanlayıcı gecikmeden hesaplanır. Şablon burada bir değer değil,
bir **kural** taşır; kural kırk kez ayrı ayrı çalıştırılır. Kaldıraç hâlâ tektir, çıktısı
kırk ayrı değerdir.

**Temsil edilemez alan.** Alanın modelde karşılığı yoktur ve olamaz. Bir aygıtın yalnız
kendisine ait bir kuralı modele eklemek, modeli kırk ayrı şekle sokardı; o noktada model bir
sözleşme olmaktan çıkıp kırk ayrı yapılandırmanın toplamı olurdu. Modelin dışında kalan alan
bir eksiklik değil, **modelin tanımının sonucudur**.

Ölçümün varsayımları:

- **OT7** — Kırk aygıtlık özne kümesi kursun sabitidir ve değiştirilmez; alan türetimi önceki
  dersteki kuralın aynısıdır.
- **OT8** — Model bir alan adı kümesidir. Bir aygıt, ancak gerektirdiği bütün alanlar modelde
  varsa **tam temsil** edilir; tek bir alanı eksikse eksik temsil edilir.
- **OT9** — Üç model genişliği iç içedir: her biri bir öncekinin üstüne alan ekler, hiçbiri
  alan çıkarmaz. Genişlik sırası çekirdek, genişletilmiş, tam.
- **OT10** — `yerel_kural` hiçbir modelde yoktur. Bu bir kusur değil kurgunun kararıdır;
  gerekçesi yukarıdaki üçüncü sınıftır.
- **OT11** — Her alanın tek bir değer kaynağı vardır: ortak, aygıta özgü ya da temsil
  edilemez. Kaynak alanın adına bağlıdır, aygıta göre değişmez.
- **OT12** — Şablon aygıtın sınıfına göre yazılır ve rapor etkileşim sınıfı üzerine
  kuruludur; sınıfı uyuşmayan özel aygıt sapar, başka sınıftaki sapma rapora düşmez.

#### Ölçüm

```python
"""Yapilandirma modeli: modelin temsil edemedigi aygit.

Bolum 1 - uc model genisligi: kapsanan alan, disarida kalan alan ve aygit.
Bolum 2 - alanin deger kaynagi: ortak, aygita ozgu, temsil edilemez.
Bolum 3 - kuyruk: sablonun disinda kalan ve raporda gorunmeyen.
"""
TOHUM = 20260812
KAYNAK = {"arayuz": "ortak", "adres": "aygıta özgü", "oncelik": "ortak",
          "zamanlayici": "aygıta özgü", "toplama": "ortak",
          "yerel_kural": "temsil edilemez"}
MODELLER = {
    "çekirdek": ("arayuz", "adres"),
    "genişletilmiş": ("arayuz", "adres", "oncelik", "zamanlayici"),
    "tam": ("arayuz", "adres", "oncelik", "zamanlayici", "toplama"),
}


def uretec(tohum):
    d = tohum % 2147483646 + 1

    def r(n):
        nonlocal d
        d = (d * 48271) % 2147483647
        return d % n
    return r


def ozneler(sayi=40, tohum=TOHUM):
    r, liste = uretec(tohum), []
    for i in range(sayi):
        liste.append({"no": i + 1, "kapasite": 20 + r(81),
                      "gecikme": 5 + r(45),
                      "sinif": ("etkilesim", "toplu", "yedek")[r(3)],
                      "ozel": r(9) == 0})
    return liste


def alanlar(o):
    """Aygitin yapilandirmasinin gerektirdigi alanlar."""
    a = ["arayuz", "adres"]
    if o["sinif"] == "etkilesim":
        a.append("oncelik")
    if o["gecikme"] > 30:
        a.append("zamanlayici")
    if o["kapasite"] >= 80:
        a.append("toplama")
    if o["ozel"]:
        a.append("yerel_kural")
    return a


def olc(oz, model):
    """Modelin kapsadigi ve disarida biraktigi alan ile aygit sayisi."""
    kapsanan = disarida = tam = eksik = 0
    for o in oz:
        d = [a for a in alanlar(o) if a not in model]
        kapsanan += len(alanlar(o)) - len(d)
        disarida += len(d)
        if d:
            eksik += 1
        else:
            tam += 1
    return kapsanan, disarida, tam, eksik


def uygula(oz, sablon_sinifi):
    """Tek sablon kirk aygita uygulanir; ozel aygitlar sapar."""
    uyan = sapan = gizli = 0
    for o in oz:
        if o["sinif"] == sablon_sinifi or not o["ozel"]:
            uyan += 1
        else:
            sapan += 1
            if o["sinif"] != "etkilesim":
                gizli += 1
    return uyan, sapan, gizli


oz = ozneler()
toplam = sum(len(alanlar(o)) for o in oz)
print(f"özne {len(oz)} | toplam alan örneği {toplam} | ayrı alan adı "
      f"{len(KAYNAK)} | özel aygıt {sum(o['ozel'] for o in oz)}")
print()
print(f"{'model':<14s} {'alan adı':>9s} {'kapsanan':>9s} {'dışarıda':>9s} "
      f"{'tam temsil':>11s} {'eksik temsil':>13s}")
for ad, model in MODELLER.items():
    k, d, t, e = olc(oz, model)
    print(f"{ad:<14s} {len(model):9d} {k:9d} {d:9d} {t:11d} {e:13d}")

print()
print(f"{'alan':<13s} {'aygıt':>6s} {'değer kaynağı':>16s} "
      f"{'ilk kapsayan model':>19s}")
for alan, kaynak in KAYNAK.items():
    sayi = sum(1 for o in oz if alan in alanlar(o))
    ilk = next((ad for ad, m in MODELLER.items() if alan in m), "yok")
    print(f"{alan:<13s} {sayi:6d} {kaynak:>16s} {ilk:>19s}")

print()
for kaynak in ("ortak", "aygıta özgü", "temsil edilemez"):
    sayi = sum(1 for o in oz for a in alanlar(o) if KAYNAK[a] == kaynak)
    print(f"{kaynak:<16s} alan örneği {sayi:4d}  toplamın {sayi / toplam:.3f} payı")

print()
print(f"{'şablon sınıfı':<14s} {'uyan':>6s} {'sapan':>6s} "
      f"{'raporda görünmeyen':>19s}")
for s in ("etkilesim", "toplu", "yedek"):
    u, sp, g = uygula(oz, s)
    print(f"{s:<14s} {u:6d} {sp:6d} {g:19d}")
```

```
özne 40 | toplam alan örneği 122 | ayrı alan adı 6 | özel aygıt 9

model           alan adı  kapsanan  dışarıda  tam temsil  eksik temsil
çekirdek               2        80        42          10            30
genişletilmiş          4       105        17          23            17
tam                    5       113         9          31             9

alan           aygıt    değer kaynağı  ilk kapsayan model
arayuz            40            ortak            çekirdek
adres             40      aygıta özgü            çekirdek
oncelik           11            ortak       genişletilmiş
zamanlayici       14      aygıta özgü       genişletilmiş
toplama            8            ortak                 tam
yerel_kural        9  temsil edilemez                 yok

ortak            alan örneği   59  toplamın 0.484 payı
aygıta özgü      alan örneği   54  toplamın 0.443 payı
temsil edilemez  alan örneği    9  toplamın 0.074 payı

şablon sınıfı    uyan  sapan  raporda görünmeyen
etkilesim          34      6                   6
toplu              34      6                   3
yedek              34      6                   3
```

#### Modelin Kapatabildiği

Üst tablo modeli genişletmenin ne kazandırdığını veriyor. İki alanlı **çekirdek** model
kırk aygıtın yalnız **10**'unu tam temsil ediyor; **30** aygıtın en az bir alanı modelin
dışında kalıyor ve dışarıda kalan alan örneği **42**. Model dört alana çıktığında dışarıda
kalan alan **17**'ye, eksik temsil edilen aygıt **17**'ye iniyor. Beş alanlı **tam** modelde
dışarıda kalan alan **9**, eksik temsil edilen aygıt **9**.

Kazancın biçimi öğreticidir. İki alandan dört alana geçiş dışarıda kalan alanı **42**'den
**17**'ye indiriyor — yirmi beş alanlık bir kazanç, iki alan karşılığında. Dört alandan beş
alana geçiş ise yalnız **8** alan kazandırıyor. Modelin her yeni alanı bir öncekinden daha az
aygıtı ilgilendirir, çünkü alanlar aygıtlara eşit dağılmaz: arayüz ve adres kırk aygıtta,
zamanlayıcı **14**, öncelik **11**, toplama **8** aygıtta gerekli.

Bu, model tasarımının pratik kuralını verir. Modeli genişletme kararı alan sayısına değil,
**o alanın kaç aygıtı eksik temsilden çıkardığına** bakarak verilir; ve bu sayı her adımda
küçülür.

#### Modelin Kapatamadığı

Son satırda dışarıda kalan alan **9**'da duruyor ve modeli genişleterek buradan aşağı
inilemiyor. Orta tablo nedenini söylüyor: `yerel_kural` alanının ilk kapsayan modeli **yok**.
Bu dokuz alan örneği, kırk aygıtın **9** özel aygıdına aittir ve her biri yalnız kendi
aygıdına anlamlıdır.

Alt tablo aynı şeyi paya çevirerek gösteriyor. Yüz yirmi iki alan örneğinin **59**'u ortak
değerli — toplamın **0,484**'ü. **54**'ü aygıta özgü, yani modelde tanımlı ama değeri kırk
kez ayrı hesaplanan alanlar; payı **0,443**. Geriye kalan **9** alan örneği, toplamın
**0,074**'ü, hiçbir modele girmiyor.

Bu üç payın toplamı modelin ne olduğunu tarif ediyor. Kaldıracın gerçekten tek bir değer
taşıdığı kısım toplamın yarısına bile ulaşmıyor. İkinci pay kaldıracın bir kural taşıyıp
kırk ayrı sonuç ürettiği kısım — burada model çalışıyor ama tek bir değeri kırk aygıta
yazmanın sadeliği yok. Üçüncü pay ise kaldıracın hiç uzanmadığı yer.

Alt tablonun sonuncu satırları bunun şablon tarafındaki karşılığını veriyor: şablon hangi
sınıfa göre yazılırsa yazılsın uyan **34**, sapan **6**. Sapan altı aygıdın hepsi özeldir,
yani hepsi `yerel_kural` taşır. Ama dikkat edilmesi gereken şey ötekilerdir: dokuz özel
aygıdın **üçü** her seferinde şablonun sınıfına uyar ve şablonu **alır** — modelin temsil
edemediği bir alanı taşıdıkları hâlde. Raporda görünmeyen sapan yine **6**, **3** ve **3**.

#### Modelin İki Yönlü Sınırı

Ölçüm modelin bir yönünü sayıyor: aygıdın istediği alan modelde yok. Sınırın ikinci yönü de
vardır ve bu kurguda ölçülmez — **modelin bildirdiği alanı aygıt kabul etmez.** Model beş
alan tanımlar, aygıt bunların dördünü tanır ve beşincisini reddeder; ya da tanır ama
modelin izin verdiği aralığın tamamını kabul etmez.

İki yön aynı sonucu vermez. Birinci yöndeki eksiklik **yazma anında** bellidir: model
yazılırken alanın orada olmadığı görülür ve karar bilinçli verilir. İkinci yöndeki eksiklik
ise **uygulama anında** ortaya çıkar ve kırk aygıtın hepsinde aynı anda çıkmaz — alanı kabul
eden aygıtlar değişir, etmeyenler değişmez. Sonuç, önceki derste sayılan hata modlarından
biridir: sıraya bağlı kısmi uygulama. Ağın bir kısmı yeni, bir kısmı eski yapılandırmayla
kalır ve ikisi arasında tutarsız davranır.

Bu yüzden modelin doğrulaması iki aşamalıdır. Birinci aşama modelin kendi içinde tutarlı
olup olmadığına bakar ve aygıta hiç gitmez. İkinci aşama, modelin belirli bir aygıtta
uygulanabilir olup olmadığını sorar ve bu ancak aygıta sorularak öğrenilir. İkinci aşamayı
uygulamadan önce yapmanın adı sonraki derslerde ölçülecek olan kuru çalışmadır; modelin
kendi doğrulaması onun yerine geçmez.

#### Model Dışı Alan Nereye Gider

Modelin dışında kalan alan yok olmaz; aygıtta durmaya devam eder. İki politika vardır ve
ikisi de bir yüzey açar.

**Dokunmama politikası.** Yönetim aracı modelin tanımadığı alana hiç dokunmaz. Aygıtın
yapılandırması ikiye bölünür: modelle yönetilen kısım ve elle yönetilen kısım. Bu kurguda
elle kalan **9** alan örneğidir. Yapılandırma sapması tam olarak bu bölgede yaşar, çünkü
karşılaştırma yalnız modelin bildiği alanlarda yapılabilir — model bilmediği bir alanın
değiştiğini göremez.

**Serbest alan politikası.** Model, tanımadığı yapılandırmayı taşımak için yapısı olmayan bir
alan bulundurur ve içeriği olduğu gibi aygıta yazar. Alan artık taşınır ama **doğrulanmaz**:
tür denetimi, aralık denetimi ve karşılaştırma bu alanda çalışmaz. Dokuz alan örneği modelin
içinde görünür, modelin verdiği güvencelerin hiçbirini almaz.

Sayılan yüzey ve daraltmalar şunlardır.

**Birinci yüzey — doğrulanmayan yapılandırma metni.** Serbest alan, doğrulamadan geçmeden
kırk aygıta ulaşabilecek bir yoldur; içeriğindeki bir hata modelin hiçbir denetimine
takılmaz. **Daraltma:** serbest alan aygıt başına adlandırılır ve yalnız o aygıtta geçerli
kılınır; içeriği şablonun değil, aygıtın envanter kaydının parçası olur. Böylece bir yerdeki
hata bir aygıtta kalır.

**İkinci yüzey — modelin göremediği bölge.** Dokunmama politikasında aygıdın bir kısmı hiçbir
karşılaştırmaya girmez ve o bölgedeki yapılandırma sapması sessizdir. **Daraltma:**
yönetilmeyen bölgenin sınırı modelde açıkça bildirilir ve bu bölgenin varlığı raporun bir
satırına dönüştürülür — "şu aygıtta şu kadar alan yönetim dışıdır" satırı, sapmanın kendisini
göstermese de **nerede olabileceğini** gösterir.

**Üçüncü yüzey — modele giren gizli bilgi.** Kimlik bilgisi, anahtar ve erişim belirteci
yapılandırma modelinin içinde taşınmaz. Model bir depoda durur, karşılaştırılır, kopyalanır
ve gözden geçirilir; bu işlemlerin hiçbiri gizli bir değer için uygun değildir. **Daraltma:**
model yalnız bir **başvuru** taşır ve değerin kendisi ayrı bir yerde durur; hangi yerde
durduğu işletmenin ayrı bir kararıdır ve bu kursun konusu değildir.

#### Özet

- Yapılandırma modeli alanların adını, türünü ve zorunluluğunu aygıttan bağımsız bildirir;
  doğrulama, karşılaştırma ve üretim ancak bu bildirimle yapılabilir.
- Model genişledikçe kapsanan alan **80 → 105 → 113**, eksik temsil edilen aygıt
  **30 → 17 → 9** olur; her yeni alanın kazancı bir öncekinden küçüktür.
- Alanların değer kaynağı üçe ayrılır: ortak **59** örnek (**0,484**), aygıta özgü **54**
  örnek (**0,443**), temsil edilemez **9** örnek (**0,074**).
- Dokuz alan hiçbir modele girmez çünkü değeri yalnız kendi aygıdına anlamlıdır; modeli
  oraya kadar genişletmek, modeli kırk ayrı yapılandırmanın toplamına çevirirdi.
- Şablon tarafında uyan **34**, sapan **6**, raporda görünmeyen **6 / 3 / 3**; dokuz özel
  aygıdın **üçü** ise şablonu alır ve modelin temsil edemediği alanı taşımaya devam eder.

#### Sonraki Adım

Bu ders modelin ne söyleyebildiğini ölçtü ve modelin yazıldığı yerde durduğunu varsaydı.
Oysa modelin bir işe yaraması için aygıta ulaşması gerekir: bir yerden bir istek gider,
aygıt onu alır, uygular ve bir yanıt döner. Bu yolun kendi kuralları vardır ve en önemlisi
şudur — aynı isteği iki kez göndermek ne yapar? Sonraki ders yapılandırmaya erişimi sağlayan
programlanabilir arayüzleri ve arayüzün **etkisiz** olup olmamasının kırk aygıtta ne
değiştirdiğini ölçer.

### Programlanabilir Arayüzler

Source: https://academia.sh/tr/kurslar/ag-isletimi/programlanabilir-arayuzler

Aynı değişiklik üç istek biçimiyle uygulandığında ekleme biçimi kırk aygıtın kırkında ikinci uygulamada durumu değiştirir; yanıt alınamayan dokuz aygıt yeniden denendiğinde ekleme beşini bozar, etkisiz iki biçim hiçbirini bozmaz ama tam değişim dokuz aygıtın model dışı alanını siler.

Önceki ders yapılandırma modelinin ne söyleyebildiğini ölçtü ve modelin yazıldığı yerde
durduğunu varsaydı. Model bir işe yaraması için aygıta ulaşmak zorundadır: bir yerden bir
istek gider, aygıt onu alır, uygular ve bir yanıt döner. Bu yolun kendi kuralları vardır.

En önemlisi tek bir soruda toplanır: **aynı isteği iki kez göndermek ne yapar?** Soru
kuramsal görünür ama işletmede en sık karşılaşılan durumdan doğar — yanıt gelmez ve operatör
isteğin uygulanıp uygulanmadığını bilemez. Bu dersin ölçtüğü şey arayüzün hızı ya da
zarafeti değil, bu sorunun yanıtıdır.

#### Arayüz Ne Sağlar

Bir aygıta yapılandırma göndermenin en eski yolu, bir kabuk oturumu açıp komut yazmaktır.
Bu yolun otomasyon açısından üç kusuru vardır ve üçü de aynı kökten gelir: **çıktı insan için
biçimlendirilmiştir.**

Bir betik, komutun başarılı olup olmadığını ancak çıktı metnini ayrıştırarak anlayabilir.
Metnin biçimi değişirse betik sessizce yanlış okur. Hata durumunda dönen şey bir hata
kodu değil, bir cümledir. Ve birden çok komutun birlikte uygulanması diye bir kavram yoktur —
üçüncü komut kabul edilmezse ilk ikisi çoktan yürürlüktedir.

**Programlanabilir arayüz (programmable interface)** üçünü birden kapatır. İstek de yanıt da
önceki dersin modeline göre yapılandırılmıştır; alanlar adlarıyla gelir ve ayrıştırılacak bir
metin yoktur. Hata, işlenebilir bir yapı olarak döner: hangi alanın hangi kısıtı çiğnediği
bildirilir. Ve değişiklik bir **işlem sınırı** içine alınabilir — istek önce **aday
yapılandırma** olarak biriktirilir, doğrulanır, sonra tek bir adımda yürürlüğe alınır.

```text
# ogretilen istek/yanit dokumu , calistirilmamistir

istek
  hedef  : aygit/34
  islem  : birlestir
  govde  : { oncelik: 3 , kural: [ taban , sablon_kurali ] }

yanit
  durum  : kabul
  degisen: [ oncelik , kural ]
  islem  : 7f
```

Yanıttaki `degisen` listesi arayüzün en çok işe yarayan alanıdır: aygıt neyin gerçekten
değiştiğini söyler. Liste boş dönerse istek uygulanmış ama hiçbir şeyi değiştirmemiştir —
yani aygıt zaten istenen durumdaydı.

#### Üç İstek Biçimi

Aynı değişiklik üç ayrı biçimde istenebilir ve üçü aygıtta aynı sonucu bırakmaz.

**Ekleme.** İstek "şu kuralı listeye ekle" der. Aygıt listeye bir satır daha koyar. İki kez
gönderilirse liste iki satır alır.

**Birleştirme.** İstek "şu alanların değeri şudur" der. Aygıt alanları anahtarlarına göre
eşler ve üzerine yazar; listelerde aynı girdiyi yinelemez. İki kez gönderilirse ikincisi
hiçbir şey değiştirmez.

**Tam değişim.** İstek yapılandırmanın tamamını verir. Aygıt kendisindekini atar ve isteği
neyse onu kurar. İki kez gönderilirse ikincisi hiçbir şey değiştirmez — ama ilk gönderim,
istekte bulunmayan her alanı da silmiştir.

Bir arayüzün **etkisiz (idempotent)** olması budur: isteği bir kez uygulamakla iki kez
uygulamak aynı durumu bırakıyorsa arayüz etkisizdir. Etkisizlik bir hız ya da doğruluk
özelliği değildir; **yeniden denenebilirlik** özelliğidir.

#### Yanıt Kaybı ve Yeniden Deneme

Etkisizliğin neden bir işletme sorunu olduğu tek bir kurguda görülür. İstek gönderilir, aygıt
onu alır ve uygular, ama yanıt geri dönerken kaybolur. Operatörün elinde hiçbir bilgi yoktur:
istek aygıta hiç ulaşmamış da olabilir, uygulanmış da olabilir. İkisi dışarıdan
ayırt edilemez.

Bu durumda yapılabilecek tek şey yeniden denemektir. Etkisiz bir arayüzde yeniden deneme
bedelsizdir — istek uygulanmışsa ikincisi hiçbir şey yapmaz, uygulanmamışsa uygular. Etkisiz
olmayan bir arayüzde ise yeniden deneme, **başarılı olmuş aygıtları bozar**. Ve bozulanlar
tam olarak isteğin çalıştığı aygıtlardır.

Ölçümün varsayımları:

- **OT13** — Kırk aygıtlık özne kümesi kursun sabitidir. Her aygıtın değişiklikten önceki
  durumu niteliklerinden türetilir: arayüz, adres ve bir taban kuralı; özel aygıtta ek olarak
  modelin taşımadığı yerel kural.
- **OT14** — Üç istek biçimi **aynı** değişikliği taşır: bir kural eklemek ve önceliği
  ayarlamak. Fark yalnız isteğin biçimindedir, içeriğinde değil.
- **OT15** — Etkisizlik ölçütü durumların karşılaştırılmasıdır: isteği bir kez uygulamakla
  iki kez uygulamak aynı durumu bırakıyorsa arayüz etkisizdir. Ölçüm arayüzün kendi
  bildirimine bakmaz.
- **OT16** — Yanıt kaybı kurgunun parametresidir: her beş aygıttan birinde yanıt alınamaz ve
  yanıtsız kalanların yaklaşık yarısında istek aslında uygulanmıştır. Bu bir ölçüm değildir;
  oran değişirse satırlar aynı yönde ölçeklenir.
- **OT17** — Yeniden deneme, yanıt alınamayan bütün aygıtlara aynı isteği yeniden gönderir.
  Operatör hangisinin uygulandığını bilemez; bilseydi yeniden denemeye gerek kalmazdı.
- **OT18** — Şablon aygıtın sınıfına göre yazılır ve rapor etkileşim sınıfı üzerine
  kuruludur; sınıfı uyuşmayan özel aygıt sapar, başka sınıftaki sapma rapora düşmez.

#### Ölçüm

```python
"""Programlanabilir arayuz: ayni istegi iki kez gondermenin sonucu.

Bolum 1 - uc istek bicimi, ikinci uygulamanin biraktigi fark.
Bolum 2 - yanit kayboldugunda yeniden deneme neyi bozar.
Bolum 3 - kuyruk: sablonun disinda kalan ve raporda gorunmeyen.
"""
TOHUM = 20260812
EK = "sablon_kurali"
BICIMLER = ("ekleme", "birlestirme", "tam degisim")


def uretec(tohum):
    d = tohum % 2147483646 + 1

    def r(n):
        nonlocal d
        d = (d * 48271) % 2147483647
        return d % n
    return r


def ozneler(sayi=40, tohum=TOHUM):
    r, liste = uretec(tohum), []
    for i in range(sayi):
        liste.append({"no": i + 1, "kapasite": 20 + r(81),
                      "gecikme": 5 + r(45),
                      "sinif": ("etkilesim", "toplu", "yedek")[r(3)],
                      "ozel": r(9) == 0})
    return liste


def durum(o):
    """Aygitin degisiklikten onceki yapilandirmasi."""
    d = {"arayuz": "ana", "adres": f"a{o['no']}", "kural": ["taban"]}
    if o["ozel"]:
        d["yerel_kural"] = f"k{o['no']}"
    return d


def istek(d, bicim):
    """Ayni degisiklik uc ayri istek bicimiyle uygulanir."""
    y = {k: (list(v) if isinstance(v, list) else v) for k, v in d.items()}
    if bicim == "ekleme":
        y["kural"] = y["kural"] + [EK]
    elif bicim == "birlestirme":
        y["kural"] = [k for k in y["kural"] if k != EK] + [EK]
    elif bicim == "tam degisim":
        y = {"arayuz": "ana", "adres": d["adres"], "kural": ["taban", EK]}
    y["oncelik"] = "3"
    return y


def uygula(oz, sablon_sinifi):
    """Tek sablon kirk aygita uygulanir; ozel aygitlar sapar."""
    uyan = sapan = gizli = 0
    for o in oz:
        if o["sinif"] == sablon_sinifi or not o["ozel"]:
            uyan += 1
        else:
            sapan += 1
            if o["sinif"] != "etkilesim":
                gizli += 1
    return uyan, sapan, gizli


oz = ozneler()
print(f"özne {len(oz)} | model dışı alan taşıyan aygıt "
      f"{sum(o['ozel'] for o in oz)} | istek biçimi {len(BICIMLER)}")
print()
print(f"{'istek biçimi':<14s} {'ikinci uygulama değiştirir':>26s} {'etkisiz':>8s} "
      f"{'model dışı alanı silinen':>25s}")
for b in BICIMLER:
    degisen = silinen = 0
    for o in oz:
        d = durum(o)
        bir = istek(d, b)
        iki = istek(bir, b)
        if iki != bir:
            degisen += 1
        if "yerel_kural" in d and "yerel_kural" not in bir:
            silinen += 1
    print(f"{b:<14s} {degisen:26d} {'hayır' if degisen else 'evet':>8s} "
          f"{silinen:25d}")

print()
r = uretec(TOHUM + 11)
yanitsiz, uygulanmis = [], set()
for o in oz:
    if r(5) == 0:
        yanitsiz.append(o["no"])
        if r(2) == 0:
            uygulanmis.add(o["no"])
print(f"yanıt alınamayan aygıt {len(yanitsiz)} | bunlardan isteği aslında "
      f"uygulamış olan {len(uygulanmis)}")
print()
print(f"{'istek biçimi':<14s} {'yeniden denenen':>16s} {'doğru duruma gelen':>19s} "
      f"{'bozulan':>8s}")
for b in BICIMLER:
    dogru = bozuk = 0
    for no in yanitsiz:
        o = oz[no - 1]
        d = durum(o)
        hedef = istek(d, b)
        onceki = hedef if no in uygulanmis else d
        son = istek(onceki, b)
        if son == hedef:
            dogru += 1
        else:
            bozuk += 1
    print(f"{b:<14s} {len(yanitsiz):16d} {dogru:19d} {bozuk:8d}")

print()
print(f"{'şablon sınıfı':<14s} {'uyan':>6s} {'sapan':>6s} "
      f"{'raporda görünmeyen':>19s} {'şablonu alan ve model dışı alan taşıyan':>40s}")
for s in ("etkilesim", "toplu", "yedek"):
    u, sp, g = uygula(oz, s)
    riskli = sum(1 for o in oz if o["ozel"] and o["sinif"] == s)
    print(f"{s:<14s} {u:6d} {sp:6d} {g:19d} {riskli:40d}")
```

```
özne 40 | model dışı alan taşıyan aygıt 9 | istek biçimi 3

istek biçimi   ikinci uygulama değiştirir  etkisiz  model dışı alanı silinen
ekleme                                 40    hayır                         0
birlestirme                             0     evet                         0
tam degisim                             0     evet                         9

yanıt alınamayan aygıt 9 | bunlardan isteği aslında uygulamış olan 5

istek biçimi    yeniden denenen  doğru duruma gelen  bozulan
ekleme                        9                   4        5
birlestirme                   9                   9        0
tam degisim                   9                   9        0

şablon sınıfı    uyan  sapan  raporda görünmeyen  şablonu alan ve model dışı alan taşıyan
etkilesim          34      6                   6                                        3
toplu              34      6                   3                                        3
yedek              34      6                   3                                        3
```

#### Etkisizliğin Ölçüsü

Üst tablo üç biçimi ayırıyor. **Ekleme** biçiminde ikinci uygulama kırk aygıtın
**kırkında** durumu değiştiriyor; arayüz etkisiz değil. **Birleştirme** ve **tam değişim**
biçimlerinde ikinci uygulama **hiçbir** aygıtta bir şey değiştirmiyor; ikisi de etkisiz.

Kırkın kırkı olması dikkat çekicidir. Etkisizlik ihlali bir azınlık olayı değildir: ekleme
biçiminde **her** aygıt ikinci uygulamada bozulur, çünkü bozulmanın nedeni aygıtın bir
özelliği değil isteğin biçimidir. Bu, bu kursta ölçtüğümüz öteki kuyrukların tersidir —
burada kuyruk yoktur, kaldıraç kırkın kırkına aynı biçimde yanlış hizmet eder.

Sağdaki sütun ikinci ayrımı veriyor ve etkisiz olmanın yetmediğini gösteriyor. **Tam
değişim** etkisizdir ama **9** aygıtın model dışı alanını siler. İstek o alanı taşımadığı
için aygıt onu bir eksik değil, bir **fazla** sayar ve atar. Önceki dersin dokuz `yerel_kural`
alanı burada yok olur; hem de arayüz hiçbir kusur bildirmeden, çünkü bu tam olarak istenen
işlemin tanımıdır.

Yani etkisizlik ile güvenlik ayrı iki özelliktir. Etkisiz olmayan bir arayüz yeniden
denemede bozar; etkisiz ama tam değişimli bir arayüz **ilk** denemede siler. İkisinin
kesişiminde duran biçim birleştirmedir: hem yeniden denenebilir hem de dokunmadığı alanı
korur.

#### Yeniden Denemenin Ödettiği

Orta tablo kurguyu çalıştırıyor. Kırk aygıtın **9**'unda yanıt alınamıyor ve bunların
**5**'inde istek aslında uygulanmış. Operatörün elinde bu ayrımı yapacak bir bilgi yok;
dokuzunun dokuzunu da yeniden denemek zorunda.

**Ekleme** biçiminde yeniden deneme sonrası doğru duruma gelen aygıt **4**, bozulan **5**.
Bozulan beş aygıt, isteğin ilk seferde **çalıştığı** aygıtlardır. Bu sonucun biçimi
işletme açısından en kötüsüdür: yordam başarılı olduğu yerde zarar verir ve zararın büyüklüğü
başarının büyüklüğüyle orantılıdır.

**Birleştirme** ve **tam değişim** biçimlerinde dokuz aygıdın dokuzu doğru duruma geliyor,
bozulan **0**. Etkisizliğin kazandırdığı tam olarak budur ve başka bir şey değildir: yeniden
denemeyi **düşünmeden** yapılabilir hâle getirir.

Kırk öznelik bir kümede ölçülebilen en küçük fark **1/40 = 0,025**'tir. Beş bozuk aygıt
**0,125**'lik bir paydır ve bandın rahatça içindedir.

#### Etkisizliğin Korumadığı Şey

Etkisizlik operatörü **kendi** yinelemesine karşı korur. Korumadığı bir durum vardır ve
arayüzün okuma tarafından doğar.

Bir betiğin tipik döngüsü üç adımdır: aygıdın durumunu oku, üzerinde değişikliği hesapla,
sonucu yaz. Okuma etkisizdir, yazma etkisiz olabilir; ama **üçü birlikte** bir bütün değildir.
İki operatör aynı aygıtta aynı anda bu döngüyü çalıştırırsa, ikincisi birincinin okuduğundan
sonra yazar ve birincinin yazdığını görmeden onun üstüne yazar. Sonuç iki değişikliğin
toplamı değil, ikincisinin tek başına sonucudur; ve hiçbir istek hata döndürmez, çünkü her
istek kendi başına geçerlidir.

Etkisizlik burada hiçbir şey yapmaz. Aynı isteği iki kez göndermek sorun değildir; sorun
**iki ayrı isteğin** araya girmesidir. Arayüzün bu duruma karşı iki aracı vardır. Birincisi
işlem sınırıdır: değişiklik aday yapılandırmada birikirken aygıt bir kilit tutar ve ikinci
operatörün yazması reddedilir. İkincisi damgadır: her yapılandırmanın bir damgası olur, istek
"şu damgayı gördüm, onun üstüne yazıyorum" der ve damga değişmişse istek reddedilir. İkisi de
sorunu çözmez, **görünür kılar** — reddedilen istek bir hata değil, bir bildirimdir.

#### Arayüzün Açtığı Yüzeyler ve Daraltmalar

Programlanabilir bir arayüz, aygıtın yapılandırmasını değiştirebilen bir yoldur; bu tanım
gereği bir yüzeydir. Sayılan yüzeyler ve daraltmaları şunlardır.

**Birinci yüzey — yönetim yolunun kendisi.** Arayüz açıksa aygıtın yapılandırması ağ
üzerinden değiştirilebilir. **Daraltma:** arayüz ayrı bir yönetim ağına bağlanır ve veri
trafiğinin geçtiği yoldan erişilemez; erişim kaynağı adresle sınırlanır; okuma yetkisi ile
yazma yetkisi ayrı verilir. Bu üç daraltma birbirinin yerine geçmez, üst üste konur.

**İkinci yüzey — kimlik bilgisinin nerede durduğu.** Betik aygıta bağlanmak için bir kimlik
kullanır ve o kimlik bir yerde durur. Kimlik bilgisi, anahtar ve erişim belirteci bu kursun
hiçbir örneğinde yazılmaz. **Daraltma:** değer betiğin, şablonun ya da yapılandırma
deposunun içinde durmaz; betik yalnız bir başvuru taşır ve değeri çalıştığı ortamdan alır.

**Üçüncü yüzey — tam değişimin sildiği alan.** Ölçümde **9** aygıt, isteğin taşımadığı bir
alanı kaybediyor. Bu bir saldırı değil, arayüzün tanımlı davranışıdır ve tam olarak bu
yüzden tehlikelidir — hiçbir uyarı üretmez. **Daraltma:** tam değişim yalnız yapılandırmanın
tamamının gerçekten bilindiği durumda kullanılır; bilinmiyorsa birleştirme kullanılır.
Model dışı alan taşıyan aygıtlar önceden listelenir ve tam değişimin kapsamı o listeyle
kesiştiğinde işlem durdurulur.

**Dördüncü yüzey — kendi erişimini kesen değişiklik.** Yönetim arayüzünün kendisini kapatan,
yönetim ağının adresini değiştiren ya da erişimi filtreleyen bir istek uygulandığı anda
aygıta bir daha ulaşılamaz. Böyle bir isteğin komutu bu kursta çalıştırılabilir biçimde
yazılmaz; söylenecek şey geri alınamaz olduğudur. **Daraltma:** değişiklik önce aday
yapılandırma olarak yazılır, kuru çalışmayla sonucu hesaplanır, sonra bir **geri alma
zamanlayıcısıyla** yürürlüğe alınır — belirli bir süre içinde operatör onaylamazsa aygıt
kendiliğinden eski yapılandırmaya döner. Zamanlayıcı, erişimini kaybetmiş bir operatörün
elindeki tek araçtır.

#### Özet

- Programlanabilir arayüz yapılandırılmış istek ve yanıt, işlenebilir hata ve işlem sınırı
  sağlar; kabuk çıktısını ayrıştıran bir betiğin üç kusurunu birden kapatır.
- Ekleme biçimi etkisiz değildir: ikinci uygulama kırk aygıtın **40**'ında durumu değiştirir.
  Birleştirme ve tam değişim etkisizdir, ikisinde de **0**.
- Yanıt alınamayan **9** aygıtın **5**'inde istek aslında uygulanmıştır; yeniden denemede
  ekleme biçimi bu **5**'ini bozar, etkisiz iki biçim **0** bozar.
- Etkisizlik ile güvenlik ayrıdır: tam değişim etkisizdir ama **9** aygıtın model dışı
  alanını ilk uygulamada siler ve hiçbir kusur bildirmez.
- Şablon tarafında uyan **34**, sapan **6**, raporda görünmeyen **6 / 3 / 3**; şablonu alan
  aygıtların **3**'ü model dışı alan taşır ve tam değişimde kaybedecek olan da onlardır.

#### Sonraki Adım

Bu ders tek bir isteğin tek bir aygıtta ne bıraktığını ölçtü. İşletmede istek tek değildir:
bir betik kırk aygıta sırayla bağlanır, her birine aynı şablonu uygular ve sonunda bir rapor
yazar. Sonraki ders o betiğin kendisini ölçer — toplu değişikliğin kuru çalışmayla önden
hesaplanması, dilimler hâlinde yayılması ve geri alınması. Ve asıl soruyu orada yanıtlarız:
şablon uygulandığında kaç aygıt şablonun dışında kalıyor ve o aygıtların kaçı yazılan
raporda görünüyor.

### Betikle Aygıt Yönetimi

Source: https://academia.sh/tr/kurslar/ag-isletimi/betikle-aygit-yonetimi

Şablon hangi sınıfa göre yazılırsa yazılsın sapan aygıt her seferinde 6'dır; değişen tek şey raporda görünmeyenin 6, 3 ve 3 olmasıdır. Kuru çalışma altısını da uygulamadan önce bulur, rapor 0, 3 ve 3 bulur ve bir şablonda kademeli yayma hiç durmaz.

Önceki ders tek bir isteğin tek bir aygıtta ne bıraktığını ölçtü. İşletmede istek tek
değildir: bir betik envanteri gezer, kırk aygıta sırayla bağlanır, her birine aynı şablonu
uygular ve sonunda bir rapor yazar. Betik yazıldığı andan sonra kırk aygıtın kırkına aynı
kararı taşır — kaldıraç tam olarak budur.

Bu dersin sorusu betiğin nasıl yazılacağı değil, betiğin **ne göremediğidir**. Şablon
uygulandığında kaç aygıt şablonun dışında kalıyor, bu aygıtların kaçı yazılan raporda
görünüyor ve iki sayı arasındaki fark hangi kararla açılıyor.

#### Betiğin Yaptığı İş

Toplu değişiklik yedi adımdır ve adımların sırası ölçümün sonucunu belirler.

```text
# ogretilen toplu degisiklik yordami , calistirilmamistir

1  envanteri oku             -> 40 aygit
2  sablonu kuru calistir     -> aygit basina fark listesi
3  farki gozden gecir        -> sablonun disinda kalanlari isaretle
4  dilim 1 uygula            -> ilk 10 aygit
5  raporu oku                -> gorunen sapma var mi
6  yoksa dilim 2 , 3 , 4     -> yayma surer
7  varsa durdur ve geri al   -> yalnizca uygulanmis olanlar
```

İkinci adım **kuru çalışma**, dördüncüden yedinciye kadarki döngü **kademeli yayma**,
yedincinin ikinci yarısı **geri alma**. Üçü ayrı üç koruma değildir; aynı korumanın üç ayrı
zamandaki hâlidir — uygulamadan önce, uygularken ve uyguladıktan sonra.

Kod olarak altyapı yordamının kendisi ve araç tartışması Kod Olarak Altyapı kursunun
konusudur ve burada tekrarlanmaz. Burada nesne bir ağ aygıtıdır ve ölçülen şey yordamın
verimi değil, **şablonun dışında kalan azınlıktır.**

#### Doğrulamanın İki Kaynağı

Betiğin değişikliğin doğru gittiğini anlamasının iki yolu vardır ve ikisi aynı şeyi ölçmez.

**Kuru çalışma niyeti aygıtın durumuyla karşılaştırır.** Şablonun ne yazacağını hesaplar,
aygıttan mevcut yapılandırmayı okur, ikisinin farkını çıkarır ve **hiçbir aygıta yazmaz**.
Kapsamı envanterin tamamıdır: kırk aygıdın kırkına bakar, çünkü bakmak için bir göstergeye
ihtiyacı yoktur.

**Rapor göstergelerden gelir.** Uygulamadan sonra toplanan ölçütler okunur ve beklenenden
sapan aygıtlar listelenir. Kapsamı ise **göstergelerin kapsamıdır** — ve gösterge kümesi
hiçbir zaman kırk aygıdın kırkını eşit ayrıntıda görmez. Bu kurguda rapor etkileşim sınıfının
göstergeleri üzerine kuruludur; öteki sınıflardaki bir sapma rapora hiç düşmez.

Bu, raporu yazanın bir kusuru değildir. Gösterge kümesi her zaman bir kapsam kararıdır:
hangi sınıfın hangi ölçütü, hangi sıklıkla toplanacak. Karar verilirken sorulan soru "hangi
aygıtlar önemli" olur; sorulmayan soru ise "hangi sapmayı görmez hâle geliyoruz" olur.

Ölçümün varsayımları:

- **OT19** — Kırk aygıtlık özne kümesi kursun sabitidir ve bu derste değiştirilmez.
- **OT20** — Şablon aygıtın sınıfına göre yazılır. Sınıfı şablonunkiyle uyuşmayan özel aygıt
  sapar; sapma şablonun kapsam kararından doğar, aygıtın kusurundan değil.
- **OT21** — Kuru çalışma niyeti aygıdın gerçek durumuyla karşılaştırır ve hiçbir aygıta
  yazmaz. Kâhini kullanmaz; sapmayı aygıdın kendi durumundan okur.
- **OT22** — Rapor etkileşim sınıfının göstergeleri üzerine kuruludur. Başka sınıftaki bir
  sapma rapora hiç düşmez.
- **OT23** — Kademeli yayma aygıtları numara sırasıyla dilimler. Her dilimin sonunda rapor
  okunur; raporda görünen bir sapma varsa yayma durdurulur.
- **OT24** — Yayma durdurulduğunda o ana kadar uygulanmış sapan aygıtlar geri alınır; sonraki
  dilimlerdeki sapan aygıtlara hiç dokunulmamıştır.
- **OT25** — Dilim boyu 40 olduğunda yayma tek adımdır ve durdurma kararının verilebileceği
  bir ara yoktur.

#### Ölçüm

```python
"""Toplu degisiklik: sapan aygit sabit, gorunen sapma degisken.

Bolum 1 - sablon uygulanir: uyan, sapan, raporda gorunen ve gorunmeyen.
Bolum 2 - kuru calisma ile raporun kapsami yan yana.
Bolum 3 - kademeli yayma: durdurulana kadar degisen ve onlenen sapan.
"""
TOHUM = 20260812
SINIFLAR = ("etkilesim", "toplu", "yedek")


def uretec(tohum):
    d = tohum % 2147483646 + 1

    def r(n):
        nonlocal d
        d = (d * 48271) % 2147483647
        return d % n
    return r


def ozneler(sayi=40, tohum=TOHUM):
    r, liste = uretec(tohum), []
    for i in range(sayi):
        liste.append({"no": i + 1, "kapasite": 20 + r(81),
                      "gecikme": 5 + r(45),
                      "sinif": ("etkilesim", "toplu", "yedek")[r(3)],
                      "ozel": r(9) == 0})
    return liste


def uygula(oz, sablon_sinifi):
    """Tek sablon kirk aygita uygulanir; ozel aygitlar sapar."""
    uyan = sapan = gizli = 0
    for o in oz:
        if o["sinif"] == sablon_sinifi or not o["ozel"]:
            uyan += 1
        else:
            sapan += 1
            if o["sinif"] != "etkilesim":
                gizli += 1
    return uyan, sapan, gizli


def kuru_calisma(oz, sablon_sinifi):
    """Uygulamadan once niyet ile aygitin durumu karsilastirilir."""
    return [o["no"] for o in oz
            if not (o["sinif"] == sablon_sinifi or not o["ozel"])]


def raporda(oz, sablon_sinifi):
    """Rapor etkilesim sinifinin gostergeleri uzerine kuruludur."""
    return [no for no in kuru_calisma(oz, sablon_sinifi)
            if oz[no - 1]["sinif"] == "etkilesim"]


def kademeli(oz, sablon_sinifi, dilim):
    """Dilim dilim uygulanir; raporda gorunen ilk sapmada durulur."""
    uygulanan = sapan_uygulanan = dalga = 0
    for bas in range(0, len(oz), dilim):
        dalga += 1
        gorunen = 0
        for o in oz[bas:bas + dilim]:
            uygulanan += 1
            if not (o["sinif"] == sablon_sinifi or not o["ozel"]):
                sapan_uygulanan += 1
                if o["sinif"] == "etkilesim":
                    gorunen += 1
        if gorunen:
            return dalga, uygulanan, sapan_uygulanan
    return 0, uygulanan, sapan_uygulanan


oz = ozneler()
print(f"özne {len(oz)} | özel aygıt {sum(o['ozel'] for o in oz)} | "
      f"sınıf dağılımı " +
      " ".join(f"{s} {sum(1 for o in oz if o['sinif'] == s)}" for s in SINIFLAR))
print()
print(f"{'şablon sınıfı':<14s} {'uyan':>5s} {'sapan':>6s} {'raporda görünen':>16s} "
      f"{'raporda görünmeyen':>19s} {'raporun kapsamı':>16s}")
for s in SINIFLAR:
    u, sp, g = uygula(oz, s)
    print(f"{s:<14s} {u:5d} {sp:6d} {sp - g:16d} {g:19d} "
          f"{(sp - g) / sp:16.3f}")

print()
print(f"{'şablon sınıfı':<14s} {'kuru çalışma bulur':>19s} {'rapor bulur':>12s} "
      f"{'yalnız kuru çalışmanın bulduğu':>31s}")
for s in SINIFLAR:
    k, r = kuru_calisma(oz, s), raporda(oz, s)
    print(f"{s:<14s} {len(k):19d} {len(r):12d} {len(k) - len(r):31d}")
for s in SINIFLAR:
    print(f"  {s:<12s} sapan aygıtlar {kuru_calisma(oz, s)} | "
          f"raporda {raporda(oz, s)}")

print()
print(f"{'şablon sınıfı':<14s} {'dilim':>6s} {'duran dalga':>12s} "
      f"{'değişen aygıt':>14s} {'geri alınacak':>14s} {'önlenen sapan':>14s}")
for s in SINIFLAR:
    for dilim in (4, 10, 40):
        d, u, su = kademeli(oz, s, dilim)
        print(f"{s:<14s} {dilim:6d} {d if d else '-':>12} {u:14d} "
              f"{su:14d} {len(kuru_calisma(oz, s)) - su:14d}")
```

```
özne 40 | özel aygıt 9 | sınıf dağılımı etkilesim 11 toplu 20 yedek 9

şablon sınıfı   uyan  sapan  raporda görünen  raporda görünmeyen  raporun kapsamı
etkilesim         34      6                0                   6            0.000
toplu             34      6                3                   3            0.500
yedek             34      6                3                   3            0.500

şablon sınıfı   kuru çalışma bulur  rapor bulur  yalnız kuru çalışmanın bulduğu
etkilesim                        6            0                               6
toplu                            6            3                               3
yedek                            6            3                               3
  etkilesim    sapan aygıtlar [7, 12, 20, 25, 26, 40] | raporda []
  toplu        sapan aygıtlar [4, 20, 25, 26, 31, 33] | raporda [4, 31, 33]
  yedek        sapan aygıtlar [4, 7, 12, 31, 33, 40] | raporda [4, 31, 33]

şablon sınıfı   dilim  duran dalga  değişen aygıt  geri alınacak  önlenen sapan
etkilesim           4            -             40              6              0
etkilesim          10            -             40              6              0
etkilesim          40            -             40              6              0
toplu               4            1              4              1              5
toplu              10            1             10              1              5
toplu              40            1             40              6              0
yedek               4            1              4              1              5
yedek              10            1             10              2              4
yedek              40            1             40              6              0
```

#### Sapan Sabit, Görünen Değişken

Üst tablo bu konunun ana sonucunu veriyor. Şablon hangi sınıfa göre yazılırsa yazılsın uyan
aygıt **34**, sapan aygıt **6**. Üç satırın üçünde de aynı sayı. Sapan sayısı şablonun
niteliğine bağlı değildir çünkü sapmanın kaynağı şablonun yanlış yazılması değil, **tek bir
şablonun kırk farklı aygıtı temsil etme iddiasıdır.** Daha iyi bir şablon yazmak bu altıyı
beşe indirmez; ancak kapsamı daraltmak ya da ikinci bir şablon yazmak indirir, ki o da
kaldıracın tekliğinden vazgeçmektir.

Sağdaki üç sütun ise değişiyor. Etkileşim sınıfına göre yazılan şablonda raporda görünen
sapan **0**, görünmeyen **6**; raporun kapsamı **0,000**. Öteki iki şablonda görünen **3**,
görünmeyen **3**, kapsam **0,500**. Aynı altı aygıt, üç ayrı görünürlük.

Bu, kursun üçüncü iddiasının ikinci ödemesidir ve burada en çıplak hâliyle duruyor:
**otomasyon sapmayı azaltmaz, görünürlüğünü değiştirir.** Sapan altı aygıt her üç şablonda
da oradadır; değişen tek şey kaçının rapora düştüğüdür. Bir işletmede bu iki sayıdan yalnız
ikincisi gösterge tablosuna yazılır ve gösterge tablosu iyileştikçe sapmanın azaldığı
sanılır.

Aygıt numaraları bunu doğruluyor. Etkileşim şablonunda sapanlar `[7, 12, 20, 25, 26, 40]`,
raporda görünen liste ise boş. Toplu şablonunda sapanlar `[4, 20, 25, 26, 31, 33]`, raporda
`[4, 31, 33]` — üçü görünüyor, üçü görünmüyor. Yedek şablonunda sapanlar başka aygıtlar ama
raporda görünenler yine `[4, 31, 33]`, çünkü rapor sapmaya değil **sınıfa** bakıyor.

Kırk öznelik bir kümede ölçülebilen en küçük fark **1/40 = 0,025**'tir. Altı ile üç
arasındaki fark **0,075**'tir ve bandın rahatça içindedir.

#### Kuru Çalışmanın Bulduğu

Orta tablo iki doğrulama kaynağını yan yana koyuyor. Kuru çalışma üç şablonun üçünde de
**6** sapan aygıdı buluyor. Rapor **0**, **3** ve **3** buluyor. Yalnız kuru çalışmanın
bulduğu aygıt sayısı sırasıyla **6**, **3** ve **3**.

Farkın nedeni yöntemin kendisidir. Kuru çalışma göstergeye bakmaz; envanterdeki her aygıda
tek tek sorar ve niyetle karşılaştırır. Kapsamı gösterge kümesinin değil, **envanterin**
kapsamıdır — ve envanter kırk aygıdın kırkını içerir. Bu yüzden kuru çalışma, gösterge
tasarımının bütün kör noktalarından bağımsızdır.

İkinci fark zamandadır ve daha önemlidir. Kuru çalışma sapmayı **hiçbir aygıt değişmeden
önce** bulur; rapor ise değişiklik uygulandıktan sonra bulur. Birinci durumda geri alınacak
aygıt sayısı sıfırdır, çünkü geri alınacak bir şey yoktur. Kuru çalışmanın kazandırdığı asıl
şey bulduğu altı aygıt değil, o altısını bulduğu **an**dır.

#### Kademeli Yaymanın Ödettiği

Alt tablo yaymanın dilim boyuna göre ne değiştirdiğini veriyor ve ilk üç satır konunun en
sert sonucunu taşıyor.

**Etkileşim şablonunda yayma hiçbir dilim boyunda durmuyor.** Duran dalga sütununda üç satır
da boş; değişen aygıt her üçünde de **40**, geri alınacak **6**, önlenen sapan **0**. Neden
açık: yayma raporda görünen bir sapmada durur ve bu şablonda raporda görünen sapma **yoktur**.
Dilimi dörde indirmek bir şey değiştirmiyor, çünkü sorun dilimin büyüklüğü değil, **durdurma
kararının okuduğu sinyalin boş olması.** Kademeli yayma, sinyali olmayan bir kör noktada
kademesiz yaymayla aynı şeydir.

Öteki iki şablonda yayma birinci dalgada duruyor. Toplu şablonunda dilim **4** iken değişen
aygıt **4**, geri alınacak **1**, önlenen sapan **5**; dilim **10** iken değişen **10**, geri
alınacak yine **1**, önlenen **5**. Yedek şablonunda dilim **4** iken geri alınacak **1**,
dilim **10** iken **2** — dilim büyüdüğü için ilk dalgaya bir sapan aygıt daha giriyor.

Dilim **40** satırları karşılaştırma için duruyor: tek adımda uygulandığında üç şablonda da
değişen **40**, geri alınacak **6**, önlenen **0**. Kademeli yaymanın bütün kazancı buradan
okunur — doğru sinyal varken **5** sapmayı önlüyor, sinyal yokken **0**.

#### Geri Alma ve Yıkıcı Değişiklik

Geri alma bir işlem değil, değişiklikten önce verilmiş bir karardır. Uygulanmadan önce
aygıdın yürürlükteki yapılandırması saklanmamışsa geri alınacak bir hedef yoktur ve tablodaki
"geri alınacak" sütunu bir istek listesi olarak kalır.

Toplu değişiklik **geri alınamaz bir işlemdir**: kırk aygıta uygulanan şablon, uygulandığı
anda kırk aygıttaki önceki durumu siler. Bir aygıdın yapılandırmasını boşaltan, arayüzünü
kapatan, yönetim erişimini kesen ya da ağı ikiye bölen bir değişiklik bu kursta
**çalıştırılabilir biçimde yazılmaz**. Söylenecek olan ne yaptığı ve geri alınamaz olduğudur:
ağı bölen bir değişiklikten sonra bölünmüş ağın öteki yarısındaki aygıtlara ulaşıp düzeltme
yapmak mümkün olmayabilir ve o aygıtlar tam olarak geri almanın çalıştırılması gereken
aygıtlardır.

Sayılan yüzeyler ve daraltmaları şunlardır.

**Birinci yüzey — kapsamın kendisi.** Betik envanterin tamamına dokunabiliyorsa bir yazım
hatası kırk aygıda birden gider. **Daraltma:** betiğin kapsamı her koşumda açıkça verilir ve
varsayılan kapsam boş olur; kapsam bir dilim listesiyle sınırlanır; kuru çalışmanın çıktısı
gözden geçirilmeden uygulama adımı çalışmaz.

**İkinci yüzey — raporun kör noktası.** Ölçümde bir şablonda sapmanın **6**'sı da rapora
düşmüyor. **Daraltma:** durdurma kararı yalnız rapora bağlanmaz; her dilimin sonunda o dilime
giren aygıtlar için kuru çalışma yeniden koşturulur ve niyetle karşılaştırılır. Bu, raporun
göremediği üç aygıdı da durdurma kararının kapsamına sokar.

**Üçüncü yüzey — kimlik bilgisi.** Betik kırk aygıda bağlanır ve bunun için bir kimlik
kullanır. Kimlik bilgisi, anahtar ve erişim belirteci bu kursun hiçbir örneğinde yazılmaz;
betik yalnız bir başvuru taşır ve değeri çalıştığı ortamdan alır, şablonun ya da yapılandırma
deposunun içinden değil.

**Dördüncü yüzey — geri alınamaz adımın kendisi.** **Daraltma:** yıkıcı olabilecek adım bir
geri alma zamanlayıcısıyla uygulanır — belirli bir süre içinde operatör onaylamazsa aygıt
kendiliğinden eski yapılandırmaya döner. Erişimini kaybetmiş bir operatörün elindeki tek araç
budur ve zamanlayıcı, uygulamadan önce kurulmuş olmak zorundadır.

#### Özet

- Toplu değişiklik yedi adımdır; kuru çalışma, kademeli yayma ve geri alma aynı korumanın
  uygulamadan önceki, uygularkenki ve sonraki hâlleridir.
- Şablon hangi sınıfa göre yazılırsa yazılsın uyan **34**, sapan **6**; sapmanın kaynağı
  şablonun yanlışlığı değil, tek şablonun kırk farklı aygıtı temsil etme iddiasıdır.
- Raporda görünen sapan **0 / 3 / 3**, görünmeyen **6 / 3 / 3**, raporun kapsamı
  **0,000 / 0,500 / 0,500**. Aynı altı aygıt, üç ayrı görünürlük: **otomasyon sapmayı
  azaltmaz, görünürlüğünü değiştirir.**
- Kuru çalışma üç şablonda da **6** sapanı bulur çünkü kapsamı göstergenin değil envanterin
  kapsamıdır; ve onları hiçbir aygıt değişmeden önce bulur.
- Etkileşim şablonunda kademeli yayma hiçbir dilim boyunda durmaz — değişen **40**, önlenen
  **0**. Öteki iki şablonda birinci dalgada durur ve **5** sapmayı önler; sinyali olmayan bir
  kör noktada kademeli yayma, kademesiz yaymayla aynı şeydir.

#### Sonraki Adım

Bu konuda sayılan her sapan aygıt, envanterinde adı yazan, yapılandırmasını okuyabildiğimiz
ve gerektiğinde geri alabildiğimiz bir aygıttı. Kuru çalışmanın altı sapanı bulabilmesi de
buna dayanıyordu: aygıda sorabiliyorduk ve verdiği yanıt bizimdi. Peki özne **kendi sahip
olmadığımız** bir nesne olursa? Sonraki ders kaldıracın altındaki nesneyi değiştirir ve
aynı ölçüyü — tek karar, kırk özne, kalan kuyruk — bize ait olmayan bir yapılandırma
düzleminde yeniden sorar.

### Bulut Ağ Kavramları

Source: https://academia.sh/tr/kurslar/ag-isletimi/bulut-ag-kavramlari

Sanal ağ, alt ağ, güvenlik grubu ve ağ geçidi aynı kaldıraç–kuyruk ölçüsüne girer: tek bir alt ağ önek uzunluğu kırk alt ağa uygulandığında /26 on yedi alt ağı kısa bırakır, kuyruğu kapatan /25 ise sanal ağın bloğuna sığmaz.

Önceki ders tek bir şablonu kırk aygıta uyguladı ve sapan azınlığı saydı. Kursun buraya
kadarki bütün ölçümlerinde özne aynı türdendi: **kendi sahip olduğumuz aygıt**. Bir rafta
duruyordu, bir seri numarası vardı, kabuğuna bağlanılabiliyordu, bozulduğunda yerine
başkası konuyordu. Kaldıraç bu aygıta dokunuyordu.

Bu dersin sorusu özneyi değiştirir: ya özne kendi sahip olmadığımız bir nesne olursa? Bulut
ağında sanal ağ, alt ağ, güvenlik grubu ve ağ geçidi birer aygıt değildir; birer
**yapılandırma kaydıdır**. Dokunulacak bir kutu yoktur, açılacak bir kabuk yoktur, arıza
anında bakılacak bir ışık yoktur. Soru şudur: özne kayda dönüştüğünde kaldıraç–kuyruk ölçüsü
değişir mi?

#### Kayıt Olan Özne

Bulut hizmet modelleri, paylaşılan sorumluluk sınırı ve sağlayıcı seçimi **Bulut Bilişim**
müfredatının **Bulutta Hesaplama ve Ağ** kursunda kuruldu; o anlatı burada tekrarlanmaz. Bu
ders bulut nesnesini yalnız bir yönüyle ele alır: **ölçünün öznesi olarak**.

Kayda dönüşen özne üç şey kazanır. Anında yaratılır ve anında yok edilir; sayısı bir
istekle kırktan dört yüze çıkabilir. Tanımı metindir, dolayısıyla sürüm denetimine girer ve
bir başkasına birebir kopyalanabilir. Üçüncüsü, yaratılışı hep aynıdır: aynı tanım her
seferinde aynı nesneyi verir.

Kaybettiği şey de üçtür ve ölçüyü ilgilendiren asıl kısım budur. Nesnenin altındaki fiziksel
yolu göremeyiz. Nesnenin sınırlarını biz koymayız — bir sanal ağın kaç alt ağ taşıyabileceği,
bir güvenlik grubunun kaç kural alabileceği bize verilmiş sayılardır. Ve nesne yaratıldıktan
sonra **kimi alanı değiştirilemez**: bir sanal ağın adres bloğu, kurulduktan sonra yerinde
büyütülemez.

Bu üçüncüsü kaldıracı doğrudan yaratır. Değiştirilemeyen bir alan, bir kez ve herkes için
verilen bir karardır. Kırk alt ağın hepsi aynı sanal ağın içindeyse, o sanal ağın bloğu kırk
öznenin ortak sınırıdır.

#### Dört Nesne

Bulut ağının çekirdeği dört sınıfa iner. Aşağıdaki döküm bir çağrı değildir; nesnelerin
bildirimsel tanımının biçimini gösterir ve çalıştırılmaz.

```text
# ogretilen nesne dokumu , calistirilmamistir

sanal ag:
  ad: olcum-agi
  blok: 10.40.0.0/20        # yaratildiktan sonra degistirilemez
  bolge: bolge-1

alt ag:
  ad: olcum-01
  sanal ag: olcum-agi
  blok: 10.40.0.0/26        # sanal agin blogundan kesilir
  ayrilmis adres: 5         # ag, yayin, gecit ve iki hizmet adresi
  yonlendirme tablosu: olcum-varsayilan

guvenlik grubu:
  ad: olcum-aygit
  giris:
    - kaynak: guvenlik grubu olcum-toplayici
      baglanti noktasi: 443/tcp
    - kaynak: 10.40.0.0/20
      baglanti noktasi: 22/tcp
  cikis:
    - hedef: her yer
      baglanti noktasi: 443/tcp

ag gecidi:
  - tur: disari cikis        # ictekiler disari cikar, disaridan giris yok
  - tur: es baglanti         # baska bir sanal aga dogrudan yol
    karsi: yonetim-agi
```

**Sanal ağ** bir adres alanı ve bir yalıtım sınırıdır. **Alt ağ** o alanın bir dilimidir ve
kendi yönlendirme tablosunu taşır. **Güvenlik grubu** bir aygıta değil, bir arayüz kümesine
iliştirilen kural dizisidir. **Ağ geçidi** sanal ağın dışarıyla ilişkisini kuran nesnedir;
türü yönü belirler.

Güvenlik grubunun ilk kuralında kaynak bir adres bloğu değil, **başka bir güvenlik
grubudur**. Bu, bulut ağının kendine özgü tek yapısal katkısıdır: kural adres yerine etikete
bağlanır ve adres değiştiğinde kuralı yeniden yazmak gerekmez. Bu ders güvenlik grubunu
yalnız bir **yapılandırma nesnesi** olarak alır; kural dizisinin niyet–gerçek farkı
**Kablosuz Ağlar ve Ağ Güvenliği** kursunda ölçüldü ve burada tekrarlanmaz.

#### Genel ve Özel Alt Ağ

Alt ağların en sık yanlış anlaşılan yanı, "genel" ya da "özel" oluşlarının nereden geldiğidir.
Adres bloğundan gelmez. Bir alt ağın bloğu ne olursa olsun, o alt ağı dışarıdan erişilebilir
yapan tek şey **yönlendirme tablosudur**: tablosunda dışarı çıkış geçidine giden bir varsayılan
yol varsa alt ağ geneldir, yoksa özeldir. Aynı sanal ağın içinde iki alt ağ komşu adres
bloklarını taşıyıp bambaşka erişim özelliklerine sahip olabilir.

Bu, yönlendirme tablosunu ikinci bir kaldıraç yapar ve ilkinden farklı bir kuyruk üretir.
Tablo bir alt ağa değil, alt ağ kümesine iliştirilir; tabloya bir yol eklemek onu paylaşan
her alt ağa birden ekler. Yolun gereksiz olduğu alt ağlar kuyruğu oluşturur ve bu kuyruk
tamamen sessizdir: fazladan bir yol hata üretmez, gecikme yaratmaz, günlüğe düşmez. Yalnız
o alt ağın çıkabileceği yerlerin kümesini sessizce genişletir.

Bir alt ağın hangi tabloya bağlı olduğu bu yüzden adres planından bağımsız bir karardır ve
ayrıca sayılmak zorundadır. Kırk alt ağın kaçının aynı tabloyu paylaştığı bilinmiyorsa, bir
yol satırının kaç özneye dokunduğu da bilinmiyor demektir. Daraltma, tabloyu erişim
özelliğine göre bölmektir: dışarı çıkan alt ağlar bir tabloyu, çıkmayanlar başkasını
paylaşır ve varsayılan yol yalnız birincisine yazılır.

Bu dersin ölçümü ikinci kaldıraca dokunmaz; ölçülen tek şey adres bloğudur. İkisinin ayrı
tutulması gerekir çünkü aynı alt ağ nesnesi üzerinde çalışsalar da farklı kuyruklar
bırakırlar: biri uç sığdıramamak, öteki gereksiz erişim.

#### Kaldıraç: Tek Önek Uzunluğu

Kırk alt ağ açılacak. Her alt ağın kaç uç taşıyacağı birbirinden farklıdır. Operatörün eline
tek bir sayı verilir: **alt ağların önek uzunluğu**. Bu sayı bir kez seçilir ve kırk alt ağın
kırkına birden uygulanır.

Neden tek sayı? Çünkü kırk ayrı önek seçmek kırk ayrı karar demektir ve o kararların her
biri gözden geçirilmek, belgelenmek ve sonradan hatırlanmak zorundadır. Tek önek, tek karar
verir: alt ağın kaçıncı bloğa denk geldiği aritmetikle bulunur, plan bir tabloya sığar,
adres özetlemesi tek satırda yazılır — **Anahtarlama ve Yönlendirme** kursunun adres ve ad
planlaması dersinde kurulan kazanç budur.

Bir ayrıntı burada **Ağ Modelleri ve Protokoller** kursunun alt ağ hesabından ayrılır. Orada
her alt ağda ayrılan adres sayısı ikiydi — ağ adresi ve yayın adresi. Bulut sanal ağında bu
sayı daha büyüktür ve sağlayıcıya göre değişir; bu ölçümde beş alınmıştır: ağ geçidi ile iki
hizmet adresi de blokta durur ve hiçbir uca verilemez. Bloğun ilk iki ve son iki adresini
ayırarak dört adres tutan sağlayıcı da vardır. Küçük
bloklarda bu fark belirleyicidir; `/27` bloğunun otuz iki adresinin **beşi** baştan gider.

Ölçüm iki sınırı aynı anda yoklar. Alt ağın bloğu, o alt ağdaki uç talebini karşılamalıdır.
Kırk bloğun toplamı da sanal ağın bloğuna sığmalıdır. İki sınır ters yönde çeker: öneği
küçültmek birinciyi çözer, ikinciyi bozar.

Ölçümün varsayımları:

- **OT61** — Kırk özne kursun sabit kümesidir; her özne bir alt ağa karşılık gelir ve
  öznenin kapasitesi o alt ağdaki **uç sayısı** olarak okunur. Küme değiştirilmez.
- **OT62** — Sanal ağın bloğu `/20`, yani **4096** adrestir ve yaratıldıktan sonra
  büyütülemez.
- **OT63** — Her alt ağda **5** adres kullanılamaz: ağ adresi, yayın adresi, ağ geçidi ve
  iki hizmet adresi. Kullanılabilir uç sayısı blok boyundan bu beşi çıkarınca kalandır.
- **OT64** — Kâhin kurgunun kendisidir: her alt ağın gerçek uç talebini biz yazdığımız için
  biliriz. Plan bu bilgiyi kullanmaz, yalnız tek öneği uygular.
- **OT65** — Ölçüm bir bulut çağrısı değildir; hiçbir nesne yaratılmaz, hiçbir sağlayıcıya
  istek gönderilmez. Sayılan şey adres aritmetiğidir.
- **OT66** — Karşılaştırma satırı olan **özneye göre** plan, kaldıracın yokluğudur: her alt
  ağ kendi talebini kapsayan en küçük bloğu alır ve karar sayısı kırk olur.

#### Ölçüm

```python
"""Bulut agi: tek alt ag onek uzunlugu kirk alt aga birden.

Kaldirac   - sanal agin butun alt aglarinda kullanilan tek onek uzunlugu.
Kuyruk     - blogu talebini karsilamayan alt ag.
Gorunmeyen - alt aglarda bosta duran adres.
"""
TOHUM = 20260812
SANAL_AG_ONEK = 20      # sanal agin adres blogu
AYRILAN = 5             # her alt agda kullanilamayan adres


def uretec(tohum):
    d = tohum % 2147483646 + 1

    def r(n):
        nonlocal d
        d = (d * 48271) % 2147483647
        return d % n
    return r


def ozneler(sayi=40, tohum=TOHUM):
    r, liste = uretec(tohum), []
    for i in range(sayi):
        liste.append({
            "no": i + 1,
            "kapasite": 20 + r(81),
            "gecikme": 5 + r(45),
            "sinif": ("etkilesim", "toplu", "yedek")[r(3)],
            "ozel": r(9) == 0,
        })
    return liste


def blok(onek):
    return 1 << (32 - onek)


def tek_onek(oz, onek):
    """Tek onek kirk alt aga uygulanir; talep uc sayisiyla olculur."""
    kullanilabilir = blok(onek) - AYRILAN
    sigmayan = eksik = bosta = 0
    for o in oz:
        fark = o["kapasite"] - kullanilabilir
        if fark > 0:
            sigmayan += 1
            eksik += fark
        else:
            bosta -= fark
    return kullanilabilir, sigmayan, eksik, bosta, blok(onek) * len(oz)


def onege_gore(o):
    """Bir ozneyi kapsayan en kucuk blogun onegi."""
    onek = 32
    while blok(onek) - AYRILAN < o["kapasite"]:
        onek -= 1
    return onek


oz = ozneler()
sanal = blok(SANAL_AG_ONEK)
print(f"sanal ağ /{SANAL_AG_ONEK} = {sanal} adres | alt ağ {len(oz)} | "
      f"uç talebi {min(o['kapasite'] for o in oz)}–{max(o['kapasite'] for o in oz)} "
      f"| toplam talep {sum(o['kapasite'] for o in oz)}")
print()
print(f"{'önek':>6s} {'kullanılabilir':>14s} {'sığmayan':>9s} {'eksik uç':>9s} "
      f"{'boşta adres':>12s} {'gereken adres':>14s} {'sanal ağa':>10s}")
for onek in (27, 26, 25, 24):
    k, s, e, b, g = tek_onek(oz, onek)
    print(f"  /{onek:<3d} {k:14d} {s:9d} {e:9d} {b:12d} {g:14d} "
          f"{'sığar' if g <= sanal else 'sığmaz':>10s}")

toplam = bosta = 0
for o in oz:
    onek = onege_gore(o)
    toplam += blok(onek)
    bosta += blok(onek) - AYRILAN - o["kapasite"]
print(f"  {'özneye göre':<12s} {'—':>7s} {0:9d} {0:9d} {bosta:12d} {toplam:14d} "
      f"{'sığar' if toplam <= sanal else 'sığmaz':>10s}")
print()
dagilim = {}
for o in oz:
    dagilim[onege_gore(o)] = dagilim.get(onege_gore(o), 0) + 1
print("özneye göre planda kaç ayrı önek:", len(dagilim),
      "-", {f"/{k}": v for k, v in sorted(dagilim.items())})
```

```
sanal ağ /20 = 4096 adres | alt ağ 40 | uç talebi 22–99 | toplam talep 2336

  önek kullanılabilir  sığmayan  eksik uç  boşta adres  gereken adres  sanal ağa
  /27              27        36      1265            9           1280      sığar
  /26              59        17       371          395           2560      sığar
  /25             123         0         0         2584           5120     sığmaz
  /24             251         0         0         7704          10240     sığmaz
  özneye göre        —         0         0          984           3520      sığar

özneye göre planda kaç ayrı önek: 3 - {'/25': 17, '/26': 19, '/27': 4}
```

#### Kuyruk Nereye Taşındı

Dört satır tek bir kaldıracın dört ayarını gösteriyor ve hiçbiri temiz değil.

`/27` bloğu kırk alt ağın **36**'sını kısa bırakıyor; eksik uç sayısı **1265**. Buna karşılık
boşta duran adres yalnızca **9** — plan sıkı, çünkü hemen hemen hiçbir alt ağa fazla adres
vermiyor. Sıkılığın bedeli, kırkta otuz altılık bir kuyruktur.

`/26` kuyruğu **17**'ye indiriyor ve eksik ucu **371**'e. Boşta kalan adres **9**'dan
**395**'e çıkıyor. Kaldıracın bir kademe büyütülmesi kuyruğu yarıdan fazla eritti ama kırk
alt ağın on yedisi hâlâ talebini karşılayamıyor.

`/25` kuyruğu **0**'a indiriyor. Kırk alt ağın kırkı da talebini karşılıyor, eksik uç yok.
Ve tam bu satırda sağdaki sütun sözü alıyor: bu plan **5120** adres istiyor, sanal ağın
bloğu ise **4096**. Plan sanal ağa **sığmıyor**. `/24` aynı şeyi daha ağır yapıyor: **10240**
adres, boşta duran **7704**.

Kuyruk yok olmadı. **Alt ağdan sanal ağa taşındı.** `/26`'da on yedi alt ağ kısa kalıyordu;
`/25`'te hiçbir alt ağ kısa kalmıyor ama sanal ağın kendisi kısa kalıyor — ve sanal ağın
bloğu **OT62** gereği büyütülemez. Kuyruğun yeni adı artık "on yedi özne" değil, "bütün
kurulum". Kaldıracı büyütmek kuyruğu kaldırmadı, kimin kuyrukta olduğunu değiştirdi.

#### Boşta Kalan Adres

Yalnız sığmayan alt ağı sayan bir gösterge `/25` satırını **kusursuz** okur: sıfır kuyruk.
O satırda **2584** adres hiçbir uca verilmeden duruyor — planın istediği **5120** adresin
yarısı. Aynı gösterge `/27` satırını en kötü satır olarak okur, oysa orada boşta duran adres
yalnız **9**'dur.

İki sayı aynı anda vardır ve tek bir gösterge ikisini birden göremez. Bu, kursun boyunca
sayılan dördüncü okumadır: **aşımı sayan gösterge boşluğu görmez.** Adres planlamasında
boşluk görünmez olduğu için özellikle pahalıdır — hiçbir uyarı üretmez, hiçbir günlüğe
düşmez ve ancak sanal ağa yeni bir alt ağ eklenemediğinde fark edilir.

Son satır, kaldıracın kendisinin ne kadara mal olduğunu söylüyor. Her alt ağa kendi öneği
verildiğinde kuyruk **0**, boşta kalan adres **984**, gereken adres **3520** oluyor ve plan
sanal ağa sığıyor. Yani doğru cevap vardır; yalnız tek bir sayıyla ifade edilemez. Bedeli
sondaki satırda yazılı: plan **üç ayrı önek** taşıyor, kırk ayrı karar gerektiriyor ve tek
satırlık adres özetlemesini bozuyor. Kaldıraç kuyruğu bu yüzden vardır: kırk kararın
maliyeti, kuyruğun maliyetinden büyük görüldüğü için.

#### Güvenlik Grubu ve Ağ Geçidi

Kalan iki nesne aynı örüntünün başka iki yüzüdür ve bu derste ölçülmez; her biri kendi
kuyruğunu doğurur.

**Güvenlik grubu** bir kural dizisidir ve tek bir grup çok sayıda arayüze iliştirilir.
Grubun bir kuralını genişletmek, iliştirildiği her arayüzde birden genişletir. Kuralın
kaynağını adres yerine **başka bir güvenlik grubuna** bağlamak bu genişlemeyi daraltır:
kural artık bir adres aralığına değil, bir üyeliğe bağlıdır ve üyelik listesi nesne
yaşam döngüsüyle birlikte güncellenir. Grubun kaç arayüze iliştirildiği ise ayrıca sayılmak
zorundadır; sayılmadığında bir kuralın kaç özneye dokunduğu bilinmez.

**Ağ geçidi** sanal ağın dışarıyla ilişkisini kuran nesnedir ve türü yönü belirler: kimi
geçit yalnız içeriden dışarıya izin verir, kimi iki yönlü bir yol açar, kimi de yalnız
belirli bir karşı ağla eşleşir. Yön burada bir güvenlik özelliğidir, bir başarım özelliği
değil. Dışarı çıkış geçidi tek yönlü olduğu için içeriye gelen bağlantı yoktur; iki yönlü
bir geçit yaratmak bu daraltmayı kaldırır ve kaldırdığı anda sanal ağdaki her alt ağ için
kaldırır. Daraltma, geçidin yalnız gereken alt ağların yönlendirme tablosuna yazılmasıdır:
geçit sanal ağ düzeyinde var olsa bile, yolu olmayan alt ağ oradan geçemez.

#### Özet

- Bulut ağının nesneleri aygıt değil yapılandırma kaydıdır; anında yaratılırlar ama kimi
  alanları — sanal ağın bloğu gibi — yaratıldıktan sonra değiştirilemez ve o alan kırk
  öznenin ortak sınırı olur.
- Tek bir alt ağ önek uzunluğu bir kaldıraçtır: `/27` kırk alt ağın **36**'sını, `/26` ise
  **17**'sini talebinin altında bırakır.
- Kuyruğu sıfırlayan `/25` planı **5120** adres ister, sanal ağın bloğu **4096**'dır; kuyruk
  yok olmaz, alt ağdan sanal ağa taşınır.
- Boşta kalan adres ayrı bir sayıdır: `/25`'te **2584**, `/27`'de **9**. Yalnız sığmayanı
  sayan gösterge bu farkı göremez.
- Her alt ağa kendi öneğini vermek kuyruğu **0**'a, boşta kalanı **984**'e indirir ama üç
  ayrı önek ve kırk ayrı karar getirir; kaldıraç tam olarak bu kırk kararı almamak için
  vardır.

#### Sonraki Adım

Bu dersin bütün ölçümü tek bir sanal ağın içindeydi: kırk alt ağ aynı bloktan kesildi, aynı
geçitleri paylaştı, aynı kaldıraca uydu. Oysa bulut nesnelerinin var olma nedeni çoğu zaman
kendi sahip olduğumuz ağla birlikte çalışmalarıdır ve o ağ başka bir yerdedir. Sonraki ders
iki ağı birbirine bağlayan seçenekleri ölçer: paylaşılan bir yol üzerinden kurulan siteler
arası tünel ile ayrılmış bir yol veren adanmış bağlantı hangi özneye ne verir ve ikisi
birlikte kullanıldığında kuyruk hangi sınıfın üstünde toplanır.

### Hibrit Bağlantı

Source: https://academia.sh/tr/kurslar/ag-isletimi/hibrit-baglanti

Siteler arası tünel ile adanmış bağlantı arasındaki seçim tek bir kaldıraçtır: yalnız adanmış bağlantı kırk öznenin 23'ünü yolsuz bırakır, yalnız tünel 14'ünü bütçesinin dışına atar, ikisi birlikte kuyruğu 9'a indirir ama dokuzunun da aynı sınıftan çıkmasına yol açar.

Önceki dersin bütün ölçümü tek bir sanal ağın içindeydi. Kırk alt ağ aynı bloktan kesildi,
aynı geçitleri paylaştı, tek bir öneğe uydu. Oysa bulut nesnelerinin var olma nedeni çoğu
zaman kendi sahip olduğumuz ağla birlikte çalışmalarıdır — ve o ağ başka bir yerdedir,
başka bir adres alanındadır, başka bir ekibin sorumluluğundadır.

**Hibrit bağlantı (hybrid connectivity)**, iki ağı tek bir adresleme ve erişim düzlemi gibi
davranmaya zorlayan bağlantı katmanıdır. İki temel seçenek vardır ve ikisi de aynı işi
yapar: **siteler arası tünel** paylaşılan bir yolun üstünde şifreli bir kanal açar,
**adanmış bağlantı (dedicated link)** ise iki ağ arasında ayrılmış bir yol verir. Bu dersin
sorusu hangisinin daha iyi olduğu değildir. Soru şudur: seçim tek bir kaldıraç olarak
kırk özneye uygulandığında **hangi özne ne alır** ve geriye kim kalır.

#### İki Yol

İki seçeneği ayıran şey teknoloji değil, **kimin kapasitesini paylaştığıdır**.

Siteler arası tünel var olan bir yolun üstüne kurulur. Yol paylaşılmıştır: kapasitesi
öngörülemez, gecikmesi başkalarının yüküyle birlikte değişir ve tünelin kendisi şifreleme
ile kapsülleme yüzünden sabit bir ek gecikme koyar. Karşılığında kurulumu bir yapılandırma
işidir; yeni bir tünel açmak yeni bir kayıt yaratmaktır.

Adanmış bağlantı ise iki uç arasına ayrılmış bir yoldur. Kapasitesi bellidir ve
başkalarıyla paylaşılmaz, gecikmesi kararlıdır, üstünden geçen trafik paylaşılan yola hiç
çıkmaz. Karşılığında kapasitesi **fiziksel bağlantıya bağlıdır**: kurulurken seçilen sayı
ancak o bağlantıda yer kaldığı ölçüde bir yapılandırma değişikliğiyle büyür; yer kalmadıysa
değişim yeni bir kurulum ister.

```text
# ogretilen yapilandirma dokumu , calistirilmamistir

siteler arasi tunel:
  karsi uc: sirket-omurgasi
  tunel secici:
    - 10.40.0.0/20 -> 172.20.0.0/16
  anahtar malzemesi: gizli depodan okunur, burada yazilmaz
  ek gecikme: paylasilan yolun durumuna baglidir

adanmis baglanti:
  karsi uc: sirket-omurgasi
  ayrilmis kapasite: kurulumda secilir, sonradan buyutulemez
  yol: paylasilan yola cikmaz

yonlendirme onceligi:
  1. adanmis baglanti
  2. siteler arasi tunel      # adanmis dolu ya da arizaliysa
```

Anahtar malzemesi, kimlik bilgisi ve önceden paylaşılan sır bu derste hiçbir örnekte
yazılmaz; nereden okunduğu yukarıdaki dökümde bir satırla söylenir ve geçilir.

Tünelin **yönlendirme** yanı — tünel seçicinin hangi hedefleri içeri aldığı, seçilmeyen
akışın kural dizisine hiç uğramaması, atanan bölgenin iki yönü zıt yönlerde çekmesi —
**Kablosuz Ağlar ve Ağ Güvenliği** kursunun VPN dersinde ölçüldü ve burada
tekrarlanmaz. O ders tünelin **hangi akışı içeri aldığını** saydı. Bu ders tünelin içine
giren akışa **ne verdiğini** sayar.

#### Kaldıraç: Yol Seçimi

Operatörün eline üç seçenek verilir ve biri seçilir. Seçim kırk öznenin kırkına birden
uygulanır: yalnız adanmış bağlantı, yalnız tünel, ya da ikisi birlikte.

Üçüncü seçenekte bir öncelik kuralı gerekir, çünkü adanmış bağlantının kapasitesi kırk
öznenin toplam talebinden küçüktür. Kural işletmede en sık görülen biçimiyle alınır:
**sınıf önceliği**. Gecikmeye en duyarlı sınıf adanmış bağlantıya önce yerleşir, kalanlar
tünele düşer.

Her öznenin bir **gecikme bütçesi** vardır ve bütçe sınıfından gelir. Bir özne bütçesini
aşarsa kuyruktadır. Hiç yol bulamazsa kuyruğun daha ağır bir biçimindedir: hizmet alamaz.

Ölçümün varsayımları:

- **OT67** — Kırk özne kursun sabit kümesidir; küme değiştirilmez. Öznenin kapasitesi
  adanmış bağlantıdan istediği birim, gecikmesi ise yolun tünelsiz taban gecikmesidir.
- **OT68** — Adanmış bağlantının kapasitesi **900** birimdir ve toplam talep **2336**'dır;
  kapasite kurulumda seçilmiştir ve ölçüm boyunca büyütülemez.
- **OT69** — Tünel, taban gecikmenin üstüne sabit **30 ms** koyar. Tünelin kapasitesi
  sınırlanmamıştır; paylaşılan yol darboğaz olduğunda bunu kapasiteyle değil **gecikmeyle**
  gösterir.
- **OT70** — Gecikme bütçeleri sınıfa göredir: etkileşim **45 ms**, toplu **60 ms**, yedek
  **120 ms**. Bütçe bir hizmet kararıdır, ölçümün bulgusu değil.
- **OT71** — İkisi birlikte seçiminde adanmış bağlantı sınıf önceliğiyle doldurulur;
  sınıf içinde sıra özne numarasıdır ve kapasitesi kalan yere sığmayan özne tünele geçer.
- **OT72** — Bütçesine **15 ms**'den az pay kalan özne **payı dar** sayılır. Bu özne
  göstergede kuyrukta görünmez; kuyruğa girmesi için yalnız yolun bozulması yeter.
- **OT73** — Kâhin kurgunun kendisidir: kapasiteyi, taban gecikmeyi ve sınıfı biz
  yazdığımız için biliriz. Ölçüm bir ağ ölçümü değildir; hiçbir tünel kurulmaz, hiçbir
  karşı uca istek gönderilmez.

#### Ölçüm

```python
"""Hibrit baglanti: tek yol secimi kirk ozneye birden.

Kaldirac   - sirketin ic trafigi hangi yoldan gecirilir.
Kuyruk     - gecikme butcesini asan ve hic yol bulamayan ozne.
Gorunmeyen - butcesine PAY_ESIGI ms'den az pay kalan ozne.
"""
TOHUM = 20260812
ADANMIS = 900           # adanmis baglantinin birim kapasitesi
TUNEL_EK = 30           # paylasilan yolda tunelin ekledigi ms
TUNEL_KOTU = 80         # paylasilan yol bozuldugunda ek ms
BUTCE = {"etkilesim": 45, "toplu": 60, "yedek": 120}
ONCELIK = ("etkilesim", "toplu", "yedek")
PAY_ESIGI = 15          # butceye bu kadardan az pay kalmissa gorunmeyen kuyruk


def uretec(tohum):
    d = tohum % 2147483646 + 1

    def r(n):
        nonlocal d
        d = (d * 48271) % 2147483647
        return d % n
    return r


def ozneler(sayi=40, tohum=TOHUM):
    r, liste = uretec(tohum), []
    for i in range(sayi):
        liste.append({
            "no": i + 1,
            "kapasite": 20 + r(81),
            "gecikme": 5 + r(45),
            "sinif": ("etkilesim", "toplu", "yedek")[r(3)],
            "ozel": r(9) == 0,
        })
    return liste


def yerlestir(oz, secim):
    """Her ozneye bir yol atar: 'adanmis', 'tunel' ya da 'yok'."""
    if secim == "tunel":
        return {o["no"]: "tunel" for o in oz}
    yol, kalan = {}, ADANMIS
    sirali = sorted(oz, key=lambda o: (ONCELIK.index(o["sinif"]), o["no"]))
    for o in sirali:
        if o["kapasite"] <= kalan:
            yol[o["no"]] = "adanmis"
            kalan -= o["kapasite"]
        else:
            yol[o["no"]] = "tunel" if secim == "ikisi" else "yok"
    return yol


def olc(oz, yol, ek):
    """Butceyi asan, hizmet alamayan ve payi daralan ozneler."""
    asan = asan_ms = hizmetsiz = dar = 0
    for o in oz:
        y, butce = yol[o["no"]], BUTCE[o["sinif"]]
        if y == "yok":
            hizmetsiz += 1
            continue
        gecikme = o["gecikme"] + (ek if y == "tunel" else 0)
        if gecikme > butce:
            asan += 1
            asan_ms += gecikme - butce
        elif butce - gecikme < PAY_ESIGI:
            dar += 1
    return asan, asan_ms, hizmetsiz, dar


oz = ozneler()
print(f"özne {len(oz)} | toplam talep {sum(o['kapasite'] for o in oz)} | "
      f"adanmış bağlantı {ADANMIS} birim | tünel ek gecikme {TUNEL_EK} ms")
print("gecikme bütçesi: " + ", ".join(f"{s} {BUTCE[s]} ms" for s in ONCELIK))
print()
print(f"{'seçim':<16s} {'adanmışta':>10s} {'tünelde':>8s} {'yolsuz':>7s} "
      f"{'bütçeyi aşan':>13s} {'aşan ms':>8s} {'payı dar':>9s}")
for secim in ("adanmis", "tunel", "ikisi"):
    yol = yerlestir(oz, secim)
    a, ms, h, d = olc(oz, yol, TUNEL_EK)
    print(f"{secim:<16s} {sum(1 for v in yol.values() if v == 'adanmis'):10d} "
          f"{sum(1 for v in yol.values() if v == 'tunel'):8d} "
          f"{sum(1 for v in yol.values() if v == 'yok'):7d} "
          f"{a:13d} {ms:8d} {d:9d}")

print()
print(f"paylaşılan yol bozulduğunda (ek gecikme {TUNEL_EK} → {TUNEL_KOTU} ms)")
print(f"{'seçim':<16s} {'bütçeyi aşan':>13s} {'aşan ms':>8s} {'payı dar':>9s}")
for secim in ("adanmis", "tunel", "ikisi"):
    yol = yerlestir(oz, secim)
    a, ms, h, d = olc(oz, yol, TUNEL_KOTU)
    print(f"{secim:<16s} {a:13d} {ms:8d} {d:9d}")

print()
yol = yerlestir(oz, "ikisi")
for sinif in ONCELIK:
    grup = [o for o in oz if o["sinif"] == sinif]
    ad = sum(1 for o in grup if yol[o["no"]] == "adanmis")
    asan = sum(1 for o in grup
               if yol[o["no"]] == "tunel"
               and o["gecikme"] + TUNEL_EK > BUTCE[sinif])
    print(f"ikisi birlikte | {sinif:<10s} özne {len(grup):2d} | "
          f"adanmışta {ad:2d} | tünelde {len(grup) - ad:2d} | "
          f"bütçeyi aşan {asan:2d}")
```

```
özne 40 | toplam talep 2336 | adanmış bağlantı 900 birim | tünel ek gecikme 30 ms
gecikme bütçesi: etkilesim 45 ms, toplu 60 ms, yedek 120 ms

seçim             adanmışta  tünelde  yolsuz  bütçeyi aşan  aşan ms  payı dar
adanmis                  17        0      23             0        0         2
tunel                     0       40       0            14      144        10
ikisi                    17       23       0             9       76         5

paylaşılan yol bozulduğunda (ek gecikme 30 → 80 ms)
seçim             bütçeyi aşan  aşan ms  payı dar
adanmis                      0        0         2
tunel                       32     1508         1
ikisi                       16      758         3

ikisi birlikte | etkilesim  özne 11 | adanmışta 11 | tünelde  0 | bütçeyi aşan  0
ikisi birlikte | toplu      özne 20 | adanmışta  5 | tünelde 15 | bütçeyi aşan  9
ikisi birlikte | yedek      özne  9 | adanmışta  1 | tünelde  8 | bütçeyi aşan  0
```

#### Üç Seçimin Kuyruğu

İlk satır bir tuzaktır ve dikkatle okunmalıdır. **Yalnız adanmış bağlantı** seçiminde
bütçeyi aşan özne **0**, aşan ms **0**. Gecikmeyi ölçen bir gösterge bu kurulumu kusursuz
gösterir. Yanındaki sütun neyin ödendiğini söylüyor: kırk öznenin **23**'ü hiçbir yol
bulamıyor. Adanmış bağlantı **900** birim, toplam talep **2336**; kapasite bitince sıradaki
özne dışarıda kalıyor.

Kuyruk yok olmadı, **göstergenin dışına çıktı**. Gecikme göstergesi yalnız hizmet alan
özneleri sayıyor ve hizmet alamayan bir öznenin gecikmesi yok. Kursun ilk dersinden beri
sayılan şeyin en keskin biçimi budur: iyi görünen bir sayının paydası, kuyruğun kendisi
tarafından küçültülmüş olabilir.

**Yalnız tünel** seçiminde payda düzeliyor — kırk öznenin kırkı da hizmet alıyor, yolsuz
kalan **0**. Bu kez kuyruk göstergenin içinde: **14** özne bütçesini aşıyor, toplam aşım
**144 ms**. Kapasite sorunu yok, gecikme sorunu var. Tünelin koyduğu **30 ms** sabittir ve
herkese aynı biçimde uygulanır; bütçesi dar olan sınıflar bunu kaldıramaz.

**İkisi birlikte** seçimi her iki göstergede de en iyisi: yolsuz **0**, bütçeyi aşan **9**,
aşan ms **76**. Adanmış bağlantı gecikmeye duyarlı özneleri alıyor, kalanlar tünelden
geçiyor. Kuyruk **14**'ten **9**'a iniyor.

#### Kuyruk Kimin Üstünde Toplandı

Alt döküm, ikisi birlikte seçiminin asıl sonucunu veriyor ve bu sonuç sayının kendisinden
önemlidir. Etkileşim sınıfının **11** öznesinin **11**'i de adanmış bağlantıda; bütçeyi aşan
**0**. Yedek sınıfının bütçesi **120 ms** olduğu için tüneldeki sekiz öznesi de rahat;
aşan **0**. Dokuz kuyruğun **dokuzu da** toplu sınıfından geliyor.

Öncelik kuralı bunu yaptı. Kural etkileşim sınıfını en öne koydu, o sınıf **580** birimle
adanmış bağlantının üçte ikisini aldı ve geriye kalan **320** birim toplu sınıfının yirmi
öznesinden yalnız beşine yetti. On beş toplu özne tünele düştü, dokuzu bütçesini aştı.

Bu, kursun ikinci iddiasının bu dersteki biçimidir. Üç seçimden hiçbiri kuyruğu kaldırmadı.
Yalnız adanmış bağlantı kuyruğu **hizmet alamayanlara**, yalnız tünel **bütçesi dar olan
herkese**, ikisi birlikte ise **tek bir sınıfa** yerleştirdi. En düşük sayıyı veren seçim,
acıyı en dar yere toplayan seçimdir. Hangisinin doğru olduğu bir ölçüm kararı değil, bir
politika kararıdır — ve toplu sınıfının dokuz öznesinin bunu kabul edip etmediği tablodan
okunamaz.

#### Devralma ve İki Yolun Yan Etkileri

İkisi birlikte kurulumunun asıl gerekçesi çoğu zaman kapasite değil **devralmadır**:
adanmış bağlantı arızalandığında trafik tünele düşer ve hizmet kesilmez. Bunun bedeli
ölçümde zaten yazılı. Adanmış bağlantı düştüğü anda kırk öznenin kırkı tünele geçer, yani
kurulum **tünel satırına** iner: bütçeyi aşan **14**, aşan ms **144**. Devralma hizmeti
sürdürür ama kuyruğu dokuzdan on dörde çıkarır ve bunu tek bir arıza anında yapar. Devralma
planı yapan bir işletme, devraldıktan **sonraki** satırı da yazmak zorundadır.

İki yolun aynı anda var olmasının iki yan etkisi daha vardır ve ikisi de bu ölçümün dışında
kalır.

Birincisi **adres çakışmasıdır**. Hibrit bağlantı iki ayrı adres alanını tek bir düzlem gibi
davranmaya zorlar; iki alan aynı bloğu kullanıyorsa hiçbir yol kurulamaz. Önceki dersin
sanal ağ bloğu bu yüzden bir kez ve geri dönüşsüz seçilen bir karardır: çakışmayı sonradan
çözmenin yolu, alt ağları yeniden numaralamak ya da adres dönüştüren bir katman eklemektir.
İkincisi ancak kural dizisinin okuduğu adresi bozarak çalışır.

İkincisi **yol asimetrisidir**. Gidiş adanmış bağlantıdan, dönüş tünelden geçebilir; iki
yönün ayrı yollar izlemesi tek başına bir hata değildir ama durum bilgisi tutan her nesneyi
bozar. Bir yönü gören güvenlik grubu öteki yönü görmez ve akışı yarım tanır. Daraltma,
yolun yönünü değil **akışı** bağlamaktır: iki uç arasındaki trafiğin her iki yönü de aynı
yola sabitlenir, sabitleme yönlendirme önceliğiyle iki uçta da aynı biçimde yazılır.

#### Görünmeyen Kuyruk: Dar Pay

Son sütun kuyruğa girmemiş ama sınırında duran özneleri sayıyor. Bütçesine **15 ms**'den az
payı kalan özne kuyrukta değildir; hiçbir uyarı üretmez, hiçbir raporda görünmez.

Paylaşılan yol bozulduğunda ne olduğunu ikinci tablo söylüyor. Tünelin ek gecikmesi
**30 ms**'den **80 ms**'ye çıktığında yalnız tünel seçiminde kuyruk **14**'ten **32**'ye,
aşan ms **144**'ten **1508**'e fırlıyor. İkisi birlikte seçiminde kuyruk **9**'dan **16**'ya,
aşım **76**'dan **758**'e çıkıyor. Adanmış bağlantı satırı hiç kıpırdamıyor: **0** ve **0**.
Ayrılmış yolun karşılığı budur ve tam olarak burada görünür.

Payı dar sütunundaki hareket ilk bakışta ters okunur. Yalnız tünel seçiminde bu sayı
**10**'dan **1**'e **iniyor**, ikisi birlikte seçiminde **5**'ten **3**'e. Bu bir iyileşme
değildir. Payı dar olan özneler bozulmayla birlikte **kuyruğa geçtiler**; sayının düşmesi,
sınırda duran özneler tükendiği içindir. Bir göstergenin iyileşmesi, saydığı kümenin
boşalmasından geliyor olabilir.

Buradan çıkan işletme kuralı tektir: dar pay ayrı bir gösterge olarak sayılmalıdır. Kuyruğu
sayan gösterge bozulmadan **sonra** konuşur; dar payı sayan gösterge bozulmadan **önce**
konuşur ve ikisi aynı sayı değildir.

#### Özet

- Siteler arası tünel paylaşılan bir yolun üstüne kurulur ve sabit bir ek gecikme koyar;
  adanmış bağlantı ayrılmış bir yol verir ama kapasitesi kurulumda seçilir ve ancak
  fiziksel bağlantıda yer kaldığı ölçüde büyür.
- Yalnız adanmış bağlantı seçiminde bütçeyi aşan özne **0**'dır, çünkü kırk öznenin **23**'ü
  hiç yol bulamaz ve göstergenin paydasına girmez.
- Yalnız tünel kırk öznenin kırkına yol verir ama **14**'ünü bütçesinin dışına atar; ikisi
  birlikte kuyruğu **9**'a indirir.
- Dokuz kuyruğun dokuzu da toplu sınıfındandır: öncelik kuralı etkileşim sınıfının onbirini
  adanmış bağlantıya alınca kalan **320** birim toplu sınıfının yalnız beş öznesine yetmiştir.
- Payı **15 ms**'den az kalan özneler kuyrukta görünmez; paylaşılan yol **30 ms**'den
  **80 ms**'ye bozulduğunda bunlar kuyruğa geçer ve dar pay sayısının düşmesi iyileşme değil,
  sınırdaki kümenin boşalmasıdır.

#### Sonraki Adım

Bu dersteki her sayı bir seçimin **sonucunu** verdi: yol seçildi, kırk özneye uygulandı,
kuyruk sayıldı. İşletmede bu sıra tersine çevrilmek istenir — kuyruğun ne olacağı, kaldıraca
dokunulmadan önce bilinsin. Sonraki ders bunun için kurulan yeri ölçer: gerçek ağın bir
kopyasının çıkarıldığı laboratuvar ortamını. Ölçülen şey laboratuvarın kendisi değil,
**gerçeği ne kadar temsil ettiğidir**: kaç özne modellenebiliyor, kaçı modellenemiyor ve
laboratuvarda doğrulanmış bir değişiklik sahada kaç öznede başka türlü davranıyor.

### Ağ Simülasyon Ortamları

Source: https://academia.sh/tr/kurslar/ag-isletimi/ag-simulasyon-ortamlari

Laboratuvar ortamının ölçeği bir kaldıraçtır: değişikliği sahada başarısız kılan on yedi özne ölçekten bağımsız olarak sabit kalır, değişen tek şey laboratuvarın kaçını önceden gördüğüdür ve tam ölçekte bile dokuz özne temsil edilemez.

Önceki ders bir yol seçiminin sonucunu saydı: seçim yapıldı, kırk özneye uygulandı, kuyruk
ölçüldü. Kursun bütün ölçümleri bu sırayı izledi. İşletmede bu sıra tersine çevrilmek
istenir — kaldıraca dokunmadan **önce** kuyruğun ne olacağı bilinsin.

**Laboratuvar ortamı (lab environment)** tam olarak bunun için kurulur: gerçek ağın bir
kopyası çıkarılır, değişiklik önce orada uygulanır, sonuç orada okunur. Bu dersin sorusu
laboratuvarın nasıl kurulduğu değildir. Soru şudur: laboratuvar gerçeği ne kadar temsil
eder ve orada doğrulanmış bir değişiklik sahada kaç öznede başka türlü davranır.

#### Laboratuvarın Sözü

Laboratuvar üç şeyi eksiksiz verir. Topoloji tam olarak kopyalanabilir: hangi aygıtın hangi
aygıta bağlı olduğu, hangi alt ağın nerede durduğu, hangi yolun hangi maliyeti taşıdığı.
Yapılandırma metindir, dolayısıyla birebir taşınır. Ve laboratuvar **yıkılabilir**: bozulan
bir kurulum silinip yeniden yaratılır, bu yüzden sahada denenemeyecek şeyler orada denenir.

Vermediği de üçtür ve ölçüyü ilgilendiren kısım budur. Zamanlama gerçek değildir: sanal
bağlantıların gecikmesi kurgudur, kuyruk davranışı gerçek yükte olduğu gibi çıkmaz. Yük
gerçek değildir: laboratuvarda üretilen trafik sahadakinin biçimini değil ölçeğini taklit
eder. Ve donanım gerçek değildir: aygıtın kendi kaynak sınırları, yonga düzeyindeki tablo
kapasitesi, satıcıya özgü davranışları **genel bir vekille** temsil edilir.

Bu üçüncüsü kaldıracı doğurur. Bir laboratuvar her aygıtı ayrı ayrı modellemez; bir
modelleme ölçeği seçilir ve o ölçek kırk öznenin hepsi için geçerlidir.

```text
# ogretilen laboratuvar tanimi , calistirilmamistir

topoloji:
  dugum:
    - ad: omurga-1
      model: genel yonlendirici
      arayuz: [ge-0, ge-1]
    - ad: kenar-07
      model: genel anahtar
      arayuz: [ge-0, ge-1]
  bag:
    - omurga-1:ge-0 <-> kenar-07:ge-0
      gecikme: 5ms          # kurgudur, olculmus degildir
      kapasite: 1g          # kurgudur

dogrulama:
  - erisilebilirlik: kenar-07 -> omurga-1
  - yapilandirma farki: sahadaki ile laboratuvardaki
  - geri alma provasi: degisiklik uygulanir ve geri alinir
```

Dökümdeki `model: genel` satırları dersin bütün sorusunu taşır. Laboratuvarda duran nesne
sahadaki aygıtın kendisi değil, onun **sınıfıdır**. Sınıf davranışı doğru, aygıt davranışı
yaklaşıktır.

#### Kaldıraç: Laboratuvarın Ölçeği

Ölçek bir maliyet kararıdır. Kırk özneyi birebir modellemek kırk düğüm, kırk yapılandırma ve
kırk kat kaynak demektir; dört özneyi modellemek bunun onda biridir. Operatör tek bir sayı
seçer: laboratuvarda kaç özne temsil edilecek.

Ölçülen değişiklik somut bir şeydir: her aygıtta sabit bir miktar kaynak ayıran bir
yapılandırma. Aygıtın kapasitesi bu miktarın altındaysa değişiklik o aygıtta başarısız olur.
Bunun yanında ikinci bir başarısızlık kaynağı vardır ve ölçekle hiç ilgisi yoktur: özel
aygıtlar laboratuvarda genel bir vekille temsil edildiği için, laboratuvarın onlar hakkında
verdiği hüküm kanıt değildir.

Ölçümün varsayımları:

- **OT74** — Kırk özne kursun sabit kümesidir ve değiştirilmez. Öznenin kapasitesi
  değişikliğin tüketebileceği kaynağın üst sınırıdır.
- **OT75** — Değişiklik her aygıtta **45** birim ayırır; kapasitesi bunun altında olan aygıt
  sahada başarısız olur.
- **OT76** — Özel aygıt laboratuvarda genel bir vekille temsil edilir. Kapasitesi yeterli
  olsa bile sahada başka davranır ve laboratuvar bunu **hiçbir ölçekte** göremez.
- **OT77** — Ölçek, modellenen öznelerin özne numarasına göre eşit aralıkla seçilmesidir:
  ölçek dörtte her onuncu, kırkta hepsi modellenir. Seçim kâhini kullanmaz.
- **OT78** — Kâhin kurgunun kendisidir: kapasiteyi ve hangi aygıtın özel olduğunu biz
  yazdığımız için biliriz. Laboratuvar bu bilgiye erişmez.
- **OT79** — Ölçüm bir laboratuvar kurulumu değildir; hiçbir düğüm başlatılmaz, hiçbir aygıt
  komutu çalıştırılmaz. Sayılan şey temsilin kapsamıdır.

#### Ölçüm

```python
"""Laboratuvar ortami: tek olcek karari kirk oznenin temsilini belirler.

Kaldirac   - laboratuvarda birebir modellenen ozne sayisi.
Kuyruk     - degisikligin sahada basarisiz oldugu ozne.
Gorunmeyen - sahada basarisiz olup laboratuvarda hic gorunmeyen ozne.
"""
TOHUM = 20260812
AYRILAN = 45      # degisikligin her aygitta ayirdigi birim


def uretec(tohum):
    d = tohum % 2147483646 + 1

    def r(n):
        nonlocal d
        d = (d * 48271) % 2147483647
        return d % n
    return r


def ozneler(sayi=40, tohum=TOHUM):
    r, liste = uretec(tohum), []
    for i in range(sayi):
        liste.append({
            "no": i + 1,
            "kapasite": 20 + r(81),
            "gecikme": 5 + r(45),
            "sinif": ("etkilesim", "toplu", "yedek")[r(3)],
            "ozel": r(9) == 0,
        })
    return liste


def sahada(o):
    """Degisiklik bu oznede basarisiz olur mu?"""
    return o["kapasite"] < AYRILAN or o["ozel"]


def laboratuvarda(o, modellenen):
    """Laboratuvar bu basarisizligi onceden gorur mu?

    Ozel aygit genel bir vekille temsil edilir; davranisi uretilemez.
    """
    return o["no"] in modellenen and o["kapasite"] < AYRILAN and not o["ozel"]


oz = ozneler()
print(f"özne {len(oz)} | değişikliğin ayırdığı {AYRILAN} birim | "
      f"kapasitesi yetmeyen {sum(o['kapasite'] < AYRILAN for o in oz)} | "
      f"özel aygıt {sum(o['ozel'] for o in oz)} | "
      f"sahada başarısız {sum(sahada(o) for o in oz)}")
print()
print(f"{'ölçek':>6s} {'modellenen':>11s} {'modellenmeyen':>14s} "
      f"{'sahada başarısız':>17s} {'laboratuvarda görülen':>22s} {'kaçan':>6s}")
for adim in (10, 5, 2, 1):
    modellenen = {o["no"] for o in oz if o["no"] % adim == 0}
    gorulen = sum(laboratuvarda(o, modellenen) for o in oz)
    basarisiz = sum(sahada(o) for o in oz)
    print(f"{len(modellenen):6d} {len(modellenen):11d} "
          f"{len(oz) - len(modellenen):14d} {basarisiz:17d} "
          f"{gorulen:22d} {basarisiz - gorulen:6d}")

print()
tam = {o["no"] for o in oz}
kacan = [o for o in oz if sahada(o) and not laboratuvarda(o, tam)]
print(f"tam ölçekte kaçan {len(kacan)} özne:",
      [(o["no"], o["kapasite"], "özel" if o["ozel"] else "genel") for o in kacan])
```

```
özne 40 | değişikliğin ayırdığı 45 birim | kapasitesi yetmeyen 12 | özel aygıt 9 | sahada başarısız 17

 ölçek  modellenen  modellenmeyen  sahada başarısız  laboratuvarda görülen  kaçan
     4           4             36                17                      0     17
     8           8             32                17                      1     16
    20          20             20                17                      3     14
    40          40              0                17                      8      9

tam ölçekte kaçan 9 özne: [(4, 30, 'özel'), (7, 78, 'özel'), (12, 55, 'özel'), (20, 29, 'özel'), (25, 31, 'özel'), (26, 56, 'özel'), (31, 57, 'özel'), (33, 24, 'özel'), (40, 70, 'özel')]
```

#### Ölçek Neyi Değiştirdi

Ortadaki sütun ölçekten ölçeğe hiç kıpırdamıyor: sahada başarısız olan özne **her ölçekte
17**. Laboratuvar sahayı değiştirmiyor, çünkü laboratuvar sahaya dokunmuyor. Kaldıracın
değiştirdiği tek şey sağdaki iki sütundur.

Ölçek **4**'te laboratuvar **hiçbir** başarısızlığı önceden görmüyor. Doğrulama tamamlanıyor,
rapor temiz çıkıyor, değişiklik onaylanıyor — ve sahada on yedi aygıtta başarısız oluyor.
Ölçek **8**'de görülen **1**, ölçek **20**'de **3** oluyor. Kırk öznenin yarısını modelleyen
bir laboratuvar, on yedi başarısızlığın üçünü yakalıyor.

Ölçek **40**'ta modellenmeyen özne kalmıyor ve görülen **8**'e çıkıyor. Kaçan yine de
**9**'dur. Son satır bu dokuzun kim olduğunu söylüyor: dokuzunun dokuzu da **özel aygıt**.
Beşinin kapasitesi 45'in üstündedir — başarısızlıkları kapasiteden değil, genel vekilin
temsil edemediği davranıştan gelir. Kalan dördünün kapasitesi zaten yetersizdir ve
laboratuvar bunu ölçebilecek durumda olsaydı görürdü; göremiyor, çünkü o dört aygıt hakkında
verdiği hüküm **hiçbir yönde kanıt değildir**.

Buradan çıkan sonuç kursun üçüncü iddiasının son biçimidir. **Laboratuvarın ölçeği
başarısızlığı azaltmadı; kaçının önceden görüldüğünü değiştirdi.** Ve ölçeği sonuna kadar
büyütmek bile kuyruğu kapatmıyor, çünkü kuyruğun bir bölümü ölçekten değil **temsilden**
geliyor. Kırk düğümlük bir laboratuvar dört düğümlükten on kat çok düğüm ister ve
karşılığında kaçan **17**'den **9**'a iner.

Bu, laboratuvarı gereksiz kılmaz; ne için kullanılacağını değiştirir. Laboratuvarın
güvenilir olduğu yer topolojidir — erişilebilirlik, yapılandırma farkı, geri alma provası.
Güvenilmez olduğu yer kapasite ve aygıta özgü davranıştır. Sahada uygulanacak her toplu
değişiklikte laboratuvar bu yüzden tek başına yeterli değildir: yanına **kuru çalışma**,
**kademeli yayma** ve yazılı bir **geri alma** adımı konur. Dokuz özne laboratuvarda
görünmüyorsa, onları ilk dalgada değil son dalgada görmek gerekir.

#### Özet

- Laboratuvar topolojiyi, yapılandırmayı ve geri alma provasını güvenilir biçimde verir;
  zamanlamayı, gerçek yükü ve aygıta özgü davranışı vermez.
- Laboratuvarın ölçeği tek bir kaldıraçtır ve sahadaki başarısızlığı değiştirmez: kırk
  öznenin **17**'si her ölçekte başarısız olur.
- Ölçek 4'te laboratuvar bu on yedinin **hiçbirini**, ölçek 20'de **3**'ünü, tam ölçekte
  **8**'ini önceden görür.
- Tam ölçekte bile kaçan **9** özne vardır ve dokuzu da özel aygıttır; kuyruğun bu bölümü
  ölçekten değil, genel vekille temsil edilmekten gelir.
- Laboratuvar bu yüzden onayın kendisi değil bir parçasıdır; yanında kuru çalışma, kademeli
  yayma ve yazılı geri alma bulunmak zorundadır.

#### Kurs Kapanışı

Kurs boyunca tek bir soru soruldu: operatör bir kaldıraca dokunduğunda, kırk özneden kaçına
yanlış hizmet etti. On altı ders bu soruyu on altı ayrı nesnede sordu ve her seferinde iki
sayı çıkardı — kuyruk ve kuyruğun göstergede **görünmeyen** bölümü.

| Ders | Kaldıraç | Kuyruk | Görünmeyen |
|---|---|---|---|
| Yük Dengeleyiciler | dengeleyicinin katmanı | katman 4'te **17**, katman 7'de **16** aşan özne | bağlantı sayısı göstergesi herkese **10** der; aşan 17 özne orada yoktur |
| Yük Dengeleme Algoritmaları | dağıtım kuralı | yük 1200'de **6 / 0 / 0 / 7**, yük 2600'de **23 / 40 / 40 / 22** | 1200'de boşta duran **1160** birim |
| Ters Vekil ve İleri Vekil | tek bir sınır sayısı | ters vekilde korunmayan özne **6**'dan **34**'e, ileri vekilde kısılan özne **27**'den **4**'e | ileri vekilin hiç görmediği **9** özne ve **430** birim |
| İçerik Dağıtım Ağları | kenarda hangi içeriğin duracağı | çekmede ıska **33**'ten **245**'e çıkar, sınırlı itmede **379** olur | kenarın hiç görmediği nesne **7**'den **25**'e; itmede boşa duran **402** birim |
| Hizmet Kalitesi | sıralama kuralı | karşılanamayan **433** birim üç kuralda da aynıdır; kuyruklu özne **40 / 9 / 29** | genel ortalama bekleme **1,19**'dan **0,40**'a inerken en uzun bekleme **3**'ten **13**'e çıkar |
| Ağ Telemetrisi | örnekleme oranı | kaçan ağır olay **0 / 13 / 15 / 20 / 20** | hiç görünmeyen özne **0 / 1 / 8 / 17 / 26** |
| Aygıt İzleme Protokolleri | yoklama zaman aşımı ve bildirim eşiği | zaman aşımı yiyen **30**'dan **0**'a; kaçan ağır **18**'den **4**'e | hiç sorulmayan **11**, hiç raporlanmayan **35**'e kadar çıkar |
| Paket Çözümleme | yakalama filtresinin darlığı ve tampon boyu | en dar filtre **91** akışı dışarıda bırakır ve **21** ağır olay kaçırır; süzgeçsizde **32** akış tampona sığmaz | filtre dar iken hiç görünmeyen **33** özne, süzgeçsizde bile **5** |
| Erişilebilirlik ve Gecikme Ölçümü | sınama listesinin kapsamı | dört hedefte **36** özne hiç sınanmaz; gösterge **37,5**–**62,5** arasında salınırken gerçek değer **57,5%**'te durur | görünmeyen erişilemez özne **15 / 12 / 11 / 3 / 0**, kaçan ağır olay **20**'ye kadar |
| Ağ Otomasyonunun Gerekçesi | elle dokunuş yerine tek şablon | elle **122** dokunuşta **12** hata, **10** hatalı aygıt | şablonun sapan **6** aygıtından raporda görünmeyen **6 / 3 / 3** |
| Yapılandırma Modelleri | yapılandırma modelinin kapsamı | modelin dışında kalan alan **42 / 17 / 9** | hiçbir modelin temsil edemediği **9** alan örneği |
| Programlanabilir Arayüzler | istek biçimi | ekleme biçimi etkisiz değildir ve ikinci uygulamada **40** aygıtta durumu değiştirir; yeniden denemede **5** aygıtı bozar | tam değişimin bildirmeden sildiği **9** aygıtın model dışı alanı |
| Betikle Aygıt Yönetimi | kırk aygıta uygulanan tek şablon | uyan **34**, sapan **6** — şablon hangi sınıfa göre yazılırsa yazılsın | raporda görünmeyen sapan **6 / 3 / 3**, raporun kapsamı **0,000 / 0,500 / 0,500** |
| Bulut Ağ Kavramları | tek alt ağ önek uzunluğu | `/26`'da bloğuna sığmayan **17** alt ağ | boşta duran adres: `/25`'te **2584**, `/27`'de **9** |
| Hibrit Bağlantı | iç trafiğin yol seçimi | ikisi birlikte **9** özne, dokuzu da toplu sınıfından | payı **15 ms**'den az kalan **5** özne |
| Ağ Simülasyon Ortamları | laboratuvarın ölçeği | sahada başarısız **17** özne, her ölçekte | tam ölçekte bile görünmeyen **9** özel aygıt |

On altı satırın her biri kendi dersinin ölçümünden okunmuştur; hiçbir sayı ortak tanımdan
kopyalanmamıştır.

Tablo tek bir örüntüyü tekrarlıyor. Kaldıracın "iyi" ayarı yoktur; kuyruğun **yerini
değiştiren** ayarları vardır. Ve her satırın sağ sütunu aynı şeyi söylüyor: bir kaldıracın
en pahalı etkisi ölçtüğü şeye değil, **ölçemediği şeye** yaptığıdır.

Bu kursla birlikte M04 müfredatı kapanıyor. Altı kurs aynı ağı altı ayrı ölçüyle geçti.

| Kurs | Ölçü ekseni |
|---|---|
| İnternet Nasıl Çalışır | tek bir isteğin uçtan uca izi ve her aşamanın bir sonrakine devrettiği tek şey |
| Ağ Modelleri ve Protokoller | katmanın verdiği söz ile açıkça vermediği söz |
| Uygulama Katmanı Protokolleri | aracının iletiden gidiş–dönüşsüz alabildiği karar |
| Anahtarlama ve Yönlendirme | tabloların anlaşmadığı sürede paketin kaderi |
| Kablosuz Ağlar ve Ağ Güvenliği | niyet edilen sınır ile gerçekten geçenin farkı |
| Ağ İşletimi ve Otomasyon | tek kaldıracın kırk öznede bıraktığı kuyruk |

Sıra rastgele değildir. İlk kurs bir isteği baştan sona izledi ve her aşamanın öncesini
unuttuğunu gösterdi. İkincisi bu unutmayı katmanlara böldü ve her katmanın neyi vaat edip
neyi **açıkça vaat etmediğini** ayırdı. Üçüncüsü vaadin iletide nasıl yazıldığını ve
okuyanın ondan ne çıkarabildiğini saydı. Dördüncüsü iletiyi taşıyan yolun kendisinin de bir
uzlaşma süresi olduğunu gösterdi. Beşincisi o yola konan sınırın niyetiyle sonucunun
ayrıldığı yeri ölçtü. Altıncısı, bütün bunları kırk özneye birden uygulayan tek bir eli
saydı.

Son adımda bir şey değişir. Bu kursun her ölçümünde tek bir operatör vardı: kaldıraca o
dokunuyordu, kuyruğu o okuyordu, geri almayı o yazıyordu. Gerçekte böyle değildir. Şablonu
biri yazar, gözden geçiren başkasıdır, uygulayan üçüncü kişidir, sahadaki dokuzuncu özel
aygıtı yalnız dördüncü kişi tanır. **Ağın işletilmesi bir ekip işidir** — ve tabloların
sağdaki sütunu, çoğu zaman bir kişinin bildiği ama yazılı olmadığı için ekibin bilmediği
şeydir.

Ekip işinin kendi disiplini vardır ve o disiplin bu müfredatta değil, **Yazılım Geliştirme
Pratiği** müfredatında kurulur: değişikliğin tarihçesinin tutulması, geri alınabilir
biçimde kaydedilmesi, uygulanmadan önce bir başkasınca okunması ve kararın gerekçesinin
yazıya geçmesi. Bu kursta "kuru çalışma, kademeli yayma, geri alma" diye yazılan üç adımın
her biri orada bir pratiğe karşılık gelir. Kaldıraca dokunan el bir kişinin elidir; o elin
ne yaptığını kırk öznenin sahibi olan ekibin bilmesi, ayrı bir disiplinin konusudur.

