Ders 21 / 22
Takas Alanı
Baskı 84 saniye sürüyor ama kullanılan takas göstergesi 272 saniye boyunca yersiz uyarı veriyor, boş bellek 451 saniye; takas alanı büyüdükçe kapatılabilirlik tanısı 44 yanlıştan 354 yanlışa çıkıyor.
İçindekiler
Önceki dersler depolamayı yalnız veri tutan bir katman olarak ele aldı: bölümler, dosya sistemleri, takma noktaları ve mantıksal birimler. Aynı blok aygıtının bir bölümü ise hiç dosya tutmaz ve hiçbir takma noktasında görünmez. O bölüm, bellek yetmediğinde sayfaların yazıldığı yerdir.
Bu dersin sorusu depolamanın değil, görmenin sorusudur: takas kullanımı hangi göstergede ne kadar geç görünür. Cevap tek yönlü çıkmayacak. Bazı göstergeler baskıyı geç haber veriyor, biri baskı geçtikten sonra da haber vermeye devam ediyor ve biri baskı hiç yokken bile bağırıyor.
Takas Alanı ve Ne Olmadığı
Takas alanı (swap), fiziksel belleğe sığmayan sayfaların yazıldığı disk alanıdır. Bir bölüm olabilir, bir dosya olabilir; ikisi de aynı biçimde biçimlendirilir ve aynı biçimde etkinleştirilir. Dosya biçimi sonradan eklenip kaldırılabildiği için esnektir, bölüm biçimi ise dosya sisteminin durumundan bağımsız olduğu için sadedir. Aradaki fark bir üstünlük sıralaması değil, bir yönetim tercihidir.
Sayfalı belleğin mekanizması İşletim Sistemi Kavramları kursunda ölçüldü: sanal sayfanın fiziksel sayfaya çevrilmesi, sayfa hatası ve sayfa değiştirme yordamı orada tanımlıdır ve burada tekrarlanmaz. Bu ders yalnız operatörün görebildiğini sayar.
Görülebilen şey birkaç sayıdır: takas alanının toplam boyu, kullanılan bölümü, saniye başına
takasa yazılan ve takastan okunan sayfa, boş bellek ve kullanılabilir bellek. Bunlar
swapon --show, free ve bellek istatistiklerini tutan dosya üzerinden okunur. Aşağıdaki
döküm biçimi gösteren bir örnek dökümdür; çalıştırılmamıştır ve bu derste hiçbir sayı
iddiası buradan gelmez.
NAME TYPE SIZE USED PRIO
/dev/sdb4 partition 4G 1.2G -2
total used free shared buff/cache available
Mem: 7.6G 4.1G 160M 88M 3.3G 3.1G
Swap: 4.0G 1.2G 2.8G
Dökümdeki free ile available sütunlarının ayrı olması bu dersin birinci ölçümünün
konusudur: biri geri alınabilir önbelleği boş saymaz, öteki sayar.
Dört Gösterge, Dört Ayrı Yanılma
Ölçüm, kurgu sunucuda 600 saniyelik bir pencerede yapılıyor. Rapor üreten birim iki yüzüncü saniyeden itibaren yavaş yavaş büyüyor, üç yüz yirminci saniyede işini bitiriyor; dört yüz sekseninci saniyede kısa ve sert bir sıçrama daha var.
- DP32 — Fiziksel bellek 1200 sayfadır, olağan yerleşik talep 900 sayfadır. Baskı, talebin fiziksel belleği aştığı saniyedir ve kâhin bunu bilir.
- DP33 — Takasa yazılan sayfa orada kalır; geri okunana kadar kullanılan takas azalmaz. Bu, ölçümün ekseni olan davranıştır.
- DP34 — Önbellek boş belleği doldurur ve saniyede dört sayfa büyür. Kullanılabilir bellek, geri alınabilir önbelleği boş sayar.
- DP35 — Uyarı eşiği 100 sayfadır. Araç
araliksaniyede bir bakar; iki bakış arasında operatörün inancı son okumadır.
"""Takas kullanimi hangi gostergede ne kadar gec (ya da erken) gorunuyor.""" TOHUM = 20260218 DONEM = 600 FIZIKSEL = 1200 # fiziksel bellek , sayfa TABAN = 900 # olagan yerlesik talep ESIK = 100 # bellek uyari esigi , sayfa GENLIK = 60 # talepteki dalgalanma def uretec(tohum): d = tohum def sonraki(n): nonlocal d d = (d * 1103515245 + 12345) % 2147483648 return d % n return sonraki def talepler(tohum=TOHUM): """Kahin: her saniye gercekten istenen yerlesik sayfa sayisi.""" r = uretec(tohum) liste = [] for t in range(DONEM): if 200 <= t < 320: temel = TABAN + (t - 200) * 6 # rapor isi yavas yavas buyuyor elif 480 <= t < 495: temel = 1700 # kisa ve sert sicrama else: temel = TABAN liste.append(temel + r(2 * GENLIK + 1) - GENLIK) return liste def egriler(tohum=TOHUM): d_liste = talepler(tohum) kullanilan, hiz, bos, kullanilabilir, baski = [], [], [], [], [] en_yuksek = onceki = 0 for t, d in enumerate(d_liste): tasan = max(0, d - FIZIKSEL) yeni = abs(tasan - onceki) # saniyede takasa giden ve donen sayfa onceki = tasan en_yuksek = max(en_yuksek, tasan) # yazilan sayfa geri okunana kadar durur artan = FIZIKSEL - min(d, FIZIKSEL) onbellek = min(4 * t, artan) # onbellek bos yeri doldurur kullanilan.append(en_yuksek) hiz.append(yeni) bos.append(artan - onbellek) kullanilabilir.append(artan) # geri alinabilir onbellek sayilmaz baski.append(d > FIZIKSEL) return {"kullanilan": kullanilan, "hiz": hiz, "bos": bos, "kullanilabilir": kullanilabilir, "baski": baski} KURAL = {"kullanilan takas": lambda e, i: e["kullanilan"][i] > 0, "takas hizi": lambda e, i: e["hiz"][i] > 0, "bos bellek": lambda e, i: e["bos"][i] < ESIK, "kullanilabilir bellek": lambda e, i: e["kullanilabilir"][i] < ESIK} def say(e, kural, aralik): kacan = uyari = 0 son = False for t in range(DONEM): if t % aralik == 0: son = kural(e, t) kacan += e["baski"][t] and not son uyari += son and not e["baski"][t] return kacan, uyari E = egriler() print("kahin: baski altindaki saniye:", sum(E["baski"]), "/", DONEM) print("gosterge t=100 t=240 t=300 t=330 t=485 t=560") for ad in ("kullanilan", "hiz", "bos", "kullanilabilir"): print(f" {ad:14s}", " ".join(f"{E[ad][t]:5d}" for t in (100, 240, 300, 330, 485, 560))) print() print("gosterge aralik kacirilan yanlis uyari yanlis tani") for ad, kural in KURAL.items(): for aralik in (5, 30, 60, 120): kacan, uyari = say(E, kural, aralik) print(f" {ad:21s} {aralik:6d} {kacan:9d} {uyari:12d}" f" {kacan + uyari:11d}") print() for tohum in (TOHUM, 20260219): e = egriler(tohum) s = " | ".join(f"{ad.split()[0]} {sum(say(e, k, 5))}" for ad, k in KURAL.items()) print(f"tohum {tohum}: baski {sum(e['baski']):3d} saniye | aralik 5 : {s}")
kahin: baski altindaki saniye: 84 / 600 gosterge t=100 t=240 t=300 t=330 t=485 t=560 kullanilan 0 0 331 423 533 535 hiz 0 0 57 0 61 0 bos 0 0 0 0 0 0 kullanilabilir 268 120 0 258 0 333 gosterge aralik kacirilan yanlis uyari yanlis tani kullanilan takas 5 1 272 273 kullanilan takas 30 19 265 284 kullanilan takas 60 49 265 314 kullanilan takas 120 69 225 294 takas hizi 5 2 13 15 takas hizi 30 19 25 44 takas hizi 60 49 85 134 takas hizi 120 69 105 174 bos bellek 5 0 451 451 bos bellek 30 0 426 426 bos bellek 60 0 396 396 bos bellek 120 0 396 396 kullanilabilir bellek 5 1 12 13 kullanilabilir bellek 30 19 25 44 kullanilabilir bellek 60 49 85 134 kullanilabilir bellek 120 69 105 174 tohum 20260218: baski 84 saniye | aralik 5 : kullanilan 273 | takas 15 | bos 451 | kullanilabilir 13 tohum 20260219: baski 86 saniye | aralik 5 : kullanilan 271 | takas 16 | bos 469 | kullanilabilir 9
Üç sayı yan yana. Kâhin: pencerenin 84 saniyesinde gerçek bellek baskısı var. Araç çıktısı: adı doğrudan takası anan gösterge, kullanılan takas, üç yüz otuzuncu saniyede 423’te, dört yüz seksen beşten sonra 533’te duruyor ve hiç inmiyor. Yanlış tanı: o gösterge beş saniyede bir okunsa bile 272 saniye yersiz uyarı veriyor; toplamı 273.
Dört göstergenin dört ayrı yanılma biçimi var. Kullanılan takas birikimlidir: bir sayfa takasa yazıldıktan sonra geri okunmadıkça orada durur, bu yüzden gösterge baskı bittikten sonra da yüksek kalır ve geçmişi bugün gibi gösterir; yersiz uyarısı 272 saniyeyi buluyor. Takas hızı anlıktır ve beş saniyelik aralıkta yalnız 2 saniye kaçırıp 13 yersiz uyarı veriyor; aralık altmışa çıktığında kaçırılan 49’a fırlıyor, çünkü sıçrama on beş saniye sürüyor ve iki bakış arasına giriyor. Boş bellek neredeyse hep alarm veriyor — 451 saniye — çünkü önbellek boş yeri doldurur ve boş bellek sağlıklı bir sistemde de sıfıra yakındır. Kullanılabilir bellek beş saniyelik aralıkta 1 saniye kaçırıp 12 yersiz uyarı veriyor.
En düşük iki toplam 13 ve 15’tir ve ikisi de aynı örnekleme aralığına bağlıdır: aralık altmışa çıktığında dördü de 134’ün üstüne tırmanıyor. İkinci tohumda baskı 86 saniye sürüyor ve beş saniyelik aralıktaki toplamlar 271, 16, 469 ve 9 çıkıyor; sıralama değişmiyor. Kursun kuralı burada tam karşılığını buluyor: ayıran şey kaç sayıya bakıldığı değil, hangi sayıya bakıldığıdır. Adında “takas” geçen gösterge, takas baskısını bulmak için en kötüsü çıktı.
Kapatmanın Bedeli
Takas alanını devre dışı bırakmak tek satırlık bir komuttur ve tek satırlık bir riski vardır: alandaki her sayfa fiziksel belleğe geri okunmak zorundadır. Yeterli yer yoksa işlem ya başarısız olur ya da bellek yetersizliği nedeniyle bir sürecin sonlandırılmasıyla sonuçlanır.
- DP36 — Kapatma, kullanılan takas kullanılabilir belleğe sığıyorsa mümkündür. Kâhin bu karşılaştırmayı her saniye yapar.
- DP37 — Sınanan tanı yaygın olanıdır: kullanım yüzdesi yarının altındaysa kapatılabilir.
"""Takas alanini kapatmak icin icindeki her sayfa bellege geri okunmalidir.""" TOHUM = 20260218 DONEM = 600 FIZIKSEL = 1200 TABAN = 900 GENLIK = 60 def uretec(tohum): d = tohum def sonraki(n): nonlocal d d = (d * 1103515245 + 12345) % 2147483648 return d % n return sonraki def talepler(tohum=TOHUM): r = uretec(tohum) liste = [] for t in range(DONEM): if 200 <= t < 320: temel = TABAN + (t - 200) * 6 elif 480 <= t < 495: temel = 1700 else: temel = TABAN liste.append(temel + r(2 * GENLIK + 1) - GENLIK) return liste def durum(tohum=TOHUM): kullanilan, kullanilabilir, en_yuksek = [], [], 0 for d in talepler(tohum): en_yuksek = max(en_yuksek, max(0, d - FIZIKSEL)) kullanilan.append(en_yuksek) kullanilabilir.append(FIZIKSEL - min(d, FIZIKSEL)) return kullanilan, kullanilabilir def sayim(boy, tohum=TOHUM): kul, uygun = durum(tohum) gercek = tani = yanlis = 0 for t in range(DONEM): g = kul[t] <= uygun[t] # kahin: sayfalar bellege geri sigar mi y = kul[t] / boy < 0.50 # tani: kullanim yarinin altinda gercek += g tani += y yanlis += g != y return gercek, tani, yanlis print("takas boyu kapatilabilir saniye kapatilabilir GORUNEN yanlis tani") for boy in (512, 1024, 2048, 4096): g, t, y = sayim(boy) print(f"{boy:10d} {g:20d} {t:21d} {y:11d}") print("gozlem penceresi:", DONEM, "saniye") print() for tohum in (TOHUM, 20260219): print(f"tohum {tohum}: " + " | ".join( f"{boy} boyunda yanlis {sayim(boy, tohum)[2]}" for boy in (512, 4096)))
takas boyu kapatilabilir saniye kapatilabilir GORUNEN yanlis tani
512 246 290 44
1024 246 483 237
2048 246 600 354
4096 246 600 354
gozlem penceresi: 600 saniye
tohum 20260218: 512 boyunda yanlis 44 | 4096 boyunda yanlis 354
tohum 20260219: 512 boyunda yanlis 45 | 4096 boyunda yanlis 355
Üç sayı yan yana. Kâhin: altı yüz saniyenin 246’sında takas alanı güvenle kapatılabilir. Araç çıktısı: 2048 sayfalık bir takas alanında doluluk hiçbir zaman yüzde ellinin üstüne çıkmıyor, yani gösterge 600 saniyenin 600’ünde “rahat” diyor. Yanlış tanı: aynı kural 512 sayfalık alanda 44, 2048 ve üstünde 354 kez yanılıyor. İkinci tohumda bu iki sayı 45 ve 355 oluyor.
Sonuç sezgiye ters ve tam da bu yüzden öğretici: takas alanını büyütmek yüzdeye bakan tanıyı kötüleştiriyor. Aynı 533 sayfa, küçük bir alanda tamamına yakını, büyük bir alanda sekizde biri görünür; sayfa sayısı değişmediği hâlde yüzde değişir. Yüzde bir orandır ve oranın paydası burada operatörün seçtiği bir sayıdır. Doğru soru “takas ne kadar dolu” değil, “içindeki sayfalar belleğe sığar mı” sorusudur ve o soruyu yanıtlayan sayı takas çıktısında değil, bellek çıktısındadır.
Ne Kadar Olmalı ve Neye Dokunulmaz
Takas alanının boyutu bir doğruluk kararı değil, bir bütçe kararıdır ve iki uçtan da bedeli vardır. Hiç takas alanı olmayan bir sistemde talep fiziksel belleği aştığı anda bir süreç sonlandırılır; arıza serttir, hızlıdır ve tanısı kolaydır. Geniş takas alanı olan bir sistemde aynı talep sonlandırma üretmez, ama sayfalar diske gider ve her geri okuma bir bekleme ekler; arıza yumuşaktır, yavaştır ve tanısı zordur. Aradaki seçim, hangi arızanın yönetilebilir olduğuna göre yapılır.
Bir de sayfa atma eğilimi vardır: sistem, bellek baskısı olmadan da az kullanılan sayfaları takasa yazmaya ne kadar istekli olacağını belirleyen bir ayar taşır. Bu ayarı yükseltmek kullanılan takas göstergesini baskı yokken de sıfırın üstüne çıkarır ve yukarıdaki tablodaki yersiz uyarı sütununu daha da büyütür.
Yıkıcı komut sınırı burada iki yerde geçerlidir. Birincisi, bir bölümü takas alanı olarak biçimlendiren komut, o bölümdeki dosya sistemini geri alınamaz biçimde yok eder; yanlış bölüm adı yazıldığında uyarı vermeden çalışır. İkincisi, baskı altındayken takas alanını kapatmak süreç sonlandırmasına yol açabilir. Bu ders iki komutu da çalıştırılabilir tam biçimde vermez. Güvenli sınama yolu, hedef bölümün kimliğini önceden doğrulamak, denemeyi bir dosya üzerinde kurulmuş takas alanıyla yapmak ve kapatmayı yalnız kullanılan takasın kullanılabilir belleğin altında olduğu bir anda denemektir.
Özet
- Takas alanı bir bölüm ya da dosya olabilir ve hiçbir takma noktasında görünmez; sayfalı belleğin mekanizması bu kursta tekrarlanmaz, ölçülen şey operatörün görebildiğidir.
- Altı yüz saniyelik pencerede gerçek bellek baskısı 84 saniyedir; kullanılan takas göstergesi beş saniyede bir okunsa bile 272 saniye yersiz uyarı verir, çünkü takasa yazılan sayfa geri okunana kadar orada kalır.
- Boş bellek 451 saniye yersiz uyarı veriyor, çünkü önbellek boş yeri doldurur; kullanılabilir bellek beş saniyelik aralıkta 1 kaçırma ve 12 yersiz uyarıyla en düşük toplamı veriyor.
- Takas hızı aynı aralıkta 2 saniye kaçırıp 13 yersiz uyarı veriyor, ama aralık altmışa çıktığında kaçırılan 49’a fırlıyor; dört göstergenin dördü de kaba örneklemede 134’ün üstüne tırmanıyor.
- Takas alanı 600 saniyenin 246’sında güvenle kapatılabilir; doluluk yüzdesine bakan kural 512 sayfalık alanda 44, 2048 ve üstünde 354 kez yanılıyor — alanı büyütmek yüzdeye bakan tanıyı kötüleştiriyor.
Sonraki Adım
Bu konu boyunca depolama hep var olan bir şeydi: bir aygıt, üzerinde bölümler, içlerinde dosya sistemleri. Kursun son dersi zincirin başına döner ve yeni bir aygıtın sisteme katılmasını baştan sona izler — tanıma, bölümleme, biçimlendirme, takma, kalıcı hâle getirme ve genişletme. Her adımda bir araç “tamam” der ve bir üst katman henüz haberdar değildir; ölçülecek şey, zincirin kaç adımında “iş bitti” tanısının yanlış olduğudur. Ders aynı zamanda kursu kapatır.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.