İçeriğe geç
academia.sh

Ders 06 / 21

Hat Çalıştırıcıları

Aynı hat iki çalıştırıcı türünde koşturulur: kuyrukta bekleme, koşum başına maliyet kalemi, önbelleğin koşumlar arasında kalıp kalmaması ve bakım kalemi sayılır, günde kaç koşumdan sonra hangi türün ucuzladığı hesaplanır ve ölçünün göz ardı ettiği kalemler adıyla yazılır.

İçindekiler

Önceki ders hattın süresini 4 092 saniyeden 2 273 saniyeye indirdi ve sınırın 203 saniyede durduğunu gösterdi. O ölçümün altında iki sessiz varsayım vardı: önbellek koşumlar arasında yerinde duruyordu ve çalıştırıcılar her an hazırdı. İkisi de bedava değildir, ikisi de aynı karara bağlıdır — hattın nerede koştuğu.

Seçenek iki türdür. Yönetilen çalıştırıcı koşum başına ayrılan, işi bitince dağılan bir makinedir; her koşum temiz bir diskte başlar. Kendi barındırılan çalıştırıcı sürekli duran, sahibi olan bir makinedir; diski koşumlar arasında kalır. Aradaki fark bir tercih değil, dört ayrı sütundur: kuyrukta bekleme, koşum başına ödenen kalem, önbelleğin kalıcılığı ve bakım yükü.

HT31. İki tür node ile kurulan bir modeldir; tür olarak anılır, ürün ya da sağlayıcı adı geçmez. HT32. Koşum süreleri önceki dersten alınır: yönetilen tür her koşumda soğuk başladığı için 203 saniye, kendi barındırılan tür önbelleğini koruduğu için 163 saniye. HT33. Geliş anları kendi yazılan üreteçle üretilir, tohum 4831; kurgu iş günü üç yığılmadan oluşur, çünkü kurgu ölçüm ağının ekibi işlemelerini sabah, öğleden sonra ve gün kapanışında yolluyor. HT34. Bedeller birim cinsindendir, para birimi yazılmaz. HT35. Ölçüm tek günü kapsar; makine arızası, yedek kapasite ve başarısız biten koşumun yeniden koşturulması modele girmez. HT36. Kapı hesabı önceki dersin sekiz kusurluk kümesini ve on iki koşumluk dizisini sürdürür.

İki Tür, Aynı Hat

Modelde bir tür dört sayıyla tanımlanır: kaç eşzamanlı yuvası olduğu, bir koşumun kaç saniye sürdüğü, koşumun nasıl ücretlendirildiği ve kaç bakım kalemi taşıdığı.

// olcum-agi/calistirici.mjs — iki calistirici turu ve bir gunun kuyrugu (model)
export const TOHUM = 4831;
export const uretec = (t) => () => ((t = (t * 48271) % 2147483647) / 2147483647);

// sure: 05'te olculen uc yuvali kosum suresi (saniye). yonetilen her kosumda soguk baslar (203 s),
// kendi barindirilan onbellegi koruyup sicak kosar (163 s). isabet: 05'in olctugu oran.
export const TUR = {
  yonetilen: { yuva: 8, sure: 203, isabet: 0, dakikaBedeli: 0.42, sabitGunluk: 0, kalem: 1, bakim: [] },
  barindirilan: {
    yuva: 2, sure: 163, isabet: 0.479, dakikaBedeli: 0, sabitGunluk: 2 * 11 + (6 * 28) / 30, kalem: 2,
    bakim: ["isletim sistemi yamasi", "disk dolmasi", "calistirici surumu", "ag ve sertifika", "kapasite/donanim"],
  },
};

// Kurgu is gunu: kosumlar uc yigilmaya (10:00, 14:00, 17:00) ucgen dagilimla dusuyor.
export const gelisler = (n, rnd) => Array.from({ length: n }, () => {
  const m = [10, 14, 17][Math.floor(rnd() * 3)] * 3600;
  return Math.round(m + (rnd() + rnd() - 1) * 1200); // ±20 dakika
}).sort((a, b) => a - b);

// Yuva cizelgesi: her gelis en erken bosalan yuvaya girer; bekleme = bosalma ani - gelis ani.
export const gun = (n, tur, rnd) => {
  const bos = Array(tur.yuva).fill(0), bekleme = [];
  for (const g of gelisler(n, rnd)) {
    const i = bos.indexOf(Math.min(...bos));
    const b = Math.max(0, bos[i] - g);
    bekleme.push(b); bos[i] = g + b + tur.sure;
  }
  return {
    ortBekleme: bekleme.reduce((a, b) => a + b, 0) / n,
    enUzun: Math.max(...bekleme),
    bekleyen: bekleme.filter((b) => b > 0).length,
    maliyet: tur.sabitGunluk + (n * tur.sure * tur.dakikaBedeli) / 60,
  };
};

Kendi barındırılan türün sabit günlük bedeli iki kalemden toplanır: iki makinenin günlük bedeli ve ayda altı saatlik bakım emeğinin güne düşen payı. Yönetilen türde sabit bedel sıfırdır ve tek kalem koşum süresidir. Bu, iki türün asıl farkıdır — biri koşum başına, öteki zaman başına ödetir.

Yuva sayısı da aynı eksene oturur. Kendi barındırılan türde yuva satın alınan bir makinedir ve sayısı iki ile sınırlıdır; yönetilen türde sekiz yuva modelin bildirdiği bir üst sınırdır, makine değil. Bu sınırın kendisi bir kalem olarak sayılır — sekiz eşzamanlı koşum bedava değildir, o sayının nereden geldiği modelde bildirilmiştir ve gerçek bir kurulumda pazarlık konusudur.

Bir Günün Kuyruğu

Aynı hat, aynı geliş anları, iki tür. Altı ayrı yoğunlukta koşturulur: günde 10 koşumdan 80 koşuma.

// olcum-agi/esik.mjs — ayni hat iki calistirici turunde: bekleme, maliyet, esik
import { TUR, TOHUM, uretec, gun } from "./calistirici.mjs";

const dk = (s) => (s / 60).toFixed(1);
console.log(`tohum ${TOHUM}; yuva: yonetilen ${TUR.yonetilen.yuva}, barindirilan ${TUR.barindirilan.yuva}`);
console.log("\n              yonetilen (soguk, 203 s)        kendi barindirilan (sicak, 163 s)");
console.log("kosum/gun  bekleme  enuzun  bekleyen  bedel   bekleme  enuzun  bekleyen  bedel");
for (const n of [10, 20, 30, 40, 60, 80]) {
  const y = gun(n, TUR.yonetilen, uretec(TOHUM)), b = gun(n, TUR.barindirilan, uretec(TOHUM));
  console.log(String(n).padStart(7) + [dk(y.ortBekleme) + " dk", dk(y.enUzun) + " dk", `${y.bekleyen}/${n}`,
    y.maliyet.toFixed(1), dk(b.ortBekleme) + " dk", dk(b.enUzun) + " dk", `${b.bekleyen}/${n}`, b.maliyet.toFixed(1)]
    .map((h, i) => h.padStart(i === 4 ? 12 : 9)).join(""));
}

let esik = 0;
while (gun(++esik, TUR.yonetilen, uretec(TOHUM)).maliyet <= gun(esik, TUR.barindirilan, uretec(TOHUM)).maliyet);
const y = gun(esik, TUR.yonetilen, uretec(TOHUM)), b = gun(esik, TUR.barindirilan, uretec(TOHUM));
console.log(`\nesik: gunde ${esik} kosumda yonetilen ${y.maliyet.toFixed(1)} birime cikar, ` +
  `kendi barindirilan ${b.maliyet.toFixed(1)} birimde sabit kalir.`);
console.log(`kosum basina maliyet kalemi: yonetilen ${TUR.yonetilen.kalem} (calistirici-dakikasi), ` +
  `barindirilan ${TUR.barindirilan.kalem} (makine + bakim emegi)`);
console.log(`bakim kalemi: yonetilen ${TUR.yonetilen.bakim.length}, barindirilan ` +
  `${TUR.barindirilan.bakim.length} — ${TUR.barindirilan.bakim.join(", ")}`);

// Kapi hesabi: 05'te onbellek iki kusuru kacirmisti (K4, K6). Temiz baslayan calistirici
// her kapiyi her kosumda kosturur, o iki kusur kacmaz.
const dizi = 12, fark = TUR.yonetilen.sure - TUR.barindirilan.sure;
console.log(`\nonbellek isabeti: yonetilen %${TUR.yonetilen.isabet * 100}, barindirilan %${(TUR.barindirilan.isabet * 100).toFixed(1)}`);
console.log(`kapi hesabi (${dizi} kosumluk dizi): yonetilen 8/8 kusur, barindirilan 6/8 (K4, K6 bayat isabet)`);
console.log(`iki kusurun bedeli: kosum basina ${fark} s, dizide ${dizi * fark} s ` +
  `(${dk(dizi * fark)} dk); gunde 30 kosumda ${dk(30 * fark)} dk ve ` +
  `${(gun(30, TUR.yonetilen, uretec(TOHUM)).maliyet - gun(30, TUR.barindirilan, uretec(TOHUM)).maliyet).toFixed(1)} birim fark`);

// Yonetilen tur + uzak onbellek deposu: isabet geri gelir, aktarim suresi ve depo bedeli eklenir.
const AKTARIM = 24, DEPO = 3;
const uzak = { ...TUR.yonetilen, sure: TUR.barindirilan.sure + AKTARIM, sabitGunluk: DEPO };
console.log(`\nyonetilen tur + uzak onbellek deposu: kosum ${uzak.sure} s, gunde 30 kosumda ` +
  `${gun(30, uzak, uretec(TOHUM)).maliyet.toFixed(1)} birim — ama bayat isabet geri geldigi icin kusur 6/8`);
tohum 4831; yuva: yonetilen 8, barindirilan 2

              yonetilen (soguk, 203 s)        kendi barindirilan (sicak, 163 s)
kosum/gun  bekleme  enuzun  bekleyen  bedel   bekleme  enuzun  bekleyen  bedel
     10   0.0 dk   0.0 dk     0/10     14.2      0.1 dk   0.6 dk     1/10     27.6
     20   0.0 dk   0.0 dk     0/20     28.4      0.1 dk   1.1 dk     2/20     27.6
     30   0.0 dk   0.0 dk     0/30     42.6      1.0 dk   5.3 dk    12/30     27.6
     40   0.0 dk   0.0 dk     0/40     56.8      1.5 dk   8.0 dk    21/40     27.6
     60   0.0 dk   1.0 dk     2/60     85.3      4.3 dk  15.1 dk    44/60     27.6
     80   0.1 dk   1.0 dk     8/80    113.7      6.6 dk  20.9 dk    63/80     27.6

esik: gunde 20 kosumda yonetilen 28.4 birime cikar, kendi barindirilan 27.6 birimde sabit kalir.
kosum basina maliyet kalemi: yonetilen 1 (calistirici-dakikasi), barindirilan 2 (makine + bakim emegi)
bakim kalemi: yonetilen 0, barindirilan 5 — isletim sistemi yamasi, disk dolmasi, calistirici surumu, ag ve sertifika, kapasite/donanim

onbellek isabeti: yonetilen %0, barindirilan %47.9
kapi hesabi (12 kosumluk dizi): yonetilen 8/8 kusur, barindirilan 6/8 (K4, K6 bayat isabet)
iki kusurun bedeli: kosum basina 40 s, dizide 480 s (8.0 dk); gunde 30 kosumda 20.0 dk ve 15.0 birim fark

yonetilen tur + uzak onbellek deposu: kosum 187 s, gunde 30 kosumda 42.3 birim — ama bayat isabet geri geldigi icin kusur 6/8

Eşik ve Kuyruk

Para sütunu tek başına okunursa karar açık görünür: eşik günde 20 koşumdur. Altında yönetilen tür ucuzdur — günde 10 koşumda 14,2 birime karşı 27,6 birim. Üstünde makas hızla açılır: günde 80 koşumda 113,7 birime karşı 27,6 birim, 4,1 kat. Sabit bedel ödeyen taraf koşum sayısı arttıkça kazanır, çünkü ödediği şey koşum değil zamandır.

Aynı sayılar koşum başına okunduğunda eğri görünür hâle gelir. Yönetilen türde koşum başına bedel her yoğunlukta 1,42 birimdir ve hiç değişmez — 14,2/10 ile 113,7/80 aynı sayıyı verir. Kendi barındırılan türde koşum başına bedel 10 koşumda 2,76, 20 koşumda 1,38, 80 koşumda 0,35 birime iner. Bu, iki türün ekipte ürettiği davranışı da ayırır: sabit bedelde bir koşum daha koşturmak bedavaya yakındır ve kimse koşum saymaz; koşum başına ödemede her ek koşumun bir fiyatı vardır ve gereksiz koşumlar hesapta görünür. Aynı ölçü sonraki derslerde tetikleyici tasarımına da girer.

Kuyruk sütunu kararı geri çevirir. İki yuvalı kendi barındırılan tür günde 30 koşumda tıkanmaya başlar: 30 koşumdan 12’si bekler, ortalama bekleme 1 dakika, en uzun bekleme 5,3 dakika. Günde 80 koşumda 63 koşum bekler, ortalama 6,6 dakika ve en uzun bekleme 20,9 dakikadır. Sekiz yuvalı yönetilen tür aynı gelişlerde 80 koşumun yalnız 8’ini bekletir ve en uzun bekleme 1 dakikadır. Beklemenin toplamı çarpıcıdır: 80 koşumda 6,6 × 80 = 528 dakika, yani bir iş gününden fazla bekleme, yönetilen türde 8 dakikaya karşı.

Kuyruğun günlük ortalamadan doğmadığı ayrıca sayılır. Günde 30 koşumda toplam iş 30 × 163 = 4 890 saniyedir; iki yuva dokuz saatlik bir günde 64 800 saniyelik kapasite sunar, yani doluluk yüzde 8’dir. Buna karşın 12 koşum bekler. Sebep gelişlerin şeklidir: koşumlar üç yığılmada, her biri yirmi dakikalık bir aralıkta geliyor ve yığılmanın ortasında iki yuva birden dolu. Kapasite kararı günlük toplama göre verilirse kuyruk hiç görünmez; kararın bakması gereken şey en yoğun yirmi dakikadır.

Bu bekleme kapı hesabına doğrudan girer. Önceki dersin ölçtüğü “kapının eklediği süre” yalnız hat süresiydi; kuyruk onun önüne eklenir. Günde 80 koşumda kendi barındırılan türde bir değişikliğin geri bildirimi ortalama 163 + 396 saniyeyi bulur — koşum süresinin iki buçuk katı bekleme. Hattı 40 saniye kısaltmak için ödenen çaba, kuyrukta kaybedilenin yanında görünmez hâle gelir.

Kuyruk para ile kapatılabilir ve hesabı basittir. İki makine yerine dört makine tutulursa sabit bedel 4 × 11 + 5,6 = 49,6 birime çıkar, yani günde 80 koşumdaki 113,7 birimin hâlâ yarısından azdır. Eşik böylece tek sayı olmaktan çıkar: karar, koşum sayısı ile kabul edilebilir bekleme süresinin kesişiminde durur.

Temiz Başlamanın Kapı Değeri

Önbellek sütunu iki türü ayıran asıl yerdir. Kendi barındırılan çalıştırıcı önceki dersin ölçtüğü yüzde 47,9 isabeti korur; yönetilen çalıştırıcı her koşumda temiz başlar ve isabeti sıfırdır. Koşum başına 40 saniyelik fark buradan gelir.

Kapı hesabı bu farkın öteki yüzünü gösterir. Önceki derste iki kusur (K4, K6) kaçmıştı, çünkü bildirilmemiş bir girdi değiştiğinde ilgili kapı önbellekten gelip hiç koşmamıştı. Önbelleği olmayan bir çalıştırıcıda böyle bir şey olamaz: her kapı her koşumda koşar ve on iki koşumluk dizide sekiz kusurun sekizi yakalanır. İki kusurun bedeli koşum başına 40 saniye, dizide 480 saniye, günde 30 koşumda 20 dakika ve 15 birimdir.

Ara yol denenebilir: yönetilen tür, önbelleği uzak bir depodan geri yükleyerek koşabilir. Ölçüm bu seçeneği de sayar — koşum 187 saniyeye iner, günde 30 koşumda 42,3 birim eder. Kazanç ilan edildiği kadar değildir: 203 saniyeden 187 saniyeye inen sürenin karşılığında aktarım süresi ve depo bedeli ödenir, günlük bedel 42,6’dan 42,3’e düşer. Daha önemlisi, bayat isabet geri gelir — kusur sayımı 8/8’den 6/8’e döner. Yönetilen türün iki kusurluk üstünlüğü, hızından değil tam olarak önbelleksizliğinden doğuyordu.

Bu üç sütun bir araya gelince karar kuralı tek cümleye inmez, ama sıraya girer. Koşum sayısı eşiğin altındaysa yönetilen tür hem ucuz hem de kapı hesabında üstündür; seçim tartışmasızdır. Eşiğin belirgin üstündeyse para kendi barındırılan türü gösterir, ama iki kalem geri ödenmelidir: kuyruğu kapatacak ek yuva ve bayat isabetin kaçırdığı kusur. İkincisi para ile kapatılmaz; kapatılma yolu önceki dersin gösterdiği yerdedir — kapıların girdilerini eksiksiz bildirmek. On iki koşumluk dizide bunun bedeli 54 saniyeydi; aynı iki kusuru çalıştırıcı türünü değiştirerek yakalamanın bedeli 480 saniye. Aynı kusur, dokuz kat pahalı çözüm.

Ölçünün göz ardı ettikleri adıyla yazılır. Yönetilen tarafta: eşzamanlılık üst sınırının aşıldığı anlar, veri aktarım ücreti, sağlayıcı kesintisinde hattın tümüyle durması, hattın gizli değerlerinin dışarıda çözülmesi ve çalıştırıcı sürümü değiştiğinde hat tanımının uyarlanması. Kendi barındırılan tarafta: ilk kurulum emeği, yedek makine, arıza günü, güvenlik yamasının gecikmesi, boşta duran kapasitenin elektrik ve alan bedeli, kapasite planlama hatası. İki tarafta da sayılmayan iki kalem vardır: kuyrukta bekleyen kişinin bağlam kaybı ve başarısız biten koşumun yeniden koşturulması. Beş bakım kalemi listelenmiştir ama emek olarak yalnız ayda altı saat üzerinden fiyatlanmıştır; bakımın atlandığı bir ay bu sütunda hiç görünmez.

Özet

  • Eşik günde 20 koşumdur: altında yönetilen tür ucuz (10 koşumda 14,2’ye karşı 27,6 birim), üstünde kendi barındırılan tür ucuzdur (80 koşumda 27,6’ya karşı 113,7 birim, 4,1 kat).
  • Eşik tek başına karar vermez. İki yuvalı kendi barındırılan tür günde 30 koşumda 12 koşumu bekletir; 80 koşumda 63 koşum bekler, ortalama 6,6 ve en uzun 20,9 dakika. Aynı gelişlerde sekiz yuvalı yönetilen tür 8 koşumu 1 dakikaya kadar bekletir.
  • Kuyruk kapının eklediği sürenin önüne yazılır: günde 80 koşumda bekleme, 163 saniyelik koşumun iki katıdır. Dört makineye çıkmak sabit bedeli 49,6 birime taşır ve kuyruğu parayla kapatır.
  • Maliyet kalemleri farklı eksendedir: yönetilen türde bir kalem (çalıştırıcı-dakikası, koşum başına), kendi barındırılan türde iki kalem (makine ve bakım emeği, zaman başına) ile beş bakım kalemi.
  • Temiz başlayan çalıştırıcı önbellek isabetini sıfırlar (yüzde 47,9’a karşı 0) ve on iki koşumluk dizide 8/8 kusur yakalar; kendi barındırılan tür 6/8’de kalır. İki kusurun bedeli koşum başına 40 saniye, günde 30 koşumda 20 dakika ve 15 birimdir.
  • Uzak önbellek deposu ara yolu süreyi 187 saniyeye indirir ama bayat isabeti geri getirir ve kusur sayımı 6/8’e döner; yönetilen türün üstünlüğü hızından değil önbelleksizliğinden gelir.

Sonraki Adım

Bu ölçümde hat hep aynı hattı — sekiz aşama, aynı bağımlılıklar, aynı kapılar — koştu. Bir soru sorulmadı: bu tanım nerede duruyor ve onu kim değiştiriyor? Yuva sayısını ikiden dörde çıkarmak, bir kapıyı kaldırmak ya da tümleşim sınamasını bölmek hattın tanımına dokunmaktır. Tanım bir arayüzde tıklanarak duruyorsa değişikliğin kimden geldiği, ne zaman ve neden yapıldığı hiçbir yerde yazılı değildir; hat bozulduğunda geri dönülecek bir önceki hâl de yoktur. Tanım depoda bir dosya olarak duruyorsa bunların hepsi vardır — ama beş servis için beş dosya, beş kez tekrarlanan aynı satırlar demektir. Sonraki ders şemayı kendi tanımlar ve iki biçimi sayar: değişikliğin izlenebilirliği, gözden geçirmeden geçen hat değişikliği oranı, hattın kendisi kırıldığında geri alma adımı ve tanımın çoğaltılmasının satır bedeli.

İ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