İçeriğe geç
academia.sh

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ç aralik saniyede 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.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat