İçeriğe geç
academia.sh

Ders 20 / 21

Kota ve Servis Sınırları

Ölçek planı kurgu bir sınır tablosuna uygulanır: sekiz sınırın ortalama doluluğu %66,5, altısı beş ekip tarafından paylaşılır ve ikisi hiç artırılamaz. Büyüme planı işletildiğinde ilk dolan sınır en dolu olan değil, en hızlı sürücüye bağlı olandır — 3,1. ayda ad çözümleme, 4,3. ayda işlev eş zamanlılığı; on iki ayın sonunda sekiz sınırın yedisi aşılır. İstek büyümesi %2'den %25'e tarandığında önce dolan sınırın kimliği değişir. Sınıra çarpmanın bedeli davranışa ve artırma süresine bağlıdır: toplam 2.195 kurgu birim ve 116 sınır-gün, bunun %51,7'si tek bir sessiz kısma sınırından gelir.

İçindekiler

Önceki ders aşağı yönü ölçtü: neyin küçültülebileceği, neyin silinebileceği. Yukarı yönde de bir sayı vardır ve faturada hiç görünmez. Kiralanan katmanın her kalemi bir tavanla gelir; o tavan ödenen tutarla değil, sağlayıcının koyduğu kotayla belirlenir.

Kota mekaniğinin kendisi M22/K03’te ölçüldü ve burada tekrarlanmaz. Bu dersin sorusu ölçek planına aittir: hangi sınıra kaç birim kaldı, büyüme sürdüğünde hangisi önce dolar ve dolduğunda ne olur.

Sınır Tablosu ve Büyüme Planı

Örnek kurgu bölgesel ölçüm ağıdır: beş ekip, üç ortam, kiralanmış makine, ağ, depo, işlev ve kenar katmanı. Sınırlar, büyüme oranları ve tutarlar kurgudur; para birimi de kurgudur ve br diye anılır, gerçek bir fiyat listesine karşılık gelmez.

BM25: sekiz sınır vardır; her sınırın bir kapsamı (hesap, bölge, ağ, bölme) ve onu tüketen bir sürücüsü vardır. BM26: kapsam, sınırın kaç ekip tarafından paylaşıldığını belirler. BM27: büyüme planı sürücü bazındadır; her sürücünün aylık büyüme oranı ayrıdır. BM28: her sınırın artırılabilir bir tavanı ve artırma isteğinin bir süresi vardır; tavan sınıra eşitse sınır artırılamaz. BM29: sınıra çarpmanın davranışı dört türdür — oluşturma reddi, istek reddi, kuyruk, sessiz kısma — ve fark etme günü davranışa bağlıdır. BM30: sınır doluyken günlük bir kayıp oluşur; artırılamayan sınırda kayıp otuz gün, yani plan değişene kadar sürer.

Sınır tablosu ve büyüme planı süreç içi bir modeldir; gerçek bir sınır listesi yoktur.

// maliyet/sinir.mjs — kota ve servis siniri tablosu modeli: gercek bir sinir listesi yok. Her
// satir bir sinir, onu tuketen bir *surucu* ve sinira carpildiginda ne oldugu ile birlikte
// tutulur. Kota mekanigi M22/K03'te olculdu; burada olculen sey buyume planinin bu tabloya
// uygulanmasidir. Para birimi kurgudur ve `br` diye anilir.

// ad, kapsam, surucu, mevcut kullanim, sinir, artirilabilir tavan, artirma gunu, davranis,
// sinir doluyken gunluk kayip (br)
export const SINIR = [
  ["bolge basina makine cekirdegi", "bolge", "sayac", 412, 640, 2000, 6, "olusturma reddi", 34],
  ["saniyede nesne yazma istegi", "bolme", "istek", 1850, 3500, 12000, 4, "istek reddi", 61],
  ["islev es zamanli calisma", "hesap", "istek", 640, 1000, 4000, 3, "kuyruk", 18],
  ["saniyede ad cozumleme", "ag", "istek", 7200, 10000, 10000, 0, "sessiz kisma", 27],
  ["hesap basina sabit adres", "hesap", "kenar", 34, 50, 200, 5, "olusturma reddi", 9],
  ["hesap basina sanal ag", "hesap", "ortam", 9, 12, 40, 7, "olusturma reddi", 4],
  ["bolme basina saklama kurali", "bolme", "veri", 62, 100, 100, 0, "olusturma reddi", 6],
  ["kural kumesi basina kural", "ag", "hizmet", 148, 200, 400, 9, "olusturma reddi", 12],
];

// buyume plani: her surucunun aylik buyume orani (kurgu)
export const BUYUME = { sayac: 0.06, istek: 0.11, veri: 0.09, kenar: 0.05, ortam: 0.02,
  hizmet: 0.04 };

// kapsam sinirin kac ekip tarafindan paylasildigini belirler: hesap, bolge ve ag kapsamli bir
// sinirda bir ekibin buyumesi otekilerin basligini tuketir
export const PAYLASAN = { hesap: 5, bolge: 5, ag: 5, bolme: 1 };

// sinira carpmanin davranisi: fark etme gunu ve neden o kadar surdugu
export const DAVRANIS = {
  "olusturma reddi": [1, "istek aninda hata doner"],
  "istek reddi":     [1, "cagiran hatayi gorur"],
  "kuyruk":          [4, "gecikme olarak sizar"],
  "sessiz kisma":    [12, "hicbir hata uretmez"],
};

export const dolmaAyi = (kullanim, sinir, g) =>
  g <= 0 ? Infinity : Math.log(sinir / kullanim) / Math.log(1 + g);
export const topla = (v) => v.reduce((a, b) => a + b, 0);
// maliyet/plan.mjs — buyume plani sinir tablosuna uygulanir: her sinira kac birim kaldigi,
// hangi sinirin once doldugu, istek buyumesi tarandiginda sirdinin degisip degismedigi ve
// sinira carpmanin gunluk bedeli. Sayilar yalniz modelden turer.
import { SINIR, BUYUME, PAYLASAN, DAVRANIS, dolmaAyi, topla } from "./sinir.mjs";

const yaz = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join(""));
const t0 = process.hrtime.bigint();

console.log(`${SINIR.length} sinir, ${Object.keys(BUYUME).length} surucu ` +
  `(kurgu sinir tablosu ve kurgu buyume plani)`);

console.log("\n1. hangi sinira kac birim kaldi");
const A = [-30, -7, 7, 10, 9, 9, 10, 9];
yaz(A, "sinir", "kapsam", "ekip", "kullanim", "sinir", "kalan", "doluluk", "surucu");
for (const [ad, kap, sur, kul, sin] of SINIR)
  yaz(A, ad, kap, PAYLASAN[kap], kul, sin, sin - kul, `%${(100 * kul / sin).toFixed(1)}`, sur);
const dolulukOrt = topla(SINIR.map(([, , , k, s]) => k / s)) / SINIR.length;
const paylasilan = SINIR.filter(([, kap]) => PAYLASAN[kap] > 1);
console.log(`  ortalama doluluk %${(100 * dolulukOrt).toFixed(1)}; en dolu ` +
  `%${(100 * Math.max(...SINIR.map(([, , , k, s]) => k / s))).toFixed(1)}`);
console.log(`  ${paylasilan.length}/${SINIR.length} sinir bes ekip tarafindan paylasilir: ` +
  `bir ekibin buyumesi otekinin basligini tuketir`);
const sabit = SINIR.filter(([, , , , s, tavan]) => tavan <= s);
console.log(`  ${sabit.length} sinir artirilamaz (tavan = sinir): ` +
  sabit.map((x) => x[0]).join(", "));

console.log("\n2. buyume plani uygulaninca: hangi sinir once doluyor");
const B = [-30, 9, 10, 11, 11, 11];
yaz(B, "sinir", "buyume", "dolma ayi", "12. ay", "tavan kati", "artirma");
const sira = SINIR.map((x) => [x, dolmaAyi(x[3], x[4], BUYUME[x[2]])])
  .sort((a, b) => a[1] - b[1]);
for (const [[ad, kap, sur, kul, sin, tavan, gun], n] of sira) {
  const on = kul * Math.pow(1 + BUYUME[sur], 12);
  yaz(B, ad, `%${(100 * BUYUME[sur]).toFixed(0)}`, n === Infinity ? "-" : n.toFixed(1),
    `%${(100 * on / sin).toFixed(0)}`, (tavan / sin).toFixed(2) + "x",
    tavan <= sin ? "yok" : `${gun} gun`);
}
const on12 = SINIR.filter(([, , sur, kul, sin]) => kul * Math.pow(1 + BUYUME[sur], 12) > sin);
console.log(`  ilk dolan: ${sira[0][0][0]} (${sira[0][1].toFixed(1)}. ay); ` +
  `ikinci ${sira[1][0][0]} (${sira[1][1].toFixed(1)}. ay)`);
console.log(`  ilk dolan en dolu sinir degil: en dolu olan ` +
  `${SINIR.reduce((a, b) => (a[3] / a[4] >= b[3] / b[4] ? a : b))[0]}`);
console.log(`  12 ay sonunda ${on12.length}/${SINIR.length} sinir asilir`);

console.log("\n3. istek buyumesi taraniyor: ilk dolan sinir degisiyor mu");
const C = [7, 32, 7, 32, 7];
yaz(C, "istek", "ilk dolan", "ay", "ikinci dolan", "ay");
for (const g of [0.02, 0.05, 0.08, 0.11, 0.16, 0.25]) {
  const b = { ...BUYUME, istek: g };
  const s = SINIR.map((x) => [x, dolmaAyi(x[3], x[4], b[x[2]])]).sort((a, b2) => a[1] - b2[1]);
  yaz(C, `%${(100 * g).toFixed(0)}`, s[0][0][0], s[0][1].toFixed(1), s[1][0][0],
    s[1][1].toFixed(1));
}
console.log(`  istek surucusu uc sinira baglidir; hizi degistiginde sadece tarih degil,`);
console.log(`  once dolan sinirin *kimligi* de degisir`);

console.log("\n4. sinira carpinca ne oluyor ve artirilana kadar ne kaybediliyor");
const D = [-30, -17, 9, 10, 8, 11];
yaz(D, "sinir", "davranis", "fark etme", "artirma", "gun", "kayip br");
let tKayip = 0, tGun = 0;
for (const [ad, , , , sin, tavan, gun, dav, gk] of SINIR) {
  const [fark] = DAVRANIS[dav];
  const sure = tavan <= sin ? fark + 30 : fark + gun;    // artirilamiyorsa kayip surer
  tKayip += gk * sure; tGun += sure;
  yaz(D, ad, dav, fark, tavan <= sin ? "yok" : gun, sure, (gk * sure).toFixed(0));
}
console.log(`  toplam ${tKayip.toFixed(0)} br kayip, ${tGun} sinir-gun; ` +
  `ortalama ${(tGun / SINIR.length).toFixed(1)} gun/sinir`);
const sessiz = SINIR.filter((x) => x[7] === "sessiz kisma");
const hemen = SINIR.filter((x) => DAVRANIS[x[7]][0] === 1);
console.log(`  fark etme gunu davranisa bagli: ${hemen.length} sinir ayni gun gorulur, ` +
  `sessiz kisma ${DAVRANIS["sessiz kisma"][0]}. gunde`);
const sk = topla(sessiz.map((x) => x[8] * (12 + 30)));
console.log(`  sessiz kismanin kaybi ${sk.toFixed(0)} br, toplamin ` +
  `%${(100 * sk / tKayip).toFixed(1)}'i; sinir artirilamaz, plan degistirilir`);

const ms = Number(process.hrtime.bigint() - t0) / 1e6;   // ham olcum basilmaz, bant denetlenir
console.log(`\ndort tablo 2000 ms bandinda: ${ms < 2000 ? "evet" : "hayir"}`);
8 sinir, 6 surucu (kurgu sinir tablosu ve kurgu buyume plani)

1. hangi sinira kac birim kaldi
sinir                         kapsam    ekip  kullanim    sinir    kalan   doluluk   surucu
bolge basina makine cekirdegi bolge        5       412      640      228     %64.4    sayac
saniyede nesne yazma istegi   bolme        1      1850     3500     1650     %52.9    istek
islev es zamanli calisma      hesap        5       640     1000      360     %64.0    istek
saniyede ad cozumleme         ag           5      7200    10000     2800     %72.0    istek
hesap basina sabit adres      hesap        5        34       50       16     %68.0    kenar
hesap basina sanal ag         hesap        5         9       12        3     %75.0    ortam
bolme basina saklama kurali   bolme        1        62      100       38     %62.0     veri
kural kumesi basina kural     ag           5       148      200       52     %74.0   hizmet
  ortalama doluluk %66.5; en dolu %75.0
  6/8 sinir bes ekip tarafindan paylasilir: bir ekibin buyumesi otekinin basligini tuketir
  2 sinir artirilamaz (tavan = sinir): saniyede ad cozumleme, bolme basina saklama kurali

2. buyume plani uygulaninca: hangi sinir once doluyor
sinir                            buyume dolma ayi     12. ay tavan kati    artirma
saniyede ad cozumleme               %11       3.1       %252      1.00x        yok
islev es zamanli calisma            %11       4.3       %224      4.00x      3 gun
bolme basina saklama kurali          %9       5.5       %174      1.00x        yok
saniyede nesne yazma istegi         %11       6.1       %185      3.43x      4 gun
bolge basina makine cekirdegi        %6       7.6       %130      3.13x      6 gun
kural kumesi basina kural            %4       7.7       %118      2.00x      9 gun
hesap basina sabit adres             %5       7.9       %122      4.00x      5 gun
hesap basina sanal ag                %2      14.5        %95      3.33x      7 gun
  ilk dolan: saniyede ad cozumleme (3.1. ay); ikinci islev es zamanli calisma (4.3. ay)
  ilk dolan en dolu sinir degil: en dolu olan hesap basina sanal ag
  12 ay sonunda 7/8 sinir asilir

3. istek buyumesi taraniyor: ilk dolan sinir degisiyor mu
  istek                       ilk dolan     ay                    ikinci dolan     ay
     %2     bolme basina saklama kurali    5.5   bolge basina makine cekirdegi    7.6
     %5     bolme basina saklama kurali    5.5           saniyede ad cozumleme    6.7
     %8           saniyede ad cozumleme    4.3     bolme basina saklama kurali    5.5
    %11           saniyede ad cozumleme    3.1        islev es zamanli calisma    4.3
    %16           saniyede ad cozumleme    2.2        islev es zamanli calisma    3.0
    %25           saniyede ad cozumleme    1.5        islev es zamanli calisma    2.0
  istek surucusu uc sinira baglidir; hizi degistiginde sadece tarih degil,
  once dolan sinirin *kimligi* de degisir

4. sinira carpinca ne oluyor ve artirilana kadar ne kaybediliyor
sinir                         davranis         fark etme   artirma     gun   kayip br
bolge basina makine cekirdegi olusturma reddi          1         6       7        238
saniyede nesne yazma istegi   istek reddi              1         4       5        305
islev es zamanli calisma      kuyruk                   4         3       7        126
saniyede ad cozumleme         sessiz kisma            12       yok      42       1134
hesap basina sabit adres      olusturma reddi          1         5       6         54
hesap basina sanal ag         olusturma reddi          1         7       8         32
bolme basina saklama kurali   olusturma reddi          1       yok      31        186
kural kumesi basina kural     olusturma reddi          1         9      10        120
  toplam 2195 br kayip, 116 sinir-gun; ortalama 14.5 gun/sinir
  fark etme gunu davranisa bagli: 6 sinir ayni gun gorulur, sessiz kisma 12. gunde
  sessiz kismanin kaybi 1134 br, toplamin %51.7'i; sinir artirilamaz, plan degistirilir

dort tablo 2000 ms bandinda: evet

Sayılar ölçüm sınıfındadır; girdileri yukarıdaki varsayımlardır.

Kalan Başlık Kimin

Birinci tablo sekiz sınırın kalanını sayar. Ortalama doluluk %66,5, en dolusu hesap başına sanal ağ (%75,0) ve orada kalan üç birimdir — üç ortam yerine dört ortam kurmak isteyen bir ekip bu üç birimi harcar.

Kalanın kime ait olduğu kapsamda yazılıdır. Sekiz sınırın altısı hesap, bölge ya da ağ kapsamlıdır ve beş ekip tarafından paylaşılır. Bir ekip yeni bir sabit adres aldığında ötekilerin kalanı azalır; kimse kimsenin kotasını görmez. Yalnız iki sınır bölme kapsamlıdır ve tek ekibe aittir. Bu, önceki derslerin dağıtım sorusunun tersidir: orada maliyet ekiplere bölünemiyordu, burada sınır zaten bölünmemiştir ve ilk gelen tüketir.

İki sınırın tavanı kendi değerine eşittir: saniyede ad çözümleme ve bölme başına saklama kuralı artırılamaz. Bunlar için “kaç birim kaldı” sorusunun tek anlamı vardır, çünkü sayının büyümesinin bir yolu yoktur.

Önce Dolan Sınır En Dolu Sınır Değil

İkinci tablo büyüme planını işletir. Sıra doluluğa göre değil, doluluk ile büyüme hızının birleşimine göre çıkar. İlk dolan saniyede ad çözümlemedir: %72,0 doluluk ama %11 aylık büyüme, 3,1. ay. İkincisi işlev eş zamanlı çalışmadır (%64,0 doluluk, %11 büyüme, 4,3. ay).

En dolu sınır olan hesap başına sanal ağ 14,5. aya kadar dolmaz, çünkü onu tüketen ortam sayısı ayda %2 büyür. Doluluk yüzdesine göre sıralanmış bir kota raporu bu ağda tam ters bir öncelik listesi üretir.

On iki ayın sonunda sekiz sınırın yedisi aşılır. Aşımın büyüklüğü de farklıdır: ad çözümleme sınırın %252’sine, işlev eş zamanlılığı %224’üne çıkar. Tavan katı sütunu bunun karşılığını verir — işlev eş zamanlılığı dört katına çıkarılabilir ve on iki ayı taşır, ad çözümleme çıkarılamaz.

Büyüme Hızı Sınırın Kimliğini Değiştiriyor

Üçüncü tablo tek bir sürücüyü tarar. İstek hızı üç sınıra birden bağlıdır, dolayısıyla planın en belirsiz değişkenidir.

%2 ve %5’te ilk dolan sınır bölme başına saklama kuralıdır (5,5. ay) ve istekle hiç ilgisi yoktur; veri hacmi tüketir. %8’den itibaren ilk sıraya ad çözümleme geçer ve %25’te 1,5. aya iner. Değişen yalnız tarih değil, sınırın kimliğidir: yavaş büyümede hazırlanılacak sınır saklama kuralı, hızlı büyümede ad çözümlemedir ve ikisinin hazırlığı ortak değildir — biri saklama politikası, öteki mimari değişiklik ister.

Büyüme hızı tahmini bir sayıdır. Bu tablonun söylediği şey, tahminin yanlış olmasının maliyetinin yanlış tarihe hazırlanmak değil, yanlış sınıra hazırlanmak olduğudur.

Çarpmanın Davranışı ve Artırmanın Süresi

Dördüncü tablo sınır dolduktan sonrasını sayar. Fark etme günü davranışa bağlıdır: oluşturma reddi ve istek reddi çağıranın gördüğü bir hata üretir ve aynı gün fark edilir; kuyruk gecikme olarak sızar (4 gün); sessiz kısma hiçbir hata üretmez ve 12 gün sürer.

Artırma isteğinin süresi bunun üstüne eklenir: 3 ile 9 gün arasında. Toplam 116 sınır-gün ve 2.195 birim kayıp çıkar; sınır başına ortalama 14,5 gün. Nesne yazma isteği en hızlı kapanan olaydır (5 gün, 305 birim) çünkü hem hemen görülür hem dört günde artırılır.

Sayının %51,7’si tek bir satırdan gelir: saniyede ad çözümleme. Sessiz kısma 12 gün fark edilmez ve sınır artırılamadığı için kayıp bir istekle kesilmez; 42 gün sürer ve 1.134 birim tutar. Artırılamayan bir sınırda “artırma süresi” diye bir sayı yoktur, yerine plan değiştirme süresi vardır ve o süre bu tabloda ölçülmez.

Özet

  • Sekiz sınırın ortalama doluluğu %66,5; en dolusunda kalan üç birimdir. Altısı beş ekip tarafından paylaşılır: sınır bölünmemiştir ve kalanı ilk büyüyen tüketir.
  • İki sınır hiç artırılamaz (tavan = sınır); onlar için kalan sayısı tek anlamlıdır.
  • Önce dolan sınır en dolu sınır değildir: ilk dolan %72,0 dolulukta ama %11 büyüyen ad çözümlemedir (3,1. ay); %75,0 ile en dolu olan sınır %2 büyüdüğü için 14,5. aya kadar dolmaz.
  • On iki ayın sonunda sekiz sınırın yedisi aşılır; ad çözümleme sınırının %252’sine çıkar.
  • İstek büyümesi %2’den %25’e tarandığında önce dolan sınırın kimliği değişir — saklama kuralından ad çözümlemeye. Tahminin yanlışlığı yanlış tarihe değil, yanlış sınıra hazırlanmak demektir.
  • Çarpmanın bedeli davranış ile artırma süresinin toplamıdır: 116 sınır-gün, 2.195 birim. Bunun %51,7’si tek bir sessiz kısma sınırından gelir — 12 gün fark edilmez, artırılamaz, 42 gün sürer ve 1.134 birim tutar.

Sonraki Adım

Bu dersin her satırında aynı şey duruyor: sınırın değerini de, artırılıp artırılamayacağını da, artırmanın kaç gün süreceğini de kiralanan taraf belirliyor. Artırılamayan iki sınırda tek çıkış yolu planı değiştirmektir ve o değişiklik ağın kendi kararı olmaktan çıkmıştır. Sıradaki ders bu bağımlılığın toplamını okur: kaç kalem taşınabilir, taşınamayanın yerine ne konur ve taşımanın faturası ne tutar.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat