Ders 14 / 22
Sistem Sağlığı Ölçümleri
Yük ortalaması, bellek ve disk göstergelerinin ne söylediği ve ne söylemediği: anlık yük 7,36 iken altmış saniyelik ortalama 6,22'de kalıyor, eşiği 54 saniye boyunca aşan gerçek yükü ortalanmış gösterge hiç göstermiyor.
İçindekiler
Önceki ders geçmişe ait bir kaybı ölçtü: döndürülen bir günlükte silinen satır geri gelmiyordu. Bir makinenin durumu hakkında konuşan ikinci veri türü satır değil sayıdır. Yük, bellek, disk doluluğu; her biri tek bir sayı olarak sunulur ve o sayı bir arıza sırasında ilk bakılan yerdir.
Bu ders o sayıların nasıl üretildiğini ele alır. Ortaya çıkan sorun döndürmedekiyle aynı ailedendir ama farklı bir mekanizmadan gelir: satır silinmez, sayı ortalanır. Ortalama alan bir gösterge geçmişi bugüne karıştırır ve sıçrama, ortalamanın içinde erir. Ölçülen şey, o erimenin tanıyı kaç saniye boyunca yanlış tuttuğudur.
Bir ayrım baştan yapılmalıdır. Günlük satırı bir olayı kaydeder: olmuş bir şeyin izi diskte durur ve sonradan okunabilir. Sağlık göstergesi ise bir durumu okur: okunduğu anda üretilir ve okunmadığı an için hiçbir iz bırakmaz. Bir günlüğün eksikliği döndürmeyle açıklanır; bir göstergenin eksikliğinin açıklaması yoktur, çünkü kaydedilmemiş bir an, hiç olmamış bir andan ayırt edilemez.
Yük Ortalaması Neyi Sayar
Yük ortalaması (load average) çalışmaya hazır ya da kesintisiz bekleyen süreçlerin sayısının bir zaman aralığındaki ortalamasıdır. İki noktası hemen belirtilmelidir. Birincisi, bu bir yüzde değildir: işlemci doluluğunu değil, sıraya girmiş iş miktarını anlatır. İkincisi, bir yük ortalaması hep bir pencereyle birlikte gelir; tek başına “yük” diye bir sayı yoktur. Yaygın sunum üç pencereyi yan yana koyar ve üçü aynı anı üç farklı geçmişle anlatır.
Sayının yorumu çekirdek sayısına bağlıdır. Aynı sayı, tek çekirdekli bir makinede doygunluk, çok çekirdekli bir makinede rahatlık anlamına gelebilir. Bu yüzden mutlak bir eşik yoktur; eşik makineye göre kurulur ve kurulurken çekirdek sayısına bölünmüş biçimi kullanılır.
Sayıya giren şeyin kapsamı da yanıltıcı olabilir. Yük ortalaması yalnız işlemci bekleyen süreçleri değil, kesintisiz girdi/çıktı beklemesinde duran süreçleri de sayar. Sonuç şudur: işlemcisi neredeyse boş, ama diski tıkanmış bir makinede yük ortalaması yüksek okunur ve “işlemci yetmiyor” tanısı üretir. Bir sonraki dersin ayırmaya çalıştığı üç darboğaz türü, bu tek sayının içinde toplanmış durumdadır.
Üçüncü ve bu dersin ölçtüğü nokta ise şudur: yük ortalaması gecikmeli bir göstergedir. Değeri, bakılan andaki durumu değil, o ana kadarki pencerenin ortalamasını verir. Bir sıçrama başladığında gösterge yavaş yükselir; sıçrama bittiğinde yavaş iner. Aradaki fark, ortalamanın kaçırdığı gerçektir.
Aşağıdaki döküm örnektir ve çalıştırılmamıştır; üç sayı sırasıyla bir, beş ve on beş dakikalık pencerelerdir.
# ornek dokum , calistirilmis degildir $ uptime yuk ortalamasi: 6.22, 6.19, 6.08
Ölçülen Şey: Ortalamanın Bastırdığı Sıçrama
Ölçü ortak tanımın süreç kurgusunun üzerine kurulur. Kurgunun varsayımları: yük, yirmi dört sürecin saniye saniye kullanımının toplamıdır ve yüze bölünerek sunulur (GN14); ölçüm yalnız pencerenin dolduğu altmışıncı saniyeden sonrası için yapılır (GN15); eşik, gerçek yükün en yoğun yüzde onunu ayıran değerdir (GN16); sınanan ortalama pencereleri 15, 60 ve 300 saniyedir (GN17); süreç başına bellek pencere boyunca sabittir (GN18).
Kâhin, her saniyedeki gerçek yüktür; kurguyu biz ürettiğimiz için saniye saniye biliniyor. Araç çıktısı, aynı yükün belirli bir pencereyle ortalanmış hâlidir. Tanı, “sistem şu anda en yoğun durumunda” kararıdır. Yanlış tanı, göstergenin bu kararı kaçırdığı saniye sayısıdır.
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 KULLANICI = ("kok", "uygulama", "yedek", "izleme") KOMUT = ("veri-alici", "rapor-uretici", "yedek-gorevi", "olcum-toplayici", "kuyruk-isleyici", "onbellek-temizleyici") def surecler(tohum=TOHUM, sayi=24): """Her surec: gercek islemci kullanimi bir ZAMAN DIZISIDIR , tek sayi degil.""" r = uretec(tohum) liste = [] for i in range(sayi): tur = r(10) if tur < 5: desen = "duz" # surekli dusuk kullanim elif tur < 8: desen = "ani" # kisa ve yuksek sicramalar else: desen = "agir" # surekli yuksek kullanim liste.append({ "pid": 1000 + i * 7 + r(5), "kullanici": KULLANICI[r(len(KULLANICI))], "komut": KOMUT[r(len(KOMUT))], "desen": desen, "oncelik": r(11) - 5, "bellek": 20 + r(400), "sinyal_yok_sayar": r(10) < 2, # bazi surecler sonlandirmayi yoksayar }) return liste def kullanim(surec, saniye): """Gercek islemci kullanimi , saniye saniye. Kahin bunu bilir; arac bilmez.""" d = surec["desen"] if d == "duz": return 3 + (surec["pid"] + saniye) % 4 if d == "agir": return 60 + (surec["pid"] + saniye) % 25 # ani: her 60 saniyede bir 5 saniyelik sicrama faz = (saniye + surec["pid"]) % 60 return 88 + faz if faz < 5 else 2 + faz % 3 def gercek_yuk(surecler_, saniye): return sum(kullanim(s, saniye) for s in surecler_) def yuk_ortalamasi(surecler_, saniye, pencere=60): """Yuk ortalamasi GECIKMELI bir gostergedir: gecmis pencereyi ortalar.""" bas = max(0, saniye - pencere) dilim = range(bas, saniye + 1) return round(sum(gercek_yuk(surecler_, t) for t in dilim) / len(list(dilim)) / 100, 2) def bellek_payi(surecler_): """GN18: arac 'en cok bellek kullanan bes surec' listeler. Ne kadarini acikliyor.""" b = sorted((s["bellek"] for s in surecler_), reverse=True) kum, kac = 0, 0 for v in b: kum, kac = kum + v, kac + 1 if kum / sum(b) >= 0.20: break return {"toplam": sum(b), "en_buyuk_pay": round(b[0] / sum(b), 4), "ilk_bes_pay": round(sum(b[:5]) / sum(b), 4), "yuzde_20_icin": kac} for tohum in (TOHUM, 20260219): S = surecler(tohum) ara = range(60, DONEM) # GN15: pencere dolduktan sonrasi anlik = {t: gercek_yuk(S, t) / 100 for t in ara} sirali = sorted(anlik.values()) esik = sirali[int(len(sirali) * 0.9)] # GN16 kahin: en yogun yuzde on print("tohum", tohum, f"| anlik yuk {min(anlik.values()):.2f}-{max(anlik.values()):.2f}" f" | esik {esik:.2f} | esigi asan saniye" f" {sum(1 for v in anlik.values() if v >= esik)}") print(" saniye 0/60/300 anlik:", [round(anlik.get(t, gercek_yuk(S, t) / 100), 2) for t in (0, 60, 300)], "| ortalama(60):", [yuk_ortalamasi(S, t) for t in (0, 60, 300)]) print(" pencere en dusuk en yuksek esigi asan kacirilan yanlis alarm") for p in (15, 60, 300): # GN17 seri = {t: yuk_ortalamasi(S, t, p) for t in ara} kacan = sum(1 for t in ara if anlik[t] >= esik and seri[t] < esik) fazla = sum(1 for t in ara if seri[t] >= esik and anlik[t] < esik) print(f" {p:7d} {min(seri.values()):8.2f} {max(seri.values()):9.2f}" f" {sum(1 for v in seri.values() if v >= esik):10d}" f" {kacan:9d} {fazla:12d}") print(" bellek:", bellek_payi(S))
tohum 20260218 | anlik yuk 5.36-7.80 | esik 7.15 | esigi asan saniye 54
saniye 0/60/300 anlik: [7.36, 7.31, 7.36] | ortalama(60): [7.36, 6.25, 6.22]
pencere en dusuk en yuksek esigi asan kacirilan yanlis alarm
15 5.62 6.80 0 54 0
60 6.18 6.25 0 54 0
300 6.13 6.29 0 54 0
bellek: {'toplam': 4876, 'en_buyuk_pay': 0.0779, 'ilk_bes_pay': 0.3659, 'yuzde_20_icin': 3}
tohum 20260219 | anlik yuk 4.04-6.29 | esik 6.04 | esigi asan saniye 54
saniye 0/60/300 anlik: [4.33, 4.33, 4.33] | ortalama(60): [4.33, 4.85, 4.85]
pencere en dusuk en yuksek esigi asan kacirilan yanlis alarm
15 4.52 5.23 0 54 0
60 4.83 4.90 0 54 0
300 4.80 4.88 0 54 0
bellek: {'toplam': 5444, 'en_buyuk_pay': 0.0755, 'ilk_bes_pay': 0.3611, 'yuzde_20_icin': 3}
Çıktının Söylediği ile Sistemin Gerçeği
Üç sayı yan yana durur. Kâhin: gerçek yük 5,36 ile 7,80 arasında dalgalanıyor ve 54 saniye boyunca 7,15 eşiğinin üstünde kalıyor. Araç çıktısı: altmış saniyelik ortalama 6,18 ile 6,25 arasında; eşiği hiç aşmıyor. Yanlış tanı: 54. Sistemin en yoğun olduğu her saniyede gösterge “olağan” diyor.
Yanlış alarm sayısı sıfırdır ve bu, göstergenin sessiz kalmasını daha da tehlikeli yapar. Gösterge gürültülü olsaydı operatör ona güvenmemeyi öğrenirdi; bu gösterge yanılmıyor, yalnız hiç konuşmuyor. Ortalanmış bir seri yanlış alarm üretmez, çünkü sıçramaları zaten üretmez.
Eşiğin nereden geldiği de açıkça durmalıdır. Burada eşik dışarıdan seçilmiş bir sayı değil, gerçek yükün en yoğun yüzde onunu ayıran değerdir; yani tanım gereği 54 saniye onu aşar. Ölçülen şey eşiğin doğru seçilip seçilmediği değil, aynı olayı ortalanmış bir seriden görmenin mümkün olup olmadığıdır. Yanıt olumsuzdur ve eşiği düşürmek durumu düzeltmez: eşik ortalamanın bandının içine indirildiğinde gösterge bu kez sürekli aşar ve hiçbir saniyeyi diğerinden ayırt edemez.
Şablonun ikinci satırı gecikmeyi doğrudan gösterir. Sıfırıncı saniyede anlık yük 7,36’dır ve ortalama da 7,36’dır: pencere henüz dolmadığı için ikisi aynıdır. Altmışıncı saniyede anlık 7,31 iken ortalama 6,25’e düşmüştür, üç yüzüncü saniyede anlık yine 7,36 iken ortalama 6,22’dedir. Aynı andaki iki sayı arasındaki fark bir hata değildir; ikisi farklı şeyleri ölçer. Sorun, ikisinin aynı ad altında sunulmasıdır.
Pencere genişliğinin etkisi de tablodan okunur. Anlık yükün genişliği 2,44 birimdir (5,36’dan 7,80’e). On beş saniyelik ortalamada bu genişlik 1,18’e, altmış saniyelikte 0,07’ye iner. Üç yüz saniyelik pencerede 0,16’ya çıkar, ama eşiği yine hiç aşmaz; genişlemenin nedeni pencere uzunluğu değil, pencerenin dolmadığı ilk saniyelerdir. Altmış saniyelik pencerenin en düz seriyi vermesinin nedeni ise kurgudaki sıçramaların altmış saniyelik dönemle yinelenmesidir: pencere, dönemin tam bir katını kapsadığında sıçramayı her seferinde aynı ölçüde seyreltir.
Bu, gerçek makinelerde de karşılaşılan bir durumdur. Yinelenen bir iş — zamanlanmış bir görev, bir toplu aktarım, bir önbellek temizliği — ortalama penceresiyle aynı ritimde çalışıyorsa göstergede hiç iz bırakmaz. Görünmezliğin nedeni işin küçük olması değil, ritmin örtüşmesidir.
Buradan çıkan kural şudur: yük ortalaması bir sıçrama göstergesi değil, bir eğilim göstergesidir. “Şu anda ne oluyor” sorusuna yanıt vermez; “son bir dakikada genel gidiş neydi” sorusuna verir. Süreç yönetimi konusunda örnekleme aralığı için ölçülen şey burada ortalama penceresi için tekrarlanır: gösterge yalan söylemiyor, sorulan soru başka.
Üç Pencere Yan Yana
Yük ortalamasının üç pencereyle sunulmasının bir nedeni vardır: tek bir sayı düzeyi verir, üç sayı yönü verir. Kısa pencere uzundan büyükse yük artıyordur; küçükse azalıyordur; üçü birbirine yakınsa durum durağandır. Bu okuma, ortalamanın gecikmesini ortadan kaldırmaz, ama gecikmenin işaretini görünür kılar.
Yönün kendisi de tanıyı belirler. Yükselen bir eğilimde asıl soru “şu anki değer eşiği aştı mı” değil, “bu hızla ne zaman aşacak” sorusudur. Düşen bir eğilimde yüksek bir değer, geçmiş bir olayın kalıntısıdır ve ona tepki vermek, çoktan bitmiş bir arızayı kovalamak demektir. Bu ikinci durum operasyonda sık görülür: gösterge yüksek okunur, inceleme başlar ve incelemenin sonuna gelindiğinde gösterge kendiliğinden inmiştir; kimse ne olduğunu öğrenemez.
Üç pencereli okumanın sınırı da ölçüde durur. Kurgudaki sıçramalar beş saniye sürüyor; en kısa pencere on beş saniye. Beş saniyelik bir olay, on beş saniyelik ortalamada üçte birine iner ve üç pencerenin hiçbirinde yön değiştirecek kadar iz bırakmaz. Yön okuması, olayın en kısa pencereden uzun sürmesini gerektirir.
Kısa süren olayları görmenin yolu ortalamayı okumak değil, ortalanmamış bir sayacı okumaktır: çalıştırılabilir süreç sayısı, bağlam değiştirme sayısı ve kesme sayısı her okumada anlık değer verir. Bu sayaçlar gürültülüdür ve tek bir okumaları yanıltıcıdır, ama gecikmezler. Gecikmesiz ve gürültülü bir sayaç ile gecikmeli ve düzgün bir ortalama arasındaki seçim, bu dersin asıl kararıdır; ikisini birden veren bir gösterge yoktur.
Bellek ve Disk Göstergeleri
Bellek göstergesinin tuzağı farklıdır. Bir araç “en çok bellek kullanan beş süreç” listeler ve o liste okunması en kolay çıktıdır. Ölçüde bu listenin ne kadarını açıkladığı sayılıyor: en büyük süreç toplam belleğin yalnız yüzde 7,79’unu tutuyor, ilk beş süreç birlikte yüzde 36,59’unu. Kalan on dokuz süreç yüzde 63’ü tutuyor ve hiçbiri listede yok. “En büyük süreci sonlandır” kararı toplamın yüzde sekizinden azını geri kazandırır; yüzde yirmi boşaltmak için üç süreç gerekir. Liste yanlış değildir; yalnız sorulan soruyu yanıtlamaz. “Belleği kim tüketiyor” sorusunun yanıtı bu kurguda tek bir ad değil, uzun bir kuyruktur.
İkinci tuzak, işletim sisteminin boş belleği boş bırakmamasıdır. Okunmuş dosyalar önbellekte tutulur ve gerektiğinde bırakılır; bu bellek “kullanılıyor” görünür ama baskı üretmez. Yalnız kullanılan yüzdeye bakan bir tanı, sağlıklı bir makineyi dolu sanır. Ayırt edici gösterge kullanım yüzdesi değil, geri kazanılabilir olmayan kısımdır.
Üçüncü tuzak, süreç başına raporlanan belleğin toplanamaz olmasıdır. Paylaşılan kütüphaneler ve paylaşılan sayfalar her sürecin kendi satırında ayrı ayrı sayılır; süreç satırlarını toplayan bir hesap, makinede olandan fazla bellek bulur. Süreç listesinden çıkarılan toplam, sistem düzeyindeki toplamla karşılaştırılmadan kullanılmamalıdır.
Disk tarafında da benzer bir ikilik vardır ve bu konunun kapsamını aşar. Doluluk yüzdesi tek bir sayıdır, oysa bir dosya sisteminde birbirinden bağımsız iki sınır tükenir ve ikisi aynı hata iletisini üretir. Depolama konusu bu ayrımı ölçecek; şimdilik bilinmesi gereken, doluluk yüzdesinin düşük olmasının yazmanın başarılı olacağını garanti etmediğidir.
Disk göstergesinin bir başka özelliği de ölçüm anına duyarsız olmasıdır. Yük saniyeler içinde değişir, doluluk saatler içinde. Bu, disk göstergesini daha güvenilir yapmaz; yalnız farklı bir gecikme türü verir. Dolan bir diskte tehlikeli olan mevcut yüzde değil, doluşun hızıdır; tek bir okumadan hız çıkarılamaz ve iki okuma arasındaki fark alınmadıkça gösterge, arızaya kaç saat kaldığını söylemez.
İkinci Tohum
İkinci tohumda kurgunun yük düzeyi düşer: anlık yük 4,04 ile 6,29 arasında dalgalanır ve eşik 6,04’e iner. Sayılar değişse de yapı aynı kalır — gerçek yük eşiği yine 54 saniye boyunca aşar, ortalanmış göstergeler eşiği yine hiç aşmaz ve yanlış tanı yine 54 olur. Altmış saniyelik ortalamanın genişliği 0,07 birimde kalır. Eşiğin ve yükün mutlak değeri kurguya bağlıdır; kurguya bağlı olmayan şey, ortalamanın sıçramayı tümüyle bastırması ve yanlış alarm sayısının sıfır olmasıdır.
Özet
- Yük ortalaması bir yüzde değil, sıraya girmiş iş miktarının bir pencere boyunca ortalamasıdır; yorumu çekirdek sayısına bağlıdır.
- Gerçek yük eşiği 54 saniye boyunca aşarken altmış saniyelik ortalama onu hiç aşmıyor; yanlış tanı 54, yanlış alarm 0.
- Anlık yükün 2,44 birimlik genişliği altmış saniyelik ortalamada 0,07’ye iner; pencereyi büyütmek göstergeyi yatıştırır ve yatışmış gösterge sıçrama gösteremez.
- En çok bellek kullanan süreç toplamın yalnız yüzde 7,79’unu tutar; ilk beş süreç yüzde 36,59’unu tutar, yüzde yirmi boşaltmak için üç süreç gerekir.
- Yük ortalaması bir eğilim göstergesidir; “şu anda ne oluyor” sorusuna yanıt veremez ve vermeye zorlandığında sessiz kalır.
Sonraki Adım
Bu dersin göstergeleri sistemin bütününü tek sayıya indiriyordu ve indirgeme sıçramayı yiyordu. Bir başarım sorunu incelenirken sorulan soru daha da özeldir: yavaşlığın nedeni işlemci mi, disk mi, bellek mi. Üç neden çoğu araç çıktısında birbirine çok benzer görünür ve ayrıntı düzeyini yükseltmek benzerliği azaltmaz. Sonraki ders üç darboğaz türünü ayırmayı ele alır ve dört kat daha çok satır üreten bir görüntünün yanlış tanı sayısını hiç değiştirmediğini, üç satırlık bir görüntünün ise değiştirdiğini sayar.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.