İçeriğe geç
academia.sh

Ders 15 / 16

Komut Satırı Denetimi

5.110 kayıtlık bir süreç oluşturma örnekleminde yalnız alt süreç adına bakan kural 1.702 kaydı işaretliyor; üst süreç bağlamı aynı kümeyi 40 kayda ve 9 çifte indiriyor, yeni ve seyrek ölçütü beş şüpheli kalemin beşini de bir meşru yenilikle birlikte ayırıyor. Beş kalemin üçünün başka hiçbir kaynakta izi yok. Filoda kayıt günde 10,18 milyon satır ve 4,55 GiB tutuyor; taban çizgisi dışı çifti saklamak hacmi 128'e bölüyor ama dört soruşturma sorusunun üçünü yanıtsız bırakıyor.

İçindekiler

Bir önceki ders kimlik doğrulama günlüğünü tek başına ölçtü ve oturum açıldıktan sonrasını göremediğini gösterdi. İlk dersin kapsam tablosunda on iki tutunma noktası türünden sekizini tek başına adıyla yazan bir kaynak vardı ve varsayılan olarak kapalıydı: süreç oluşturma kaydı. Bu ders o kaydı açar ve iki soruyu birlikte sorar — kayıt neyi ayırt edebiliyor ve ne kadar yer tutuyor.

Ayırt etmenin anahtarı tek bir alandır: üst süreç. Bir süreç oluşturma kaydı yalnız çalışan kalemin adını taşırsa elde düz bir liste kalır; üst süreç kimliğini de taşırsa aynı kayıtlar bir süreç ağacına dönüşür ve soru “bu araç çalıştı mı” olmaktan çıkıp “bu aracı ne çalıştırdı” olur. Aşağıdaki ölçüm bir modeldir, bölgesel ölçüm ağı kurgudur ve süreç adları ürün değil tür adıdır. Şüpheli kalemler yalnız çift olarak anılır; hiçbir komut, betik ya da kullanım biçimi yazılmaz.

  • SG11. Örneklem bir günün süreç oluşturma kaydından 5.110 satırdır ve 8 makineyi kapsar. Filo hacmi ilk dersteki makine başına 38.000 kayıt varsayımından ölçeklenir.
  • SG12. Taban çizgisi, öğrenme döneminde görülmüş 16 (üst, alt) çiftidir. Bir çift taban çizgisinde yoksa “yeni çift” sayılır.
  • SG13. Kural 1 yalnız alt sürecin adına bakar ve üç adı ilgi çekici sayar. Kural 2 (üst, alt) çiftinin taban çizgisinde olup olmadığına bakar. Kurallar etiket alanını görmez.
  • SG14. Modelin bildiği doğru şudur: dört yeni çift meşru bir yeniliktir, beş yeni çift şüphelidir. Şüpheli kalemlerin bir bölümünün başka bir kaynakta izi vardır; bu iz ilk dersteki kapsam tablosundan okunur.
  • SG15. Kayıt boyutu 480 bayttır ve saklama karşılaştırması 90 gün üzerinden yapılır.

Düz Liste ve Süreç Ağacı

// surec.mjs — surec olusturma kaydi orneklemi ve iki kural: ad listesi ile ust surec cifti.
// MODELDIR; surec adlari urun degil TUR adidir. Kurallar yalniz ust/alt/makine alanlarini okur;
// etiket alani modelin dogrusudur ve kurallara verilmez.
export const TOHUM = 20260401;
const uretec = (t) => { let s = t >>> 0;
  return () => (s = (s * 1664525 + 1013904223) >>> 0) / 4294967296; };
const r = uretec(TOHUM);

// Taban cizgisi: ogrenme doneminde gorulmus (ust, alt) cifti ve gunluk sayisi.
export const TABAN = [
  ["oturum-yoneticisi", "kabuk", 620], ["kabuk", "olcum-istemcisi", 840],
  ["kabuk", "arsivleyici", 180], ["kabuk", "ag-aktarim", 210],
  ["zamanlayici", "betik-yorumlayici", 460], ["zamanlayici", "yedekleme", 120],
  ["yonetim-ajani", "paket-yoneticisi", 90], ["yonetim-ajani", "betik-yorumlayici", 260],
  ["servis-yoneticisi", "olcum-toplayici", 40], ["olcum-toplayici", "olcum-istemcisi", 1300],
  ["belge-isleyici", "yazdirma-yardimcisi", 70], ["posta-istemcisi", "belge-isleyici", 150],
  ["tarayici", "belge-isleyici", 130], ["paket-yoneticisi", "kurulum-kancasi", 210],
  ["yedekleme", "arsivleyici", 260], ["kurulum-kancasi", "kabuk", 130],
];
// Taban cizgisinde olmayan cift: dort mesru yenilik, bes supheli kalem.
// "iz" alani: kalemin etkisini goren BASKA kaynak (ilk dersin kapsam tablosu), yoksa null.
export const YENI = [
  ["yonetim-ajani", "ag-aktarim", 14, "mesru-yenilik", null],
  ["zamanlayici", "arsivleyici", 6, "mesru-yenilik", null],
  ["kabuk", "paket-yoneticisi", 9, "mesru-yenilik", "paket ve yukleme kaydi"],
  ["yedekleme", "ag-aktarim", 2, "mesru-yenilik", null],
  ["belge-isleyici", "betik-yorumlayici", 2, "supheli", null],
  ["posta-istemcisi", "kabuk", 1, "supheli", null],
  ["olcum-toplayici", "arsivleyici", 3, "supheli", null],
  ["yazdirma-yardimcisi", "kabuk", 1, "supheli", "zamanlayici kaydi"],
  ["tarayici", "betik-yorumlayici", 2, "supheli", "sistem olay gunlugu"],
];
export const MAKINE = 8;

const kayitlar = [];
const ekle = (ust, alt, etiket) => kayitlar.push({
  t: Math.floor(r() * 86400), makine: `uc-${String(1 + Math.floor(r() * MAKINE))
    .padStart(3, "0")}`, ust, alt, etiket });
for (const [ust, alt, n] of TABAN) for (let i = 0; i < n; i++) ekle(ust, alt, "taban");
for (const [ust, alt, n, tur] of YENI) for (let i = 0; i < n; i++) ekle(ust, alt, tur);
kayitlar.sort((a, b) => a.t - b.t);
export const KAYIT = kayitlar;

// Kural 1: yalniz alt surecin adina bakar.
export const ILGI = ["kabuk", "betik-yorumlayici", "ag-aktarim"];
// Kural 2: (ust, alt) cifti taban cizgisinde mi.
const tabanKume = new Set(TABAN.map(([u, a]) => `${u}>${a}`));
export const cift = (k) => `${k.ust}>${k.alt}`;
export const yeniCift = (k) => !tabanKume.has(cift(k));
export const supheliCift = new Set(YENI.filter((y) => y[3] === "supheli")
  .map(([u, a]) => `${u}>${a}`));

if (import.meta.url === `file://${process.argv[1]}`) {
  const gen = (B) => (h) => h.map((v, j) => (j ? String(v).padStart(B[j])
    : String(v).padEnd(B[0]))).join("");
  const yz = gen([42, 8, 10, 18, 24]);
  console.log(`model (tohum ${TOHUM}): ${KAYIT.length} surec olusturma kaydi orneklemi, ` +
    `${MAKINE} makine, ${new Set(KAYIT.map(cift)).size} ayri (ust, alt) cifti (kurgu)`);
  const ad = KAYIT.filter((k) => ILGI.includes(k.alt));
  const agac = KAYIT.filter(yeniCift);
  console.log(`kural 1 (yalniz alt surec adi): ${ad.length} kayit isaretleniyor, ` +
    `${new Set(ad.map(cift)).size} ayri cift`);
  console.log(`kural 2 (taban cizgisi disi cift): ${agac.length} kayit, ` +
    `${new Set(agac.map(cift)).size} ayri cift`);
  console.log("\n" + yz(["taban cizgisi disi cift", "kayit", "makine", "kural 1 gorur mu",
    "baska kaynakta izi"]));
  for (const [u, a, , tur, iz] of YENI) {
    const l = KAYIT.filter((k) => cift(k) === `${u}>${a}`);
    console.log(yz([`${u} > ${a}`, l.length, new Set(l.map((k) => k.makine)).size,
      ILGI.includes(a) ? "evet" : "hayir", iz ?? "yok"]));
  }
  const seyrek = [...new Set(agac.map(cift))]
    .filter((c) => agac.filter((k) => cift(k) === c).length <= 3);
  console.log(`\nyeni VE seyrek (3 kayit ve alti) cift: ${seyrek.length}; bunlarin ` +
    `${seyrek.filter((c) => supheliCift.has(c)).length} tanesi supheli kalemdir, ` +
    `${seyrek.filter((c) => !supheliCift.has(c)).length} tanesi mesru yeniliktir`);
  console.log(`bes supheli kalemin ${YENI.filter((y) => y[3] === "supheli" && y[4]).length} ` +
    `tanesinin baska bir kaynakta izi var; ` +
    `${YENI.filter((y) => y[3] === "supheli" && !y[4]).length} tanesi yalnizca surec ` +
    `olusturma kaydinda gorunuyor`);
}
model (tohum 20260401): 5110 surec olusturma kaydi orneklemi, 8 makine, 25 ayri (ust, alt) cifti (kurgu)
kural 1 (yalniz alt surec adi): 1702 kayit isaretleniyor, 11 ayri cift
kural 2 (taban cizgisi disi cift): 40 kayit, 9 ayri cift

taban cizgisi disi cift                      kayit    makine  kural 1 gorur mu      baska kaynakta izi
yonetim-ajani > ag-aktarim                      14         6              evet                     yok
zamanlayici > arsivleyici                        6         5             hayir                     yok
kabuk > paket-yoneticisi                         9         6             hayir  paket ve yukleme kaydi
yedekleme > ag-aktarim                           2         2              evet                     yok
belge-isleyici > betik-yorumlayici               2         1              evet                     yok
posta-istemcisi > kabuk                          1         1              evet                     yok
olcum-toplayici > arsivleyici                    3         3             hayir                     yok
yazdirma-yardimcisi > kabuk                      1         1              evet       zamanlayici kaydi
tarayici > betik-yorumlayici                     2         2              evet     sistem olay gunlugu

yeni VE seyrek (3 kayit ve alti) cift: 6; bunlarin 5 tanesi supheli kalemdir, 1 tanesi mesru yeniliktir
bes supheli kalemin 2 tanesinin baska bir kaynakta izi var; 3 tanesi yalnizca surec olusturma kaydinda gorunuyor

İki kuralın çıktısı arasındaki oran dersin ilk sayısıdır. Yalnız alt sürecin adına bakan kural 5.110 kaydın 1.702’sini işaretliyor, yani üçte birini. Bunun nedeni işaretlenen adların gerçekten şüpheli olması değil, kurumun bu araçları gün boyu meşru biçimde kullanmasıdır: kabuk oturum yöneticisinden 620 kez, betik yorumlayıcı zamanlayıcıdan 460 kez, ağ aktarım aracı kabuktan 210 kez başlıyor. Bir uyarı listesi olarak bu sayı işe yaramaz.

Aynı kayıt kümesi üst süreçle birlikte okunduğunda 1.702 kayıt 40’a, on bir çift dokuza iniyor. Değişen tek şey ölçütün alan sayısıdır: bir yerine iki. Süreç ağacının verdiği şey, bir aracın çalışmış olmasının değil, beklenmeyen bir üstten çalışmış olmasının sayılabilmesidir.

Tablo bu dokuz çiftin ikiye ayrıldığını gösteriyor. Dördü meşru yeniliktir — yeni bir dağıtım adımı, yeni bir yedek işi, yöneticinin elle kurulum yapması. Beşi şüphelidir ve ortak yanları biçimlerinde: belge işleyen, posta alan ya da tarayan bir sürecin altında bir yorumlayıcı ya da kabuk, dış veriye dokunan bir servisin altında bir arşivleyici. Bunlar ayrı ayrı hiçbir yasak komut içermez; şüpheli olan konumdur.

Sonuncu iki satır iki ayrı sınırı yazıyor. Yeni ve seyrek olma ölçütü altı çift veriyor; beşi şüpheli kalemdir, biri meşru yeniliktir — yani bu ölçüt beş kalemi de ayırıyor ve karşılığında bir gereksiz inceleme üretiyor. İkinci sınır daha ağırdır: beş şüpheli kalemin üçünün başka hiçbir kaynakta izi yoktur. Kayıt kapalıysa o üç kalem için elde hiçbir şey kalmaz. Kalan ikisinden biri yalnız zamanlayıcı kaydında görünür ve o kaynak da ilk dersin tablosunda varsayılan olarak kapalıdır.

Bu ölçütün meşru işe bedeli tabloda dördüncü sütun olarak durmuyor, ama sayılabilir. Bir günde dokuz yeni çift çıktı ve dördü taban çizgisine eklenmesi gereken meşru yeniliktir: yeni bir dağıtım aracı, yeni bir yedek işi, bir yöneticinin elle kurulumu. Uyarıların yaklaşık yarısı bir tehdit değil, bir bakım kalemidir ve her biri bir kişinin bakıp karar vermesini ister. Taban çizgisi bir kez yazılıp bırakılan bir dosya değildir; kurumdaki her yazılım değişikliği onu eskitir. Bedeli ödenmezse ölçüt kendiliğinden bozulur — biriken meşru yenilikler listeyi kalabalıklaştırır ve bir süre sonra kimse dokuz satıra bakmaz.

Kaydın Hacmi ve Saklama Kararı

// hacim.mjs — uc saklama politikasinin hacmi, tuttugu supheli kalem ve yanitladigi soru.
import { KAYIT, ILGI, yeniCift, cift, supheliCift } from "./surec.mjs";

const FILO = 268, GUNLUK = 38000, BAYT = 480;      // onceki dersteki makine basina kayit
const POLITIKA = [
  ["hepsini sakla", () => true],
  ["yalniz ilgi ceken ad", (k) => ILGI.includes(k.alt)],
  ["yalniz taban disi cift", yeniCift],
];
// Sorular tam kume uzerinde yanitlanir; suzulmus kumede ayni yaniti veriyorsa "evet".
const SORU = [
  ["belge isleyici baska ne calistirdi",
    (l) => new Set(l.filter((k) => k.ust === "belge-isleyici").map((k) => k.alt)).size],
  ["arsivleyici cifti ilk hangi makinede",
    (l) => l.filter((k) => cift(k) === "olcum-toplayici>arsivleyici")
      .sort((a, b) => a.t - b.t)[0]?.makine ?? "-"],
  ["olcum istemcisi kac kez calisti",
    (l) => l.filter((k) => k.alt === "olcum-istemcisi").length],
  ["kabugu kac ayri ust surec calistirdi",
    (l) => new Set(l.filter((k) => k.alt === "kabuk").map((k) => k.ust)).size],
];
const tamYanit = SORU.map(([, f]) => f(KAYIT));

const gen = (B) => (h) => h.map((v, j) => (j ? String(v).padStart(B[j])
  : String(v).padEnd(B[0]))).join("");
const yz = gen([25, 10, 9, 15, 14, 13, 10]);
const gib = (n) => (n * BAYT) / 1024 ** 3;

console.log(`filo ${FILO} makine x ${GUNLUK} kayit/gun = ` +
  `${(FILO * GUNLUK).toLocaleString("tr-TR")} kayit/gun, kayit ${BAYT} bayt`);
console.log(yz(["politika", "orneklem", "oran", "filo kayit/gun", "GiB/gun", "90 gun GiB",
  "supheli"]));
const yanitlar = [];
for (const [ad, suz] of POLITIKA) {
  const l = KAYIT.filter(suz);
  const oran = l.length / KAYIT.length;
  const s = new Set(l.filter((k) => supheliCift.has(cift(k))).map(cift)).size;
  yanitlar.push(SORU.map(([, f], i) => f(l) === tamYanit[i]));
  console.log(yz([ad, l.length, `%${(100 * oran).toFixed(1)}`,
    Math.round(FILO * GUNLUK * oran).toLocaleString("tr-TR"),
    gib(FILO * GUNLUK * oran).toFixed(2), Math.round(gib(FILO * GUNLUK * oran) * 90),
    `${s}/${supheliCift.size}`]));
}
const ys = gen([38, 15, 22, 24]);
console.log("\n" + ys(["sorusturma sorusu", ...POLITIKA.map((p) => p[0])]));
for (const [i, [ad]] of SORU.entries())
  console.log(ys([ad, ...yanitlar.map((y) => (y[i] ? "evet" : "hayir"))]));
console.log(POLITIKA.map((p, j) => `${p[0]}: ` +
  `${yanitlar[j].filter(Boolean).length}/${SORU.length}`).join("; "));
const tam = gib(FILO * GUNLUK), dar = gib(FILO * GUNLUK * KAYIT.filter(yeniCift).length /
  KAYIT.length);
console.log(`\ntaban disi cifti saklamak hacmi ${Math.round(tam / dar)} kata boluyor ve bes ` +
  `supheli kalemin besini de tutuyor; bedeli dort sorudan ucunun yanitsiz kalmasidir`);
filo 268 makine x 38000 kayit/gun = 10.184.000 kayit/gun, kayit 480 bayt
politika                   orneklem     oran filo kayit/gun       GiB/gun   90 gun GiB   supheli
hepsini sakla                  5110   %100.0     10.184.000          4.55          410       5/5
yalniz ilgi ceken ad           1702    %33.3      3.392.009          1.52          136       4/5
yalniz taban disi cift           40     %0.8         79.718          0.04            3       5/5

sorusturma sorusu                       hepsini sakla  yalniz ilgi ceken ad  yalniz taban disi cift
belge isleyici baska ne calistirdi               evet                 hayir                   hayir
arsivleyici cifti ilk hangi makinede             evet                 hayir                    evet
olcum istemcisi kac kez calisti                  evet                 hayir                   hayir
kabugu kac ayri ust surec calistirdi             evet                  evet                   hayir
hepsini sakla: 4/4; yalniz ilgi ceken ad: 1/4; yalniz taban disi cift: 1/4

taban disi cifti saklamak hacmi 128 kata boluyor ve bes supheli kalemin besini de tutuyor; bedeli dort sorudan ucunun yanitsiz kalmasidir

Hacim satırı bu kaydın neden varsayılan olarak kapalı olduğunu açıklıyor. Filo günde 10,18 milyon süreç oluşturma kaydı üretiyor; bu, günde 4,55 GiB ve doksan günde 410 GiB eder. Rakam tek başına karşılanamaz değildir, ama ilk dersteki öteki altı kaynağın toplamının yanında büyüktür ve bu kayıt her makinede tek tek açılmalıdır.

Orta satır saklamayı ada göre daraltmanın ne verdiğini gösteriyor: hacim üçte bire iniyor ve beş şüpheli kalemin dördü kalıyor. Kaybedilen kalem, adı ilgi listesinde olmayan bir arşivleyicidir — yani daraltmayı ada göre yapmak, tam olarak listeye yazılmamış aracı silmek demektir. Alt satır çift ölçütünü kullanıyor: hacim 128’e bölünüyor, beş kalemin beşi de kalıyor.

Alttaki tablo bu ucuzluğun neye mal olduğunu ölçüyor. Dört soruşturma sorusu tam kümede yanıtlanıyor; taban çizgisi dışı çifti saklayan politika yalnız birini yanıtlıyor. Kalanları yanıtlayamaz, çünkü sildiği şey beklenen kayıtlardır: bir üst sürecin o gün başka ne çalıştırdığı, bir kalemin kaç kez koştuğu ve bir aracı kaç ayrı üstün başlattığı yalnız beklenen kayıtların içinde durur.

Bu iki tablo birlikte kaydın gerçek kararını veriyor. Tespit için taban çizgisi dışı çiftler yeter ve çok ucuzdur; soruşturma için tam kayıt gerekir ve doksan günde 410 GiB tutar. İkisi aynı karar değildir: uyarı üretmek ile bir uyarıdan sonra soru sorabilmek ayrı ayrı fiyatlanır ve ada göre daraltma ikisinde de en kötü seçenektir — hacmin üçte birini ödeyip dört sorunun birini yanıtlıyor ve beş kalemin birini kaybediyor.

Özet

  • Yalnız alt süreç adına bakan kural 5.110 kaydın 1.702’sini işaretliyor; aynı küme üst süreç bağlamıyla okunduğunda 40 kayda ve 9 çifte iniyor.
  • Dokuz taban çizgisi dışı çiftin dördü meşru yeniliktir, beşi şüphelidir; şüpheli olan komut değil konumdur — bir kalemin hangi üst sürecin altında çalıştığıdır.
  • Yeni ve seyrek olma ölçütü altı çift veriyor: beş şüpheli kalemin beşi de içinde, karşılığında bir gereksiz inceleme.
  • Beş şüpheli kalemin üçünün başka hiçbir kaynakta izi yok; biri yalnız varsayılan olarak kapalı olan zamanlayıcı kaydında görünüyor.
  • Filo günde 10,18 milyon kayıt ve 4,55 GiB üretiyor; taban çizgisi dışı çifti saklamak hacmi 128’e bölüyor ve beş kalemi de tutuyor, ama dört soruşturma sorusunun üçünü yanıtsız bırakıyor.

Sonraki Adım

Bu konunun üç dersi de aynı sessiz varsayımı taşıdı: kayıt orada duruyor ve doğru. Oysa ölçülen kayıtların tamamı, üzerinde kalem çalıştıran makinenin kendi diskinde üretiliyor. Kod bir kez uçta çalıştıysa, o kayıtlar da onun erişebildiği yerdedir. Son ders bu varsayımı sınar: kurcalanmış bir günlük kümesinde kaç kaydın silindiği ve kaçının değiştirildiği bir karma zinciriyle tespit edilir, zincirin göremediği durum adıyla yazılır ve merkezîleştirmenin kapattığı pencere ölçü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