Ders 14 / 30
Ad Alanları ve Kotalar
Çok kiracılı kaynak ayrımının sayılarla kurulması: üç kiracı bir kümeyi paylaşırken kota olmadan bir kiracının ötekileri aç bıraktığı ölçülür, kota konunca reddedilen istek sayısı ile kotanın boşta bıraktığı kapasite karşılaştırılır ve bildirimsiz kapsüllere uygulanan varsayılan istek değerinin kabul, fazla ayırma ve düğüm baskısı üzerindeki etkisi taranır.
İçindekiler
Gecelik iş küme nesnesi hâline geldi ve on iki dilimi bir anda açabiliyor. Buraya kadar ölçülen her sayı tek bir uygulamanın kendi hesabındaydı; kümenin başkalarına da ait olduğu hiç hesaba katılmadı. Aynı altı düğümde iki uygulama daha koşuyor ve üçünün nesneleri aynı adlandırma uzayında, aynı kaynak havuzunda duruyor.
Ad alanı bu uzayı bölen nesnedir. Sözcük tanıdıktır: çalışma zamanı ölçümlerinde ad alanı,
çekirdeğin bir sürece hangi süreçleri, hangi ağı ve hangi dosya sistemini gösterdiğini belirleyen
görünürlük eşlemesiydi; burada aynı sözcük, kümedeki nesne adlarını ve kaynak muhasebesini
bölen bir bölmeyi anlatıyor — biri bir sürecin gördüğünü kısar, öteki bir kiracının adlandırma
ve kaynak uzayını ayırır. İkisi farklı katmanlarda, farklı nesnelerdir.
Ad alanı tek başına yalnız adları ayırır; kaynağı ayırmaz. Kaynağı ayıran nesne kotadır. Bu ders devredilen kararı şöyle adlandırıyor: bir isteğin kabul edilip edilmeyeceği. Karar bir insandan kümeye geçtiğinde kümenin istek başına üç kalem bilmesi gerekiyor — hangi kiracı, ne kadar istiyor, gerçekte ne kadar kullanıyor. Üçüncü kalem hiçbir bildirimde yoktur; ancak ölçümle gelir ve bu dersin bütün sapması oradan çıkıyor.
Üç Kiracı, Bir Küme
Ölçülen üç durum aynı istek dizisini kullanıyor: kota yok, kota var, kota var ve bildirimsiz kapsüllere varsayılan uygulanıyor. Dizinin sırası değişmiyor, çünkü sıranın kendisi ölçülen şeylerden biri.
- TN49 — Küme kapasitesi, kiracılar, istek dizisi ve kota muhasebesi
nodeiçinde kurulan bir modeldir; gerçek bir küme koşturulmuyor. - TN50 — Küme 96 işlemci birimidir (6 düğüm × 16). Tek boyut ölçülüyor; bellek aynı aritmetikle işlediği için ayrıca sayılmıyor.
- TN51 — Üç kiracı kurgudur: ölçüm ağı, saha servisi, raporlama. Altmış istek geliyor; 11.–30. istekler ölçüm ağının gecelik patlamasıdır, ötekiler dönüşümlü.
- TN52 — İstek büyüklükleri kiracıya göre üreteçten geliyor: ölçüm ağı 1–6, saha servisi 1–4, raporlama 1–2 birim.
- TN53 — İsteklerin yaklaşık üçte biri kaynak isteği bildirmiyor. Gerçek kullanım, bildirilen değerin 0,4–1,1 katıdır.
- TN54 — Kota muhasebesi bildirilen isteğe bakar, gerçek kullanıma değil. Tohum
20260819.
// olcum/kota.mjs — uc kiracinin bir kumeyi paylasmasi: kotasiz, kotali ve varsayilan istekli. // MODEL: kume kapasitesi, kiracilar, istek dizisi ve kota muhasebesi node icinde kurulan modeldir; // gercek bir kume kosturulmuyor. Sayilar modelin sayilaridir. const KAPASITE = 96, TOHUM = 20260819; // 6 dugum x 16 islemci birimi const KIRACI = ["olcum-agi", "saha-servisi", "raporlama"]; let s = TOHUM % 2147483647; const rast = () => (s = (s * 48271) % 2147483647) / 2147483647; const ISTEK = []; // sira: donusumlu -> patlama -> donusumlu for (let i = 0; i < 60; i += 1) { const k = i >= 10 && i < 30 ? KIRACI[0] : KIRACI[i % 3]; const iste = 1 + Math.floor(rast() * (k === "raporlama" ? 2 : k === "saha-servisi" ? 4 : 6)); ISTEK.push({ k, iste, bildirdi: rast() >= 0.3, gercek: Math.max(1, Math.round(iste * (0.4 + rast() * 0.7))) }); } const say = (f) => KIRACI.map((k) => ISTEK.filter((i) => i.k === k && f(i)).length); // --- 1. kota yok: ilk gelen alir --- let kalan = KAPASITE; const kabul = new Set(); for (const [n, i] of ISTEK.entries()) if (i.iste <= kalan) { kalan -= i.iste; kabul.add(n); } console.log(`${"kiraci".padEnd(14)}${"gelen istek".padStart(12)}${"kabul".padStart(7)}${"red".padStart(6)}` + `${"kabul orani".padStart(13)}${"tuketilen".padStart(11)}${"kume payi".padStart(11)}`); for (const k of KIRACI) { const g = ISTEK.filter((i) => i.k === k), a = g.filter((i) => kabul.has(ISTEK.indexOf(i))); const t = a.reduce((x, i) => x + i.iste, 0); console.log(`${k.padEnd(14)}${String(g.length).padStart(12)}${String(a.length).padStart(7)}${String(g.length - a.length).padStart(6)}` + `${`%${Math.round(a.length / g.length * 100)}`.padStart(13)}${String(t).padStart(11)}${`%${Math.round(t / KAPASITE * 100)}`.padStart(11)}`); } console.log(`kotasiz: ${kabul.size} istek kabul, ${ISTEK.length - kabul.size} red, bosta kalan kapasite ${kalan}`); // --- 2. kota: iki dagitim --- function kotali(kota, varsayilan = null) { const kullanim = Object.fromEntries(KIRACI.map((k) => [k, 0])); const kabulK = Object.fromEntries(KIRACI.map((k) => [k, 0])); const kotaRed = Object.fromEntries(KIRACI.map((k) => [k, 0])); let bos = KAPASITE, gercek = 0, yazilan = 0, baski = 0; for (const i of ISTEK) { const yaz = i.bildirdi ? i.iste : (varsayilan === null ? i.iste : varsayilan); if (kullanim[i.k] + yaz > kota[i.k] || yaz > bos) { kotaRed[i.k] += 1; continue; } kullanim[i.k] += yaz; bos -= yaz; kabulK[i.k] += 1; yazilan += yaz; gercek += i.gercek; if (i.gercek > yaz) baski += 1; } return { kullanim, kabulK, kotaRed, bos, gercek, yazilan, baski }; } const DAGITIM = { esit: { "olcum-agi": 32, "saha-servisi": 32, raporlama: 32 }, agirlikli: { "olcum-agi": 48, "saha-servisi": 32, raporlama: 16 } }; console.log(`\n${"dagitim".padEnd(11)}${"kiraci".padEnd(14)}${"kota".padStart(6)}${"kabul".padStart(7)}${"kota reddi".padStart(12)}` + `${"kullanilan".padStart(12)}${"kotanin bos kalani".padStart(20)}`); for (const [ad, kota] of Object.entries(DAGITIM)) { const r = kotali(kota); for (const k of KIRACI) console.log(`${ad.padEnd(11)}${k.padEnd(14)}${String(kota[k]).padStart(6)}${String(r.kabulK[k]).padStart(7)}` + `${String(r.kotaRed[k]).padStart(12)}${String(r.kullanim[k]).padStart(12)}${String(kota[k] - r.kullanim[k]).padStart(20)}`); const toplamRed = KIRACI.reduce((a, k) => a + r.kotaRed[k], 0); console.log(` -> ${ad}: kabul ${ISTEK.length - toplamRed}, red ${toplamRed}, kumede bosta kalan kapasite ${r.bos} ` + `(kotalarin toplami ${Object.values(kota).reduce((a, b) => a + b, 0)})`); } // --- 3. varsayilan istek degeri --- console.log(`\n${"varsayilan istek".padEnd(17)}${"kabul".padStart(7)}${"kotaya yazilan".padStart(16)}${"gercek kullanim".padStart(17)}` + `${"fazla ayirma".padStart(14)}${"dugum baskisi".padStart(15)}${"bosta kapasite".padStart(16)}`); for (const v of [0, 1, 2, 4, null]) { const r = kotali(DAGITIM.agirlikli, v); const kabulT = KIRACI.reduce((a, k) => a + r.kabulK[k], 0); console.log(`${(v === null ? "bildirimi zorunlu" : String(v)).padEnd(17)}${String(kabulT).padStart(7)}${String(r.yazilan).padStart(16)}` + `${String(r.gercek).padStart(17)}${String(r.yazilan - r.gercek).padStart(14)}${String(r.baski).padStart(15)}${String(r.bos).padStart(16)}`); } console.log(`${ISTEK.length} istek, ${say((i) => !i.bildirdi).reduce((a, b) => a + b, 0)} tanesi istek bildirmiyor`); console.log(`bilgi kalemi: istek basina 3 (kiraci, istek, gercek kullanim) = ${ISTEK.length * 3}, tohum ${TOHUM}`);
kiraci gelen istek kabul red kabul orani tuketilen kume payi olcum-agi 34 26 8 %76 77 %80 saha-servisi 13 5 8 %38 13 %14 raporlama 13 4 9 %31 6 %6 kotasiz: 35 istek kabul, 25 red, bosta kalan kapasite 0 dagitim kiraci kota kabul kota reddi kullanilan kotanin bos kalani esit olcum-agi 32 13 21 32 0 esit saha-servisi 32 12 1 30 2 esit raporlama 32 13 0 21 11 -> esit: kabul 38, red 22, kumede bosta kalan kapasite 13 (kotalarin toplami 96) agirlikli olcum-agi 48 17 17 48 0 agirlikli saha-servisi 32 12 1 30 2 agirlikli raporlama 16 10 3 16 0 -> agirlikli: kabul 39, red 21, kumede bosta kalan kapasite 2 (kotalarin toplami 96) varsayilan istek kabul kotaya yazilan gercek kullanim fazla ayirma dugum baskisi bosta kapasite 0 53 79 92 -13 22 17 1 47 88 77 11 11 8 2 41 94 67 27 2 2 4 32 96 52 44 0 0 bildirimi zorunlu 39 94 64 30 0 2 60 istek, 22 tanesi istek bildirmiyor bilgi kalemi: istek basina 3 (kiraci, istek, gercek kullanim) = 180, tohum 20260819
Kota Yokken: Aç Kalan Kiracı
Kotasız kümede kural tek satırdır: yer varsa kabul et. Sonuç ilk tabloda.
Ölçüm ağı 34 istek gönderdi, 26’sı kabul edildi — kabul oranı %76 — ve kümenin %80’ini tuttu. Saha servisi 13 istekten 5’ini geçirebildi (%38), raporlama 13 istekten 4’ünü (%31). Raporlamanın küme payı %6. Küme boş kalmadı; kapasite tamamen tükendi ve 25 istek reddedildi.
Aç kalmanın nedeni istek büyüklüğü değil, sıra. Ölçüm ağının gecelik patlaması 11. istekten 30. isteğe kadar kesintisiz akıyor ve o aralıkta kapasitenin çoğunu tüketiyor; sonra gelen küçük raporlama istekleri artığa talip oluyor. Raporlamanın istekleri en küçük olanlar (1–2 birim) ve yine de en düşük kabul oranını alıyor. Yani kotasız paylaşımda pay, ihtiyaca ya da kibarlığa değil, zamanlamaya göre dağılıyor. Bir kiracının kendi kapsül sayısını artırması ötekinin istekleri üzerinde doğrudan bir etkidir ve bu etki hiçbir yerde bildirilmez.
Reddedilen 25 isteğin ne olduğu da ayrıca söylenmelidir. İstek reddedilmiyor, bekliyor: kapsül nesnesi bildirilmiş durumda, yalnız hiçbir düğümde yeri yok. Raporlamanın kullanıcısı bunu bir hata olarak görmez, yavaşlık olarak görür ve nedenini kendi ad alanında arar. Kotasız paylaşımın en pahalı yanı budur — bir kiracının sorunu başka bir kiracının davranışından doğuyor ve iki tarafın da göremediği bir yerde duruyor.
Ad alanı bu tabloyu değiştirmez. Üç kiracının nesneleri ayrı ad alanlarında dursa da aynı 96 birimi
paylaşırlar; ad alanı yalnız gecelik-is adının üç kez kullanılabilmesini ve yetkinin bölme
başına verilebilmesini sağlar. Kaynak ayrımı için ikinci bir nesne gerekiyor.
Kota Konunca: İki Bedel
İkinci tablo kotanın ne satın aldığını ve karşılığında ne ödettiğini birlikte gösteriyor.
Eşit dağıtımda (32/32/32) ölçüm ağı kotasına çarpıyor: 21 kota reddi alıyor ve 32 birimde duruyor. Karşılığında raporlama 13 isteğinin hepsini geçiriyor, tek bir ret bile almıyor. Aç kalma bitti. Bedel son sütunda: raporlama kotasının 11 birimini hiç kullanmıyor ve küme genelinde 13 birim boşta kalıyor. Ölçüm ağının 21 isteği reddedilirken kümede 13 birim boş duruyor — kotanın israfı tam olarak budur. Toplam kabul kotasız durumdaki 35’ten 38’e çıkıyor, yani kota verimi düşürmedi; ama boşta kalan kapasite sıfırdan 13’e çıktı.
Ağırlıklı dağıtımda (48/32/16) israf düşüyor: boşta kalan kapasite 2 birim, toplam kabul 39. Ölçüm ağının reddi 21’den 17’ye iniyor. Bedel yer değiştirdi — raporlama artık 3 ret alıyor. Ağırlık, talebin bilinmesini gerektiriyor; bu dağıtım ancak kim ne kadar isteyeceği önceden ölçüldüğü için doğru. Talep değişirse — örneğin raporlama aylık kapanışta büyürse — aynı dağıtım ters yönde israf üretir.
Kotanın saydığı kalem yalnız işlemci değildir. Aynı muhasebe bellek için, kalıcı birim talebinin toplam boyutu için ve nesne sayıları için ayrı ayrı tutulabilir — bir ad alanında en fazla kaç servis nesnesi, kaç sır nesnesi, kaç kalıcı birim talebi bulunabileceği gibi. Sayı kalemleri işlemci kaleminden farklı bir şeyi korur: kapasiteyi değil, denetim düzleminin kendi yükünü. Bir kiracının binlerce sır nesnesi bildirmesi hiçbir düğümü doldurmaz ama durum deposunu ve uzlaşma döngüsünü doldurur. Ölçülen tablo tek kalemi izliyor; ötekiler aynı aritmetikle işler.
İki satır birlikte okunduğunda kotanın gerçek doğası görünüyor: kota bir kapasite ayırma değil, bir üst sınırdır. Kullanılmayan kota kimseye geçmez; boşta kalan 13 birim ölçüm ağına açılmıyor, öylece duruyor. Devredilen karar burada kısmen geri alınmıştır: küme “bu isteği kabul et” kararını verir, ama “kim ne kadar alacak” kararını hâlâ kotayı yazan insan verir ve o insan gelecek haftanın talebini bilmez.
Varsayılan İstek Değeri
Üçüncü tablo, kota muhasebesinin dayandığı sayının nereden geldiğini soruyor. Altmış isteğin 22’si kaynak isteği bildirmiyor. Kota bir sayı görmek zorunda, o yüzden bildirimsiz kapsüllere bir varsayılan uygulanıyor.
Burada iki ayrı sayı vardır ve karıştırılmamalıdır. Kaynak isteği muhasebe ve yerleştirme sayısıdır: kota onu toplar, zamanlayıcı düğümde o kadar yer arar. Sınır koşum anında dayatılan tavandır; kapsül onu aşamaz. Kota her ikisini ayrı ayrı sayabilir ve ikisi için ayrı varsayılan tanımlanabilir. Aşağıdaki tarama istek varsayılanını değiştiriyor, çünkü kabul kararını belirleyen sayı odur; sınır varsayılanının etkisi başka bir yerde görünür — sınır düşük konursa kapsül kotadan geçer, düğümde yer bulur, sonra kendi tavanına çarpar ve iş yavaşlar ya da sonlanır. İkisi birlikte düşünülmediğinde kota tablosu temiz görünürken uygulama tarafında açıklanamayan sonlanmalar birikir.
Varsayılan 0 iken bu kapsüller kotadan hiçbir şey yemiyor: kabul 53’e fırlıyor, kotaya yazılan toplam 79’da kalıyor ve küme kendini 17 birim boşta sanıyor. Gerçek kullanım ise 92 — yani bildirilenden 13 birim fazla, ve 22 kapsül bildirdiğinden çoğunu kullanıyor. Küme muhasebe defterinde rahat, düğümlerde ise baskı altındadır. Bu, kotanın en tehlikeli ayarıdır: kural uygulanıyor görünür, uygulanmaz.
Varsayılan büyüdükçe tablo ters yöne dönüyor. 2 birimde düğüm baskısı 2’ye, 4 birimde 0‘a iniyor; kabul 53’ten 32’ye düşüyor ve fazla ayırma 44 birime çıkıyor — kotaya yazılan 96 birimin 44’ü hiç kullanılmıyor. Güvenlik satın alındı, karşılığında kümenin neredeyse yarısı kâğıt üzerinde harcandı.
Son satır üçüncü yolu veriyor: bildirimi zorunlu kılmak. Kabul 39, fazla ayırma 30, düğüm baskısı 0, boşta kapasite 2. Sabit bir varsayılanın hiçbir değeri bunu birden yakalayamıyor, çünkü varsayılan tek sayıdır ve 22 kapsülün gerçek ihtiyacı tek sayı değildir. Bildirimi zorunlu kılmanın bedeli ise küme tarafında değil, bildirimi yazan tarafta ödenir.
Konunun devir bilançosu şudur: kabul kararı istek başına üç kaleme dayanıyor — hangi kiracı, ne kadar istiyor, gerçekte ne kadar kullanıyor; altmış istek için 180 kalem. İlk iki kalem bildirimden gelir ve ucuzdur; üçüncüsü yalnız ölçümle gelir ve kota onu hiç görmez. Sistem gerçek kullanımı bilmediği için ya fazla ayırıp kapasiteyi boşa harcıyor ya da az ayırıp düğümü baskı altına sokuyor.
Özet
- Ad alanı ile kota ayrı işler yapar: ad alanı adları ve yetkiyi böler, kaynağı bölmez; kaynağı bölen nesne kotadır.
- Kotasız kümede pay ihtiyaca değil sıraya göre dağılıyor: ölçüm ağı %76 kabul oranıyla kümenin %80’ini alırken raporlama %31 kabul oranıyla %6’sında kalıyor ve 25 istek reddediliyor.
- Kota aç kalmayı bitiriyor ama iki bedel ödetiyor: eşit dağıtımda ölçüm ağı 21 kota reddi alırken raporlama kotasının 11 birimi ve kümenin 13 birimi boşta duruyor.
- Ağırlıklı dağıtım israfı 13’ten 2 birime indiriyor, karşılığında reddi raporlamaya kaydırıyor; doğruluğu talebin önceden bilinmesine bağlıdır.
- Kullanılmayan kota kimseye geçmez: kota bir kapasite ayırma değil üst sınırdır.
- Varsayılan istek 0 iken küme kendini 17 birim boşta sanırken gerçek kullanım 92 ve 22 kapsül düğüm baskısı yaratıyor; varsayılan 4 iken baskı sıfırlanıyor ama 44 birim fazla ayrılıyor. Bildirimi zorunlu kılmak baskıyı 0’a indirip israfı 30’da tutuyor.
Sonraki Adım
Konu boyunca nesneler tek tek bildirildi: en küçük dağıtım birimi, kopya kümesi ve sürüm nesnesi, servis nesnesi ve giriş kuralı, yapılandırma ve sır nesnesi, kalıcı birim talebi, sıralı küme, iş nesnesi ve zamanlanmış iş, ad alanı ve kota. Hepsinin ortak bir eksiği var ve bu ders onu son tabloyla açığa çıkardı: bildirimlerde istek var, kotalarda üst sınır var, ama hiçbir yerde “bu kapsül hangi düğümde açılacak” yazmıyor. Kota bir isteği kabul ettiğinde iş bitmiyor; kabul edilen kapsülün altı düğümden birine yerleşmesi gerekiyor ve o düğümde gerçekten yer bulunması gerekiyor. Depolama ölçümü bu sorunun yarısını çoktan gösterdi: tek düğüm yazar kipindeki bir birim otuz altı seçenekten yirmi altısını eledi. Peki kalan seçenekler arasından seçimi yapan nedir, karar verirken hangi bilgiye bakar, bakması gereken bilgi eskimişse ne olur ve hiçbir seçenek uymadığında kapsül nerede bekler? Sonraki konu bu kararı bir kısıt çözücü olarak yazıp yerleştirme kararını, çözümsüz kalma sayısını ve ölçekleme kararının kendi gecikmesini ölçüyor.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.