İçeriğe geç
academia.sh

Ders 19 / 21

Kaynak Boyutlandırma

Aşırı sağlamanın fatura tarafı ölçülür: kurgu ağın on kaynağında p95 doluluk ortalaması %31,4'tür ve p95 üzerine %20 pay bırakan küçültme aylık 875 kurgu birimin 401'ini (%45,8) vaat eder. Tasarrufun 353 birimi (%88,0) kesinti gerektirir, yedi adayda geçmiş tepe yeni kademeyi aşar ve en kötü anda %168,4 eksik kalır; hem kesintisiz hem risksiz olan pay yalnızca 10 birimdir. Güvenlik payı %0'dan %100'e çıkarıldığında tasarruf 458'den 64 birime, yetmeyen saat 47'den 3'e iner. Hiçbir kullanım raporunda görünmeyen 147,2 birimlik boşta kaynak ise kesintisiz silinir ve tek başına küçültme tasarrufunun %37'sini verir.

İçindekiler

Önceki ders uyarıların beklenmedik artışları yakaladığını, beklenen harcamayı sorgulamadığını ölçtü: taban bütçeye yaklaşırken hiçbir uyarı tetiklenmez, çünkü ortada olay değil gereğinden büyük kurulmuş kaynaklar vardır.

Örnek boyutlandırma M23/K02’de ölçüldü ve tekrarlanmaz. Bu dersin ekseni fatura tarafıdır: kullanım geçmişinden hangi kaynağın küçültülebileceği çıkarılır ve her adayın tasarrufu ile riski aynı satırda sayılır.

Kullanım Geçmişi ve Boyut Merdiveni

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

BM19: on kaynak ve beş tür vardır; her türün bir boyut merdiveni vardır, her kademe bir kapasite birimi ile bir aylık bedelden oluşur. BM20: kullanım geçmişi 30 gün × 24 saattir; günlük desen, hafta sonu düşüşü, gürültü ve seyrek tepelerden oluşur. BM21: küçültme adayı, p95 talebine bir güvenlik payı eklendikten sonra yeten en küçük kademedir. BM22: risk iki sayıyla ölçülür — yeni kademe geçmişte kaç saat yetmezdi ve en kötü anda ne kadar eksik kalırdı. BM23: kademe indirmenin kesinti gerektirip gerektirmediği türe bağlıdır. BM24: boşta kaynağın kullanım oranı tanımsızdır; hiçbir doluluk raporunda görünmez.

Merdiven, geçmiş ve adaylar süreç içi bir modeldir; gerçek bir ölçüm kaydı yoktur.

// maliyet/kapasite.mjs — boyut merdiveni ve kullanim gecmisi modeli: gercek bir kayit yok.
// Kademeler [kapasite birimi, aylik br] ciftidir; 30 gun x 24 saatlik gecmis bir uretecten
// turer, tohum gorunurdur, para birimi kurgudur ve `br` diye anilir. Ornek boyutlandirma
// M23/K02'de olculdu; burada olculen sey kademeyi indirmenin tasarrufu ve riskidir.

export const TOHUM = 8814;
export const GUN = 30, SAAT = GUN * 24;

export const MERDIVEN = {
  "kiralanmis makine": [[1, 14], [2, 27], [4, 52], [8, 101], [16, 198]],
  "blok depo":         [[100, 7], [250, 17], [500, 33], [1000, 64], [2000, 126]],
  "islev bellek":      [[1, 3], [2, 6], [4, 11], [8, 21]],
  "ag gecidi":         [[1, 22], [2, 41], [4, 79]],
  "kenar dugumu":      [[1, 9], [2, 17], [4, 32]],
};

// kademeyi indirmek kesinti gerektiriyor mu, gerekiyorsa neden
export const KESINTI = {
  "kiralanmis makine": ["evet", "yeniden baslat"],
  "blok depo":         ["evet", "veri tasima"],
  "islev bellek":      ["hayir", "sonraki cagri"],
  "ag gecidi":         ["hayir", "kademe gecisi"],
  "kenar dugumu":      ["evet", "dugum degisimi"],
};

// ad, tur, mevcut kademe indisi, ekip, taban talep, tepe carpani, tepe olasiligi
export const KAYNAK = [
  ["olcum-alici-1",  "kiralanmis makine", 3, "sayac-okuma", 2.10, 2.1, 0.012],
  ["olcum-alici-2",  "kiralanmis makine", 3, "sayac-okuma", 3.40, 1.6, 0.020],
  ["dogrulayici",    "kiralanmis makine", 2, "dogrulama",   1.15, 2.4, 0.008],
  ["fatura-hazirla", "kiralanmis makine", 4, "faturalama",  4.20, 2.8, 0.006],
  ["rapor-motoru",   "kiralanmis makine", 3, "raporlama",   1.05, 5.2, 0.004],
  ["ham-olcum-diski","blok depo",         3, "sayac-okuma", 340,  1.1, 0.010],
  ["arsiv-diski",    "blok depo",         4, "raporlama",   610,  1.0, 0.000],
  ["olay-islevi",    "islev bellek",      3, "dogrulama",   1.80, 2.0, 0.015],
  ["kuzey-gecidi",   "ag gecidi",         2, "sayac-okuma", 1.30, 2.2, 0.011],
  ["saha-dugumu",    "kenar dugumu",      2, "saha",        0.75, 2.6, 0.007],
];

// hicbir kullanim olcusunde gorunmeyen kalemler: kullanim orani tanimsizdir
// ad, adet, birim aylik br, neden bosta, silmek kesinti gerektiriyor mu
export const BOSTA = [
  ["bagli olmayan blok depo", 4, 17, "makine silindi, depo kaldi", "hayir"],
  ["kullanilmayan sabit adres", 6, 4, "gecis bitti, adres birakilmadi", "hayir"],
  ["eski anlik goruntu", 23, 2.4, "saklama kurali yok", "hayir"],
];

const DESEN = [0.42, 0.38, 0.36, 0.35, 0.38, 0.48, 0.66, 0.84, 0.98, 1.06, 1.10, 1.12,
  1.08, 1.09, 1.11, 1.07, 1.00, 0.92, 0.84, 0.76, 0.68, 0.60, 0.52, 0.46];

export const gecmis = (k) => {
  const [, , , , taban, tepe, p] = k;
  let s = (TOHUM + k[0].length * 7919) >>> 0;
  const r = () => { s = (Math.imul(s, 1664525) + 1013904223) >>> 0; return s / 4294967296; };
  const v = [];
  for (let t = 0; t < SAAT; t++) {
    const hafta = (Math.floor(t / 24) % 7) >= 5 ? 0.74 : 1.0;
    let x = taban * DESEN[t % 24] * hafta * (0.92 + r() * 0.16);
    if (r() < p) x *= tepe;
    v.push(x);
  }
  return v;
};

export const yuzdelik = (v, q) => {
  const s = [...v].sort((a, b) => a - b);
  return s[Math.min(s.length - 1, Math.floor(q * s.length))];
};
export const topla = (v) => v.reduce((a, b) => a + b, 0);
// maliyet/olcek.mjs — kullanim gecmisinden kucultme adaylari cikarilir ve her adayin *tasarrufu
// ile riski birlikte* sayilir: onerilen kademe gecmiste kac saat yetmezdi, en kotu anda ne
// kadar eksik kalirdi. Kesinti gerektirenler ayrilir, bosta kaynak ayrica sayilir.
import { KAYNAK, MERDIVEN, KESINTI, BOSTA, SAAT, TOHUM, gecmis, yuzdelik,
  topla } from "./kapasite.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();

const G = KAYNAK.map(gecmis);
const kap = (t, i) => MERDIVEN[t][i][0], brOf = (t, i) => MERDIVEN[t][i][1];
const T = topla(KAYNAK.map((k) => brOf(k[1], k[2])));
const BOS = topla(BOSTA.map(([, n, b]) => n * b));
console.log(`tohum ${TOHUM}: ${KAYNAK.length} kaynak, ${SAAT} saat gecmis, ` +
  `aylik ${T} br + bosta ${BOS.toFixed(1)} br (kurgu para birimi)`);

console.log("\n1. kullanim gecmisi: mevcut kademe ne kadar dolu");
const A = [-17, -19, 10, 10, 9, 9, 10];
yaz(A, "kaynak", "tur", "kapasite", "aylik br", "p95", "tepe", "p95 dolu");
for (let i = 0; i < KAYNAK.length; i++) {
  const k = KAYNAK[i], c = kap(k[1], k[2]), v = G[i];
  yaz(A, k[0], k[1], c, brOf(k[1], k[2]), yuzdelik(v, 0.95).toFixed(2),
    Math.max(...v).toFixed(2), `%${(100 * yuzdelik(v, 0.95) / c).toFixed(0)}`);
}
const dolu = KAYNAK.map((k, i) => yuzdelik(G[i], 0.95) / kap(k[1], k[2]));
console.log(`  p95 doluluk ortalamasi %${(100 * topla(dolu) / dolu.length).toFixed(1)}; ` +
  `%50'nin altinda ${dolu.filter((x) => x < 0.5).length} kaynak`);

// pay: p95 uzerine eklenen guvenlik payi. Onerilen kademe = yeten en kucuk kademe.
const aday = (pay) => KAYNAK.map((k, i) => {
  const [ad, tur, mev] = k, v = G[i], hedef = yuzdelik(v, 0.95) * (1 + pay);
  let yeni = mev;
  for (let j = 0; j < MERDIVEN[tur].length; j++)
    if (MERDIVEN[tur][j][0] >= hedef) { yeni = Math.min(mev, j); break; }
  const c = kap(tur, yeni);
  const yetmez = v.filter((x) => x > c).length;
  const eksik = Math.max(0, (Math.max(...v) - c) / c);
  return { ad, tur, mev, yeni, tasarruf: brOf(tur, mev) - brOf(tur, yeni), yetmez, eksik,
    inis: mev - yeni, kalan: yeni };
});

console.log("\n2. kucultme adaylari (p95 + %20 guvenlik payi): tasarruf ve risk birlikte");
const B = [-16, 9, 8, 7, 9, 11, 10, 22];
yaz(B, "kaynak", "kademe", "yeni", "inis", "tasarruf", "yetmez sa.", "en kotu", "kesinti");
const AD = aday(0.20);
let tKes = 0, tKessiz = 0;
for (const a of AD) {
  if (a.inis === 0) continue;
  const [kes, neden] = KESINTI[a.tur];
  if (kes === "evet") tKes += a.tasarruf; else tKessiz += a.tasarruf;
  yaz(B, a.ad, kap(a.tur, a.mev), kap(a.tur, a.yeni), a.inis, a.tasarruf,
    a.yetmez, `%${(100 * a.eksik).toFixed(1)}`, `${kes} (${neden})`);
}
const inen = AD.filter((a) => a.inis > 0);
const tt = topla(AD.map((a) => a.tasarruf));
console.log(`  ${inen.length}/${KAYNAK.length} kaynak aday, tasarruf ${tt} br/ay ` +
  `(%${(100 * tt / T).toFixed(1)})`);
console.log(`  kesinti gerektiren ${tKes} br (%${(100 * tKes / tt).toFixed(1)}), ` +
  `kesintisiz ${tKessiz} br`);
const riskli = AD.filter((a) => a.inis > 0 && a.yetmez > 0);
console.log(`  ${riskli.length} adayda gecmis tepe yeni kademeyi asiyor: toplam ` +
  `${topla(riskli.map((a) => a.yetmez))} saat, en kotu eksik ` +
  `%${(100 * Math.max(...AD.map((a) => a.eksik))).toFixed(1)}`);
console.log(`  merdivende kalan inis: ${topla(inen.map((a) => a.kalan))} kademe, ` +
  `${inen.filter((a) => a.kalan === 0).length} kaynak en alt kademede`);

console.log("\n3. guvenlik payi taramasi: tasarruf ile yetmeyen saat birlikte hareket ediyor");
const C = [8, 8, 11, 9, 12, 12, 11];
yaz(C, "pay", "aday", "tasarruf", "pay %", "yetmez sa.", "saat payi", "en kotu");
for (const p of [0, 0.20, 0.35, 0.60, 1.00]) {
  const a = aday(p), i2 = a.filter((x) => x.inis > 0), s = topla(a.map((x) => x.tasarruf));
  const y = topla(a.map((x) => x.yetmez)), e = Math.max(...a.map((x) => x.eksik));
  yaz(C, `%${(100 * p).toFixed(0)}`, i2.length, s, `%${(100 * s / T).toFixed(1)}`, y,
    `%${(100 * y / (SAAT * KAYNAK.length)).toFixed(2)}`, `%${(100 * e).toFixed(1)}`);
}
console.log(`  yetmeyen saat butun taramada ${SAAT} x ${KAYNAK.length} saatin %1'inin`);
console.log(`  altinda kalir: belirleyici olan sayi degil, en kotu andaki eksiktir`);

console.log("\n4. bosta kaynak: hicbir kullanim orani raporunda gorunmez");
const D = [-26, 6, 10, 11, 32, 8];
yaz(D, "kalem", "adet", "birim br", "aylik br", "neden bosta", "kesinti");
for (const [ad, n, b, neden, kes] of BOSTA)
  yaz(D, ad, n, b, (n * b).toFixed(1), neden, kes);
yaz(D, "toplam", topla(BOSTA.map((x) => x[1])), "-", BOS.toFixed(1), "-", "hayir");
console.log(`  bosta ${BOS.toFixed(1)} br/ay, kullanilan faturanin ` +
  `%${(100 * BOS / T).toFixed(1)}'i; tamami kesintisiz silinir`);
console.log(`  ve ${tt} br'lik kucultme tasarrufunun ` +
  `%${(100 * BOS / tt).toFixed(0)}'ini tek basina verir`);

const ms = Number(process.hrtime.bigint() - t0) / 1e6;   // ham olcum basilmaz, bant denetlenir
console.log(`\ndort tablo 2000 ms bandinda: ${ms < 2000 ? "evet" : "hayir"}`);
tohum 8814: 10 kaynak, 720 saat gecmis, aylik 875 br + bosta 147.2 br (kurgu para birimi)

1. kullanim gecmisi: mevcut kademe ne kadar dolu
kaynak           tur                  kapasite  aylik br      p95     tepe  p95 dolu
olcum-alici-1    kiralanmis makine           8       101     2.42     5.13       %30
olcum-alici-2    kiralanmis makine           8       101     3.92     6.33       %49
dogrulayici      kiralanmis makine           4        52     1.31     3.15       %33
fatura-hazirla   kiralanmis makine          16       198     4.78    13.85       %30
rapor-motoru     kiralanmis makine           8       101     1.19     5.37       %15
ham-olcum-diski  blok depo                1000        64   387.62   438.71       %39
arsiv-diski      blok depo                2000       126   694.29   737.55       %35
olay-islevi      islev bellek                8        21     2.06     4.11       %26
kuzey-gecidi     ag gecidi                   4        79     1.48     2.81       %37
saha-dugumu      kenar dugumu                4        32     0.86     2.23       %21
  p95 doluluk ortalamasi %31.4; %50'nin altinda 10 kaynak

2. kucultme adaylari (p95 + %20 guvenlik payi): tasarruf ve risk birlikte
kaynak             kademe    yeni   inis tasarruf yetmez sa.   en kotu               kesinti
olcum-alici-1           8       4      1       49          6     %28.3 evet (yeniden baslat)
dogrulayici             4       2      1       25          3     %57.5 evet (yeniden baslat)
fatura-hazirla         16       8      1       97          5     %73.1 evet (yeniden baslat)
rapor-motoru            8       2      2       74          2    %168.4 evet (yeniden baslat)
ham-olcum-diski      1000     500      1       31          0      %0.0    evet (veri tasima)
arsiv-diski          2000    1000      1       62          0      %0.0    evet (veri tasima)
olay-islevi             8       4      1       10          1      %2.7 hayir (sonraki cagri)
kuzey-gecidi            4       2      1       38          1     %40.6 hayir (kademe gecisi)
saha-dugumu             4       2      1       15          2     %11.3 evet (dugum degisimi)
  9/10 kaynak aday, tasarruf 401 br/ay (%45.8)
  kesinti gerektiren 353 br (%88.0), kesintisiz 48 br
  7 adayda gecmis tepe yeni kademeyi asiyor: toplam 20 saat, en kotu eksik %168.4
  merdivende kalan inis: 16 kademe, 0 kaynak en alt kademede

3. guvenlik payi taramasi: tasarruf ile yetmeyen saat birlikte hareket ediyor
     pay    aday   tasarruf    pay %  yetmez sa.   saat payi    en kotu
      %0      10        458    %52.3          47       %0.65     %168.4
     %20       9        401    %45.8          20       %0.28     %168.4
     %35       8        370    %42.3          20       %0.28     %168.4
     %60       5        245    %28.0          16       %0.22     %168.4
    %100       2         64     %7.3           3       %0.04      %34.2
  yetmeyen saat butun taramada 720 x 10 saatin %1'inin
  altinda kalir: belirleyici olan sayi degil, en kotu andaki eksiktir

4. bosta kaynak: hicbir kullanim orani raporunda gorunmez
kalem                       adet  birim br   aylik br                     neden bosta kesinti
bagli olmayan blok depo        4        17       68.0      makine silindi, depo kaldi   hayir
kullanilmayan sabit adres      6         4       24.0  gecis bitti, adres birakilmadi   hayir
eski anlik goruntu            23       2.4       55.2              saklama kurali yok   hayir
toplam                        33         -      147.2                               -   hayir
  bosta 147.2 br/ay, kullanilan faturanin %16.8'i; tamami kesintisiz silinir
  ve 401 br'lik kucultme tasarrufunun %37'ini tek basina verir

dort tablo 2000 ms bandinda: evet

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

Doluluk Düşük, Tasarruf Büyük Görünüyor

Birinci tablo on kaynağın p95 talebini mevcut kapasiteye böler. Ortalama doluluk %31,4 ve on kaynağın onu da yarının altındadır. En uçtaki rapor motoru sekiz birimlik kademede oturur, p95 talebi 1,19’dur — kapasitenin %15’i.

İkinci tablo bunu paraya çevirir. p95 üzerine %20 güvenlik payı bırakıldığında dokuz kaynak aday olur ve aylık 875 birimlik faturadan 401 birim düşer: %45,8. Tek istisna ölçüm alıcı 2’dir: p95’i kapasitesinin yarısını doldurur ve bir alt kademe yetmez. Aynı satırın sağındaki iki sütun bu sayıyı değiştirir.

Tasarrufun Yanında Duran İki Sayı

Birinci sütun riski sayar: yeni kademe geçmişte kaç saat yetmezdi. Yedi adayda bu sayı sıfırdan büyüktür, toplamı 20 saattir — 7.200 saatlik geçmişin binde üçü. İkinci sayı bunu önemsiz olmaktan çıkarır. En kötü anda eksik kalan kapasite rapor motorunda %168,4’tür: iki birimlik yeni kademe, 5,37 birimlik tepenin karşısında yarıdan fazla açık verir. Fatura hazırlama %73,1, doğrulayıcı %57,5 eksik kalır. Tepe anında hizmet kuyruğa girer ya da reddedilir; ölçünün “iki saat” demesi bunu hafifletmez.

İkinci sütun kesintiyi kalem kalem yazar. Makine kademesi yeniden başlatma, blok depo veri taşıma, kenar düğümü düğüm değişimi ister; kesintisiz inen yalnız işlev belleği ve ağ geçididir. Tasarrufun 353 birimi (%88,0) kesinti gerektirir, kesintisiz olan 48 birimdir.

İki sütun birlikte okunduğunda tablo daralır. Kesintisiz 48 birimin 38’i ağ geçididir ve o adayın en kötü eksiği %40,6’dır. Geriye hem kesintisiz hem kayda değer açık vermeyen tek kalem kalır: olay işlevi, 10 birim — 401 birimlik vaadin bedelsiz kısmı %2,5.

Diskler tersini gösterir: iki disk adayının riski tam olarak sıfırdır, ama 93 birimlik tasarrufu veri taşıma kesintisi ister.

Güvenlik Payı Neyi Satın Alıyor

Üçüncü tablo payı tarar. Pay sıfırken tasarruf 458 birim (%52,3), yetmeyen saat 47’dir. Pay %20’de yetmeyen saat 20’ye iner ve tasarruf yalnız 57 birim kaybeder: eğrinin en verimli yeri burasıdır. Pay %60’ta tasarruf 245 birime düşer, yetmeyen saat ancak 16’ya iner — 156 birim ödenip 4 saat kazanılır.

En kötü eksik ise %100 paya kadar hiç değişmez (%168,4), çünkü pay p95’e eklenir, tepeye değil. Seyrek ve büyük tepesi olan kaynağın riski güvenlik payıyla satın alınamaz.

Hiç Dokunulmayan Kalem

Dördüncü tablo doluluk raporunun hiç göstermediği kalemi sayar. Bağlı olmayan dört blok depo, kullanılmayan altı sabit adres ve saklama kuralı olmayan yirmi üç eski anlık görüntü aylık 147,2 birim tutar — kullanılan faturanın %16,8’i. Aday listesine hiç girmezler: kullanım oranları tanımsızdır, bölünecek bir talep yoktur.

Karşılaştırma dersin sonucudur: 147,2 birimin tamamı kesintisiz silinir ve tepe riski taşımaz, küçültmenin bedelsiz payı ise 10 birimdir. Boşta kaynak, küçültme tasarrufunun %37’sini tek başına verir.

Özet

  • On kaynağın onu da p95’te yarının altında doludur (ortalama %31,4, en düşüğü %15); p95 + %20 payla dokuz kaynak aday olur ve aylık 875 birimin 401’i (%45,8) tasarruf görünür.
  • Tasarrufun 353 birimi (%88,0) kesinti gerektirir; kesintisiz 48 birimin 38’i en kötü anda %40,6 açık veren bir adaydır. Hem kesintisiz hem risksiz pay 10 birim, tasarrufun %2,5’idir. Risk ve kesinti bağımsızdır: iki disk adayı hiç yetmezlik üretmez ama veri taşıma ister.
  • Güvenlik payı yetmeyen saati satın alır, en kötü eksiği satın alamaz: pay %0’dan %100’e çıkarken tasarruf 458’den 64 birime iner ama en kötü eksik %168,4’te kalır — pay p95’e eklenir, tepeye değil.
  • Boşta kaynak 147,2 birim (%16,8) tutar ve hiçbir doluluk raporunda görünmez; kesintisiz silinir, küçültme tasarrufunun %37’sini tek başına verir.

Sonraki Adım

Bu dersin bütün sayıları aşağı yönlüdür: neyin küçültülebileceği, neyin silinebileceği. Büyüme yönünde de bir sayı vardır ve faturada hiç görünmez. Sıradaki ders ölçek planını bir sınır tablosuna uygular: hangi sınıra kaç birim kaldığı ve hangi sınırın önce dolduğu çıkarılır.

İ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