Ders 15 / 22
Başarım Sorunlarının İzi
İşlemci, girdi/çıktı ve bellek darboğazlarının ayrılması: dört kat daha çok satır üreten bir görüntü 18 olayın yine 12'sinde yanılıyor, üç satırlık bir görüntü 2'ye iniyor ve aynı üç ölçünün okunma sırası kalan iki yanılgıyı da kaldırıyor.
İçindekiler
Önceki ders bir makinenin durumunu tek sayılara indiren göstergeleri ele aldı ve indirgemenin sıçramayı yediğini ölçtü. Orada kalan bir açık vardı: yük ortalaması işlemci bekleyen süreçlerle diski bekleyen süreçleri aynı sayının içinde topluyordu. Bir makine yavaşladığında sorulan soru tam olarak o toplamı ayırmayı gerektirir: yavaşlığın nedeni işlemci mi, disk mi, bellek mi.
Bu ders üç darboğaz türünü ayırmayı ele alır. Beklenen çözüm daha ayrıntılı bir çıktıdır: daha çok sütun, daha çok satır, daha ince ayrıntı. Ölçülen şey bu beklentinin doğru olup olmadığıdır ve kursun ikinci iddiası burada ödenir: daha çok çıktı daha iyi tanı demek değildir.
Beklentinin nereden geldiği de anlaşılırdır. Bir arıza karşısında elde olan tek denetim düğmesi çoğunlukla ayrıntı düzeyidir: daha uzun liste, daha ince kırılım, daha sık örnekleme. Bunların hepsi çıktıyı büyütür ve büyüyen çıktı, çabanın arttığı duygusunu verir. Ölçü bu duyguyu sınar ve sonuç açıktır: çabanın yönü yanlışsa miktarı sonucu değiştirmez.
Üç Darboğaz ve Ortak Belirtileri
Bir makinenin yavaşlaması üç mekanizmadan doğabilir ve üçü kullanıcıya aynı görünür.
İşlemci darboğazında çalıştırılabilir süreç sayısı işlemci sayısını aşar; süreçler sıraya girer, her biri kendi payını bekler. İşlemci meşgul yüzdesi yüksektir ve bu yüksekliğin karşılığı gerçek iştir.
Girdi/çıktı darboğazında süreçler işlemciyi değil diski bekler. Beklerken kesintisiz bekleme durumundadırlar; işlemciyi tüketmezler ama sayılırlar. İşlemci tarafında görünen şey bekleme payıdır: işlemci boştur, ama boş olmasının nedeni yapacak iş kalmaması değil, verinin gelmemesidir. Meşguliyeti bekleme payını da içine katarak raporlayan bir görüntü, bu durumu işlemci darboğazından ayıramaz.
Bellek darboğazında fiziksel bellek yetmez ve sayfalar takas alanına taşınır. Buradaki tuzak iki katlıdır. Birincisi, takas hareketi kendisi bir disk işidir; yoğun takas girdi/çıktı beklemesi üretir ve bellek darboğazı disk darboğazı gibi görünür. İkincisi, bellek göstergeleri baskı anında değil, baskı geçtikten sonra da yüksek kalır: takasa çıkmış sayfalar geri çağrılmadıkça orada durur.
Dördüncü bir olasılık daha vardır ve bu üçlünün dışında kalır: darboğaz makinenin kendisinde değil, beklediği bir karşı tarafta olabilir. Bir ağ isteğini bekleyen süreç de yavaştır, ama üç ölçünün hiçbirinde iz bırakmaz; işlemci boş, disk boş, bellek rahattır. Bu ders o durumu ölçmez ve o durum, üç ölçünün “hepsi olağan” dediği hâlde makinenin yavaş olduğu tek senaryodur. Ağ tarafındaki tanı bir sonraki kursun konusudur.
İşletim Sistemi Kavramları kursu sayfalı belleğin ve çizelgelemenin mekanizmasını kurdu; burada tekrarlanmaz. Buradaki soru mekanizma değil, operatörün hangi çıktıdan hangi mekanizmayı okuyabildiğidir. Aynı ayrım kursun açılışında kurulmuştu: bir soyutlamanın bedelini ölçmekle, operatörün o soyutlamayı görüp göremediğini ölçmek iki ayrı iştir.
Beş Görüntü
Ölçüde beş ayrı görüntü karşılaştırılıyor ve her biri farklı sayıda satır üretiyor.
A — süreç listesi. Yirmi dört satır, tek anlamlı sütun: süreç başına işlemci yüzdesi. En yaygın ilk bakıştır.
B — iplik ayrıntısı. Aynı liste, iş parçacığı düzeyinde açılmış: doksan altı satır. Dört kat daha çok çıktı, aynı sütunlar. Ayrıntı düzeyi yükselmiştir, ölçü kümesi değişmemiştir.
C — A artı bekleme sütunu. Yine yirmi dört satır, ama listeye süreç başına girdi/çıktı bekleme payı eklenmiş. Satır sayısı A ile aynı, ölçü kümesi bir birim büyük.
D — üç sistem ölçüsü. Üç satır: işlemci meşguliyeti, bekleme payı, takas hareketi. Süreç başına hiçbir ayrıntı yok.
E — aynı üç ölçü, farklı okuma sırası. D ile birebir aynı üç satır; tek fark, hangi ölçünün önce sorulduğudur. D bekleme payına önce bakar, E takas hareketine.
Aşağıdaki döküm örnektir ve çalıştırılmamıştır; D görüntüsünün taşıdığı üç ölçüyü gösterir.
# ornek dokum , calistirilmis degildir $ vmstat 1 1 r b takas bos ... si so ... us sy id wa 4 6 102400 81920 ... 38 44 ... 61 12 5 22
Bu Üç Ölçü Nereden Okunur
Üç ölçünün her biri ayrı bir sayaçtan gelir ve hangi araçla okundukları ikincil bir sorudur; önemli olan sayacın kendisidir.
İşlemci meşguliyeti çekirdeğin tuttuğu zaman kovalarından hesaplanır: kullanıcı kipinde geçen süre, çekirdek kipinde geçen süre, boşta geçen süre ve bekleyerek geçen süre. Bu kovalar açılıştan beri artan birikimli sayaçlardır; anlık yüzde, iki okuma arasındaki farktan çıkar. Tek bir okuma açılıştan beri olan ortalamayı verir ve o ortalama, bir arıza sırasında neredeyse hiçbir şey söylemez. Bu, önceki dersteki gecikme sorununun başka bir biçimidir: sayacın kendisi gecikmez, ama tek okuma her şeyi ortalar.
Bekleme payı aynı kovalardan birinin adıdır ve tam olarak “işlemci boştaydı, ama en az bir süreç diski bekliyordu” anlamına gelir. İki uyarı gerekir. Birincisi, bu bir süre ölçüsüdür, bir kuyruk ölçüsü değil; kaç sürecin beklediğini söylemez. İkincisi, işlemci gerçekten meşgulse bekleme payı düşük okunur, çünkü işlemcinin boş kaldığı zaman yoktur. Yani işlemci ve disk aynı anda darboğaza girdiğinde bekleme payı sorunun büyüklüğünü küçümser.
Takas hareketi iki yönlü sayılır: belleğe geri okunan sayfa ve diske yazılan sayfa. Ayrım önemlidir. Diske yazma tek başına baskı kanıtı değildir; işletim sistemi uzun süredir dokunulmamış sayfaları rahatken de dışarı taşıyabilir. Baskının kanıtı, sayfaların geri okunmasıdır: kullanılan bir sayfa dışarı atıldı ve hemen geri istendi. Yalnız takas alanının dolu görünmesine bakan bir tanı, geçmişte olmuş ve bitmiş bir baskıyı şimdiki zamanda arar.
Ölçülen Şey: Satır Sayısı mı, Ölçü Kümesi mi
Kurgunun varsayımları: on sekiz olay üretilir ve her olayın tek bir gerçek nedeni vardır (GN19); üç ölçünün bantları nedenden türetilir (GN20); takas hareketi altmışın üstüne çıktığında bellek baskısı girdi/çıktı beklemesi de üretir (GN21); görüntülerin olay başına satır sayıları 24, 96, 24, 3 ve 3’tür (GN22); karar eşikleri işlemci için 60, bekleme için 25, takas için 20’dir (GN23).
Kâhin, kurguya yerleştirilen on sekiz olayın gerçek darboğaz nedenidir. Araç çıktısı, beş görüntünün ürettiği satır sayısıdır. Tanı, her görüntünün kendi ölçülerinden çıkardığı nedendir; yanlış tanı, gerçek nedenden farklı çıkan tanı sayısıdır.
TOHUM = 20260218 def uretec(tohum): d = tohum def sonraki(n): nonlocal d d = (d * 1103515245 + 12345) % 2147483648 return d % n return sonraki NEDEN = ("islemci", "girdi-cikti", "bellek") def darbogazlar(tohum=TOHUM, sayi=18): """GN19 KAHIN: her olayin tek gercek darbogazi. GN20: uc olcu nedenden turetiliyor. GN21: takas 60'i asinca bellek baskisi bekleme de uretir.""" r = uretec(tohum) olay = [] for i in range(sayi): n = NEDEN[r(3)] if n == "islemci": islemci, takas, bekleme = 78 + r(18), r(3), 2 + r(4) elif n == "girdi-cikti": islemci, takas, bekleme = 74 + r(20), r(3), 46 + r(28) else: islemci, takas = 52 + r(30), 34 + r(40) bekleme = 30 + r(20) if takas >= 60 else 6 + r(9) olay.append({"no": i + 1, "neden": n, "islemci": islemci, "bekleme": bekleme, "takas": takas}) return olay def gorunum_a(o): """GN23 esikleri. Surec listesi , tek olcu: islemci yuzdesi.""" return "islemci" if o["islemci"] >= 60 else "bellek" def gorunum_c(o): """Ayni liste , bir sutun daha: bekleme.""" if o["bekleme"] >= 25: return "girdi-cikti" return "islemci" if o["islemci"] >= 60 else "bellek" def gorunum_d(o): """Uc sistem olcusu , bekleme once okunuyor.""" if o["bekleme"] >= 25: return "girdi-cikti" return "bellek" if o["takas"] >= 20 else "islemci" def gorunum_e(o): """Ayni uc olcu , takas once okunuyor.""" if o["takas"] >= 20: return "bellek" return "girdi-cikti" if o["bekleme"] >= 25 else "islemci" GORUNUM = (("A surec listesi", gorunum_a, 24), # GN22: satir/olay ("B iplik ayrintisi", gorunum_a, 96), ("C A + bekleme sutunu", gorunum_c, 24), ("D uc sistem olcusu", gorunum_d, 3), ("E ayni uc olcu , takas once", gorunum_e, 3)) for tohum in (TOHUM, 20260219): O = darbogazlar(tohum) print("tohum", tohum, "| olay", len(O), "|", {n: sum(1 for o in O if o["neden"] == n) for n in NEDEN}) print(" gorunum satir/olay toplam satir yanlis tani") for ad, f, satir in GORUNUM: y = sum(1 for o in O if f(o) != o["neden"]) print(f" {ad:28s} {satir:10d} {satir * len(O):13d} {y:12d}/{len(O)}")
tohum 20260218 | olay 18 | {'islemci': 4, 'girdi-cikti': 4, 'bellek': 10}
gorunum satir/olay toplam satir yanlis tani
A surec listesi 24 432 12/18
B iplik ayrintisi 96 1728 12/18
C A + bekleme sutunu 24 432 8/18
D uc sistem olcusu 3 54 2/18
E ayni uc olcu , takas once 3 54 0/18
tohum 20260219 | olay 18 | {'islemci': 7, 'girdi-cikti': 6, 'bellek': 5}
gorunum satir/olay toplam satir yanlis tani
A surec listesi 24 432 11/18
B iplik ayrintisi 96 1728 11/18
C A + bekleme sutunu 24 432 5/18
D uc sistem olcusu 3 54 2/18
E ayni uc olcu , takas once 3 54 0/18
Çıktının Söylediği ile Sistemin Gerçeği
Üç sayı yan yana durur. Kâhin: on sekiz olayın dördü işlemci, dördü girdi/çıktı, onu bellek kaynaklıdır. Araç çıktısı: görüntüler sırasıyla 432, 1728, 432, 54 ve 54 satır üretiyor. Yanlış tanı: 12, 12, 8, 2 ve 0.
Birinci satır ile ikinci satır karşılaştırıldığında iddia ödenmiş olur. B görüntüsü A’nın tam dört katı satır üretiyor — 432 yerine 1728 — ve yanlış tanı sayısı hiç değişmiyor: on ikide kalıyor. Ayrıntı düzeyini yükseltmek okunacak metni büyüttü, tanıyı zerre kadar düzeltmedi. Sebep açıktır: iş parçacığı kırılımı aynı ölçünün daha ince dilimlenmiş hâlidir ve bir ölçünün daha ince dilimlenmesi, o ölçünün göremediği şeyi göremez.
Üçüncü satır ayrımı yapan şeyi gösterir. C görüntüsü B’nin dörtte biri kadar satır üretir — A ile aynı, 432 — ama yanlış tanı 12’den 8’e iner. Kazancı sağlayan şey satır sayısı değil, listeye eklenen tek bir sütundur: bekleme payı. Dört yanlış tanının düzelmesi, girdi/çıktı darboğazlarının işlemci darboğazından ayrılabilmesinden gelir.
Dördüncü satır bunu uca taşır. D görüntüsü 54 satır üretir; B’nin otuz ikide biri. Yanlış tanı 2’ye iner. Süreç başına hiçbir ayrıntı taşımayan üç satır, süreç başına doksan altı satır taşıyan görüntüden altı kat daha iyi tanı verir. Ölçünün adı budur: ayıran şey satır sayısı değil, hangi ölçüye bakıldığıdır.
C ile D arasındaki fark ayrıca ölçeğin yerini gösterir. C süreç başına bakar ve “hangi süreç” sorusunu yanıtlayabilir; D sistem geneline bakar ve o soruyu yanıtlayamaz. Yine de D daha az yanılır, çünkü sorulan soru “hangi süreç” değil “hangi kaynak” sorusudur. İki soru sık sık birbirine karıştırılır: yavaşlığın kaynağını bulmadan en çok kaynak tüketen süreci aramak, çoğu zaman kurbanı bulmakla sonuçlanır. Bellek baskısı altındaki bir makinede en çok bekleyen süreç, baskıyı yaratan süreç değildir; en çok etkilenendir.
Görüntü seçiminin bir de sıra sonucu vardır. Doğru sıralama önce sistem geneline, sonra sürece bakmaktır: D “bellek” der, ardından süreç listesi belleğe göre sıralanır ve suçlu aranır. Ters sıralama — önce süreç listesi, sonra sistem ölçüsü — ölçüde A satırıyla temsil ediliyor ve on sekiz olayın on ikisinde yanlış yola sapıyor.
Kalan İki Yanılgı ve Okuma Sırası
Beşinci satır kalan payı ödüyor. E görüntüsü D ile birebir aynı üç ölçüyü taşır; tek fark, hangisinin önce sorulduğudur. D bekleme payına önce bakar ve yüksek beklemeyi gördüğünde “girdi/çıktı” der. E takas hareketine önce bakar ve yüksek takası gördüğünde “bellek” der. Yanlış tanı D’de 2, E’de 0.
Farkı üreten olaylar, takası altmışın üzerine çıkan bellek darboğazlarıdır. Orada takas hareketinin kendisi disk işi yarattığı için bekleme payı da yükselir; iki ölçü aynı anda yüksektir ve hangisinin önce okunduğu tanıyı belirler. Bekleme payı bir sonuçtur, takas hareketi bir nedendir; sonucu önce okuyan sıralama nedeni gölgeler.
Buradan işletim tarafında bir kural çıkar: aynı anda yüksek okunan iki ölçü arasında nedensel yön bilinmiyorsa, ölçü kümesini büyütmek yetmez. Yalnız üç sayıya bakan bir operatör bile, yanlış sırayla bakarsa on sekiz olayın ikisinde yanılır. Ölçü kümesi tanının tavanını belirler; okuma sırası o tavana ulaşıp ulaşılmayacağını belirler.
Sıralamanın hangi ölçüyle başlayacağına karar vermenin genel bir yolu vardır: zincirde en yukarıdaki ölçü önce okunur. Takas hareketi bellek baskısının doğrudan sonucudur ve başka bir nedenden doğmaz; bekleme payı ise hem disk yavaşlığından hem takastan hem de sıradan bir toplu okumadan doğabilir. Birden çok nedeni olan bir ölçü, tek nedeni olan bir ölçüden sonra okunur. Bu kural kurguya özgü değildir; birbirini besleyen göstergelerin bulunduğu her ölçü kümesinde işler.
Karar ağacının bir maliyeti de vardır. Üç ölçüyü sabit bir sırayla okuyan bir yordam, gerçekte iki darboğazın aynı anda bulunduğu durumu tek bir nedene indirger; ilk eşleşen dalda durur ve ikinci nedeni hiç raporlamaz. Ölçüde bu görünmez, çünkü kurguda her olayın tek bir gerçek nedeni vardır. Gerçek bir makinede tanının tek bir ada indirgenmesi, kendisi bir yanlış tanı türüdür.
Ölçünün sınırı da açıkça yazılmalıdır. E’nin sıfırı kurgunun tam ayrılabilir olmasından gelir; gerçek bir makinede üç ölçünün her olayı ayırması beklenmez. Anlamlı olan sıfır değil, 12’den 0’a inen sıradır: satır sayısını dört katına çıkarmak hiçbir şey kazandırmadı, doğru ölçüyü eklemek dört yanılgı, ölçü kümesini daraltıp doğrultmak on yanılgı, sıralamayı düzeltmek kalan iki yanılgıyı kaldırdı.
İkinci Tohum
İkinci tohumda olayların dağılımı değişir: yedi işlemci, altı girdi/çıktı, beş bellek. A ve B görüntüleri yine birbirinin aynı sayıyı verir — on birer yanlış tanı — ve satır sayısı farkı yine hiçbir şey değiştirmez. C 5’e, D 2’ye, E 0’a iner. Mutlak sayılar kurguya bağlıdır; kurguya bağlı olmayan şey, satır sayısını dört katına çıkarmanın yanlış tanıyı hiç değiştirmemesi ve üç satırlık görüntünün doksan altı satırlık görüntüyü her iki tohumda da geçmesidir.
Özet
- Üç darboğaz türü aynı belirtiyi üretir; bellek baskısı takas yüzünden girdi/çıktı beklemesi de yaratır ve disk darboğazı gibi görünür.
- Satır sayısını dört katına çıkarmak (432’den 1728’e) yanlış tanı sayısını hiç değiştirmiyor: her iki tohumda da aynı kalıyor.
- Listeye tek bir doğru sütun eklemek yanlış tanıyı 12’den 8’e, süreç ayrıntısını atıp üç sistem ölçüsüne inmek 2’ye indiriyor.
- Aynı üç ölçünün okunma sırasını değiştirmek kalan iki yanılgıyı da kaldırıyor; bekleme payı bir sonuçtur, takas hareketi bir nedendir.
- Tanıyı belirleyen şey çıktının hacmi değil, ölçü kümesi ve o kümenin okunma sırasıdır.
Sonraki Adım
Bu konu boyunca ölçülen şey, bir makinenin kendi hakkında ürettiği metnin ve sayının gerçeği ne kadar taşıdığıydı: birim dosyasına bakan tanı altıda beş yanıldı, döndürme 86 hatanın 81’ini sildi, ortalanmış gösterge 54 saniyelik sıçramayı hiç göstermedi ve dört kat çıktı hiçbir yanılgıyı düzeltmedi. Bütün bu ölçülerin sessiz varsayımı, verinin diske yazılabildiğiydi. Sonraki konu o varsayımı kaldırır ve depolamaya iner: blok aygıtları, bölümler, dosya sistemleri ve bir dosya sisteminin birbirinden bağımsız tükenen iki sınırı. Orada disk yüzde bir dolu olduğu hâlde yazmanın başarısız olduğu durum sayıyla gösterilir.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.