Ders 05 / 16
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.
İçindekiler
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:
# öğ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
"""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. Taşıma Katmanı kursunda ö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.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.