İçeriğe geç
academia.sh

Ders 13 / 22

Günlük Filtreleme ve Döndürme

Düzey, birim ve zaman süzgeçleri ile döndürme politikasının birlikte ölçülmesi: 4000 satırda 86 hata varken 1000 satırlık dosyada 19, 200 satırlık dosyada 5 hata kalıyor ve altı inceleme sorusunun kaçının yanıtsız kaldığı sayılıyor.

İçindekiler

Önceki iki ders elinde bütün günlük varken çalıştı: 4000 satır da, 601 satır da eksiksizdi ve süzgeçler bu bütünün üzerinde koştu. Bu varsayım bir makinede sınırlı bir süre geçerlidir. Günlük dosyaları sınırsız büyümez; disk sonludur ve dolan bir disk, günlüğün kendisinden daha büyük bir arızadır.

Bu ders iki mekanizmayı birlikte ele alır. Birincisi süzme: elinizdeki satırlardan bir alt küme seçmek. İkincisi döndürme (rotation): elinizdeki satırların bir kısmını kalıcı olarak atmak. İkisi yüzeyde benzer görünür — ikisinden sonra da daha az satır kalır — ama biri geri alınabilir, öteki alınamaz. Ölçülen şey, ikisinin tanıya verdiği zarardır.

Süzmenin Düşürdüğü Bağlam

Üç süzgeç türü vardır ve üçü farklı bir eksen boyunca keser. Düzey süzgeci yalnız belirli bir önem derecesinin üstündekileri bırakır. Birim süzgeci yalnız bir servisin kayıtlarını bırakır; önceki derste ölçülen şey buydu, komşuluk kaybını üretir. Zaman süzgeci bir aralığın dışını atar.

Düzey süzgeci en sık kullanılan ve en aldatıcı olanıdır. 4000 satırlık bir günlükte hata sayısı 86’dır; hatalarla sınırlanmış bir görüntü 4000 satırı 86’ya indirir ve okunabilir hâle getirir. Düşen 3914 satırın içinde ise hatanın öncesi vardır. Bir servisin hataya gitmeden önce yazdığı uyarı, hatanın kendisinden daha çok şey söyleyebilir: yeniden deneme sayısı, zaman aşımı süresi, kuyruk doluluğu. Düzey süzgeci bunları görünmez yapar.

Zaman süzgecinin tuzağı farklıdır. Bir arıza fark edildiğinde inceleme çoğunlukla fark edilme anından geriye doğru dar bir pencereyle başlar. Arızanın kendisi o pencerede olabilir, ama arızayı başlatan olay dışarıda kalabilir. Pencereyi genişletmek satır sayısını artırır ve okumayı zorlaştırır; bu, kursun ikinci iddiasının bir yüzüdür: daha çok satır daha iyi tanı demek değildir, ama daha az satır da her zaman daha net tanı vermez.

Süzmenin belirleyici özelliği geri alınabilirliğidir. Süzgeç yanlış seçildiyse komut yeniden çalıştırılır. Kayıp yoktur, yalnız zaman geçmiştir.

Süzgecin nasıl kurulduğu da biçime bağlıdır. Yapılandırılmış kayıtta üç eksen ayrı ayrı verilebilir; düz metinde metin eşleme ile satır seçilir ve zaman kısıtı metnin kendisinden ayrıştırılır. Aşağıdaki iki döküm örnektir ve çalıştırılmamıştır.

# ornek dokum , calistirilmis degildir
$ journalctl -u isleme -p warning --since -10min
$ grep -E 'hata|uyari' /var/log/isleme/isleme.log | tail -n 40

İki satır aynı işi yapmaz. Birincisi birimi, düzeyi ve zaman aralığını alan olarak kısıtlar; ikincisi ileti metninde iki sözcük arar ve zaman kısıtı yerine son kırk satırı alır. İkincisi, “uyari” sözcüğünü kullanmayan bir programın satırlarını sessizce atar ve “son kırk satır” kaç saniyeyi kapsadığını söylemez.

Döndürme: Geri Alınamayan Kesme

Döndürme bir dosyanın büyümesini sınırlayan mekanizmadır. Dosya belirlenen boyuta ya da yaşa ulaştığında yeniden adlandırılır, yerine yenisi açılır ve elde tutulan eski kopya sayısı aşıldığında en eskisi silinir. Sıkıştırma, silinme anını geciktirir; kaldırmaz. Bir saklama politikası bu üç parametreden oluşur: eşik, tutulan kopya sayısı ve sıkıştırma.

Sistem günlüğünün kendi sınırı da benzer çalışır: toplam boyut ya da süre sınırı aşıldığında en eski kayıtlar atılır. Ayrımın adı önemli değildir; sonuç aynıdır. Aşağıdaki döküm örnektir ve çalıştırılmamıştır.

# ornek dokum , calistirilmis degildir
$ ls -1 /var/log/isleme/
isleme.log
isleme.log.1
isleme.log.2.gz

Buradaki soru şudur: dosya sınırı, arızanın süresinden kısaysa ne olur. Yanıt, kursun üçüncü iddiasıdır: kanıt kendiliğinden yok olur. Kimse silmez, kimse karar vermez; politika çalışır ve kanıt gider.

Bu kaybın en sinsi yanı sessizliğidir. Silinen satırların yerine bir işaret bırakılmaz; dosyanın başında “buradan öncesi atıldı” diyen bir satır yoktur. Operatör dosyayı açtığında gördüğü şey, eksik bir kaydın değil, kısa bir geçmişin görüntüsüdür. Süzgeçte durum farklıdır: süzgeci kendisi yazdığı için neyi dışarıda bıraktığını bilir. Döndürmede seçimi yapan taraf operatör değildir ve seçim, arıza olmadan çok önce, bir yapılandırma dosyasına yazılmıştır.

Ölçülen Şey: Kalan Kanıt ve Yanıtsız Soru

Ölçü iki parçalıdır. Birinci parça kalan kanıt oranıdır: dosya boyutu küçüldükçe pencerenin başındaki hataların kaçı hayatta kalıyor. İkinci parça, bir arıza incelemesinde gerçekten sorulan altı soruya verilen yanıtların kaçının yanlış çıktığıdır: toplam hata sayısı, ilk hatanın saniyesi, ilk hatanın birimi, son hatanın saniyesi, pencerenin ilk yarısındaki hata sayısı ve hiç hata yazmayan birim sayısı. Kâhin, tam günlükten okunan yanıtlardır.

Kurgunun varsayımları: döndürülmüş dosya her zaman son satırları tutar ve atılan kısım geri gelmez (GN9); sınanan boyutlar 4000, 2000, 1000, 500 ve 200 satırdır (GN10); inceleme soru kümesi yukarıdaki altı sorudur (GN11); öncül uyarı penceresi beş saniye ve öncülün aynı birimden gelmesi gerekir (GN12); satır hızı pencere boyunca sabittir (GN13).

TOHUM = 20260218
DONEM = 600                      # gozlem penceresi: 600 saniye


def uretec(tohum):
    d = tohum

    def sonraki(n):
        nonlocal d
        d = (d * 1103515245 + 12345) % 2147483648
        return d % n
    return sonraki


BIRIM = {
    "veri-alma":      {"gerektirir": [], "yeniden": "her zaman"},
    "kuyruk":         {"gerektirir": ["veri-alma"], "yeniden": "her zaman"},
    "isleme":         {"gerektirir": ["kuyruk"], "yeniden": "arizada"},
    "rapor":          {"gerektirir": ["isleme"], "yeniden": "hayir"},
    "olcum":          {"gerektirir": ["veri-alma"], "yeniden": "her zaman"},
    "yedek":          {"gerektirir": [], "yeniden": "hayir"},
}


def gunluk_uret(tohum=TOHUM, satir=4000):
    r = uretec(tohum)
    kayit = []
    for i in range(satir):
        agirlik = r(100)
        duzey = "hata" if agirlik < 3 else ("uyari" if agirlik < 12 else "bilgi")
        kayit.append({"sira": i, "saniye": i * (DONEM / satir),
                      "duzey": duzey, "birim": list(BIRIM)[r(len(BIRIM))]})
    return kayit


def dondur(kayitlar, boyut):
    """GN9: dosya `boyut` satirda dolar ve eskisi silinir. Geriye ne kaldi."""
    return kayitlar[-boyut:] if boyut < len(kayitlar) else list(kayitlar)


def kanit_orani(kayitlar, kalan, duzey="hata"):
    tum = [k for k in kayitlar if k["duzey"] == duzey]
    kalanlar = [k for k in kalan if k["duzey"] == duzey]
    return {"toplam": len(tum), "kalan": len(kalanlar),
            "oran": round(len(kalanlar) / len(tum), 4) if tum else 0.0}


def onculu_hata(kayitlar, aralik=5.0):
    """GN12: kendinden onceki bes saniyede AYNI birimden uyari gelmis hatalar."""
    u = [k for k in kayitlar if k["duzey"] == "uyari"]
    h = [k for k in kayitlar if k["duzey"] == "hata"]
    return sum(1 for a in h
               if any(a["birim"] == b["birim"]
                      and 0 <= a["saniye"] - b["saniye"] <= aralik for b in u))


def yanitlar(kayitlar):
    """GN11: inceleme sorulari , dosyada duran satirlardan yanitlanir."""
    h = [k for k in kayitlar if k["duzey"] == "hata"]
    if not h:
        return {"toplam": 0, "ilk": None, "ilk_birim": None, "son": None,
                "ilk_yari": 0, "sessiz_birim": len(BIRIM)}
    d = {b: sum(1 for k in h if k["birim"] == b) for b in BIRIM}
    return {"toplam": len(h), "ilk": round(h[0]["saniye"], 1),
            "ilk_birim": h[0]["birim"], "son": round(h[-1]["saniye"], 1),
            "ilk_yari": sum(1 for k in h if k["saniye"] < DONEM / 2),
            "sessiz_birim": sum(1 for b in d if d[b] == 0)}


for tohum in (TOHUM, 20260219):
    G = gunluk_uret(tohum)
    K = yanitlar(G)
    print("tohum", tohum, "| satir", len(G), "| uyari",
          sum(1 for k in G if k["duzey"] == "uyari"), "| hata", K["toplam"])
    print("  duzey suzgeci: onculu uyarisi gizlenen hata", onculu_hata(G), "/", K["toplam"])
    print("  kahin:", K)
    print("  boyut  kalan  hata  kanit orani  yanlis yanit  ilk hata")
    for boyut in (4000, 2000, 1000, 500, 200):        # GN10
        kalan = dondur(G, boyut)
        ko = kanit_orani(G, kalan)
        Y = yanitlar(kalan)
        print(f"  {boyut:5d}  {len(kalan):5d}  {ko['kalan']:4d}  {ko['oran']:11.4f}"
              f"  {sum(1 for a in K if Y[a] != K[a]):12d}  {Y['ilk']}")
tohum 20260218 | satir 4000 | uyari 408 | hata 86
  duzey suzgeci: onculu uyarisi gizlenen hata 63 / 86
  kahin: {'toplam': 86, 'ilk': 6.1, 'ilk_birim': 'isleme', 'son': 598.0, 'ilk_yari': 44, 'sessiz_birim': 3}
  boyut  kalan  hata  kanit orani  yanlis yanit  ilk hata
   4000   4000    86       1.0000             0  6.1
   2000   2000    42       0.4884             3  314.2
   1000   1000    19       0.2209             4  461.2
    500    500    12       0.1395             4  527.5
    200    200     5       0.0581             4  573.4
tohum 20260219 | satir 4000 | uyari 314 | hata 163
  duzey suzgeci: onculu uyarisi gizlenen hata 99 / 163
  kahin: {'toplam': 163, 'ilk': 1.3, 'ilk_birim': 'rapor', 'son': 594.0, 'ilk_yari': 80, 'sessiz_birim': 3}
  boyut  kalan  hata  kanit orani  yanlis yanit  ilk hata
   4000   4000   163       1.0000             0  1.3
   2000   2000    83       0.5092             3  301.8
   1000   1000    35       0.2147             3  451.5
    500    500    12       0.0736             3  528.1
    200    200     3       0.0184             5  578.2

Çıktının Söylediği ile Sistemin Gerçeği

Üç sayı yan yana durur. Kâhin: altı yüz saniyelik pencerede 86 hata oldu; ilki altıncı saniyede, isleme biriminde. Araç çıktısı: 1000 satırlık dosyada 19 hata görünüyor, 200 satırlıkta 5. Yanlış tanı: altı sorunun 1000 satırda 4’ü, 200 satırda yine 4’ü yanlış yanıtlanıyor.

Kalan kanıt oranı döndürme boyutuyla birlikte düşer: 2000 satırda 0,4884, 1000 satırda 0,2209, 500 satırda 0,1395, 200 satırda 0,0581. Dosyayı yarıya indirmek kanıtın yarısını değil, yarısından fazlasını götürür; kayıtlar zaman içinde düzgün dağılmadığı için kayıp doğrusal değildir.

Asıl zarar sayıda değil, sayının inandırıcılığındadır. 200 satırlık dosyayı açan operatör beş hata görür ve beş hatanın hepsi gerçektir; hiçbiri uydurma değildir. Ondan çıkardığı “bu pencerede beş hata oldu” cümlesi ise yanlıştır. Araç yalan söylemiyor; dosya yalan söylemiyor. Yanlış olan, eksik bir dosyadan tam bir sonuç çıkarmaktır.

Altı sorunun tablosu bunu ayrıntılandırır. Tam dosyada altı yanıtın altısı doğrudur. 2000 satırda üç yanıt bozulur: toplam hata sayısı, ilk hatanın saniyesi ve pencerenin ilk yarısındaki hata sayısı. 1000 satırdan itibaren ilk hatanın birimi de yanlış çıkar: gerçek ilk hata isleme birimindeyken dosyada kalan ilk hata başka bir birime aittir. İnceleme “arıza nerede başladı” sorusuna yanlış birimi işaret ederek yanıt verir ve bu yanıtın yanlış olduğunu gösteren hiçbir belirti dosyada yoktur.

Dikkat çeken bir ayrıntı, yanlış yanıt sayısının 1000’den sonra artmamasıdır: dörtte kalır. Bunun nedeni, kalan iki sorunun — son hatanın saniyesi ve sessiz birim sayısı — pencerenin sonuna yakın kayıtlardan yanıtlanabilmesidir. Döndürme her soruyu eşit ölçüde vurmaz: geçmişe bakan sorular önce ölür, şimdiye bakan sorular sağ kalır.

Bir başka ayrıntı da kanıt oranının hata sayısını değil hata oranını koruyabilmesidir. 200 satırlık dosyada beş hata vardır ve bu, satır başına düşen hata bakımından tam günlükteki orana yakındır. Yalnız orana bakan bir tanı hiçbir tuhaflık görmez: dosya sağlıklı bir sistemin sağlıklı bir kesiti gibi durur. Kaybolan şey oran değil, süredir; olayın ne kadar sürdüğü, ne zaman başladığı ve nasıl yayıldığı yalnız uzun pencereden okunur.

Süzmenin ölçüsü de aynı çıktıdadır. 86 hatanın 63’ünün kendinden önceki beş saniye içinde aynı birimden gelmiş bir uyarısı vardır. Yalnız hataları gösteren bir görüntü bu 63 öncülün hepsini gizler; satırlar dosyada durur, ama bakılan yerde durmaz. Süzmenin farkı şudur: süzgeci gevşetmek 63 satırı geri getirir, döndürmeyi gevşetmek geçmişte silinmiş satırı geri getirmez.

Dosya Kaç Saniyelik Geçmiş Tutuyor

Döndürme eşiği satır cinsindendir, oysa incelemenin sorduğu şey zamandır. İkisi arasındaki çeviri satır hızıyla yapılır ve bu kurguda hız sabit alınmıştır (GN13): altı yüz saniyede 4000 satır, yani satır başına 0,15 saniye. Buradan her eşiğin tuttuğu geçmiş doğrudan çıkar. 2000 satırlık bir dosya 300 saniyelik, 1000 satırlık dosya 150 saniyelik, 200 satırlık dosya yalnız 30 saniyelik geçmiş tutar.

Çıktının son sütunu bu hesabı doğrular. 1000 satırlık dosyada görülen ilk hata 461,2. saniyededir; dosyanın kapsadığı pencere 450. saniyede başlar. 200 satırlık dosyada ilk hata 573,4. saniyededir; pencere 570’te başlamıştır. Gerçek ilk hata ise 6,1. saniyededir ve hiçbir küçük dosyada bulunmaz.

Bu çeviri, eşiği seçerken sorulacak soruyu belirler. “Kaç satır tutalım” sorusunun anlamlı bir yanıtı yoktur; anlamlı soru “kaç saniyelik geçmiş gerekiyor” sorusudur ve satır hızı biliniyorsa aradaki dönüşüm bir çarpmadır. Satır hızı sabit de değildir: arıza anında servisler daha çok yazar, dolayısıyla dosya tam olarak en çok kanıt üretilen anda daha hızlı dolar ve daha hızlı döner. Kanıtın yoğunlaştığı an, kanıtın en hızlı silindiği andır.

Politikanın Ne Anlama Geldiği

Buradan işletim tarafında iki karar çıkar. Birincisi, döndürme eşiği bir depolama kararı gibi görünse de aslında bir inceleme kararıdır: eşik, arızanın en uzun makul süresinden kısa olmamalıdır. Kalan kanıt oranı bunun ölçüsüdür ve önceden hesaplanabilir; günlük satır hızı biliniyorsa, bir eşiğin kaç saniyelik geçmişi tuttuğu bir bölme işlemidir.

İkincisi, “her ihtimale karşı hepsini sakla” bir çözüm değildir. Disk dolarsa yazma başarısız olur ve o başarısızlık, kaybedilen kanıttan daha ağır bir arızadır. Depolama konusu bu sınırın iki ayrı biçimde geldiğini gösterecektir. Doğru karar, hangi sorunun yanıtlanabilir kalması gerektiğine önceden karar vermek ve eşiği o soruya göre seçmektir.

Üçüncü bir karar da döndürmenin ne zaman yapıldığıdır. Zamana bağlı döndürme sabit aralıklarla çalışır ve dosya küçük kalsa bile döndürür; boyuta bağlı döndürme dosya dolduğunda çalışır ve sessiz bir makinede hiç dönmeyebilir. İkisi bir arada kullanıldığında, önce hangisi tetiklenirse o kazanır. Sonuç şudur: bir eşiğin tuttuğu geçmiş, makinenin ne kadar konuşkan olduğuna göre değişir ve yoğun bir günde beklenenden kısa olur.

Dördüncü karar döndürmenin nasıl yapıldığıdır. Dosya yeniden adlandırılıp yerine yenisi açılırsa, dosyayı hâlâ açık tutan bir süreç eski dosyaya yazmayı sürdürür ve yeni dosya boş kalır; bu yüzden döndürme sonrasında yazan tarafa dosyayı yeniden açmasını söyleyen bir sinyal gönderilir. Süreç yönetimi konusunda kurulan sinyal modeli burada bir günlük mekanizmasının parçasıdır. Sinyal gönderilmezse arıza sessizdir: dosyalar döner, boyut sınırı çalışır, ama kayıtlar artık kimsenin bakmadığı bir dosyaya düşer.

İkinci Tohum

İkinci tohumda günlük daha gürültülüdür: 163 hata ve 314 uyarı çıkar. Kanıt oranı benzer biçimde düşer — 1000 satırda 0,2147, 200 satırda 0,0184. Yanlış yanıt sayısı 2000, 1000 ve 500 satırda 3, 200 satırda 5 olur. Kesin değerler kurguya bağlıdır; kurguya bağlı olmayan şey, kalan kanıt oranının döndürme boyutuyla birlikte hızla düşmesi ve geçmişe bakan soruların önce yanıtsız kalmasıdır.

Özet

  • Süzme geri alınabilir, döndürme alınamaz; ikisi de satır azaltır ama biri kayıp üretmez.
  • 4000 satırda 86 hata varken 1000 satırlık dosyada 19 (0,2209), 200 satırlıkta 5 (0,0581) hata kalır; kayıp doğrusal değildir.
  • Altı inceleme sorusundan 1000 satırda 4’ü yanlış yanıtlanır ve bunlardan biri “arıza nerede başladı” sorusudur; yanlışlığın hiçbir belirtisi dosyada yoktur.
  • Döndürme soruları eşit vurmaz: geçmişe bakan sorular önce ölür, şimdiye bakan sorular sağ kalır.
  • 86 hatanın 63’ünün aynı birimden gelen bir uyarı öncülü vardır; düzey süzgeci onları gizler, ama süzgeci gevşetmek geri getirir.

Sonraki Adım

Bu derste ölçülen kayıp geçmişe aitti: silinmiş satır geri gelmiyordu. Bir makinenin durumunu anlatan ikinci veri türü ise satır değil sayıdır — yük, bellek, disk doluluğu — ve orada kayıp başka bir biçimde ortaya çıkar. Bu sayılar tek bir ana ait değildir; geçmiş bir pencereyi ortalayarak üretilirler ve ortalama, sıçramayı yumuşatır. Sonraki ders sistem sağlığı ölçümlerini ele alır ve yük ortalamasının gecikmeli bir gösterge olduğunu sayıyla gösterir: anlık yük 7,36 iken altmış saniyelik ortalama 6,22’de kalı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