Merhabalar,
Bellek, en önemli ESXi sunucu kaynaklarından biridir. İş yüklerinin, genel sistem belleğine erişmesi için sanal bellek adreslerinin fiziksel adreslerle eşlendiğinden emin olmamız gerekir. Bu çevirileri olabildiğince verimli gerçekleştirmek için birlikte çalışan birkaç bileşen vardır. Sanal bellek adreslerinin fiziksel adreslere nasıl çevrileceğine ilişkin temel bilgileri inceleyelim.
Memory Translations
Fiziksel adres alanı, sistem donanımı üzerindeki RAM’inizdir. ESXi sunucularınız içindeki bellek modülleri, aynı zamanda genel sistem belleği olarak da adlandırılır. Sanal bellek hakkında konuşurken, vSphere ESXi hipervisor tarafından kontrol edilen bellekten bahsediyoruz aslında. İş yükleri bellekteki verilere eriştiğinde, sistemin sanal adresle eşleşen fiziksel bellek adresini araması gerekir. Bellek çevrimleri veya eşlemeler olarak adlandırdığımız olay aslında budur.
Sanal bellek adreslerini fiziksel bellek adresleriyle eşlemek için page table (sayfa tabloları) kullanılır. Sayfa tablosu çok sayıda Page Table Entry’den (PTE) oluşur.
Bir PTE’deki bir bellek sayfası, farklı boyutlarda ‘words’ içeren veri yapılarını ihtiva eder. Her word türü, birden fazla bayt’lık veri içerir. (WORD (16 bit / 2 bayt), DWORD (32 bit / 4 bayt) ve QWORD (64 bit / 8 bayt)). Mümkün olan her word veya sanal bellek sayfasının bellek çevirilerini fiziksel bellek adresine yürütmek milyarlarca PTE ile mümkün olabilir. Sistemin global belleğinde fiziksel adres alanını bulmak için PTE’lere ihtiyacımız var.
Bellek çevirilerini daha verimli hale getirmek için, tek bir eşleme altında memory adres parçalarını gruplamak için Page tables kullanırız. 4 baytlık bir DWORD girişi örneğine bakıldığında; bir Page table, tek bir sayfa girişinde yalnızca 4 bayt veri yerine 4 kilobaytı kapsar. Örneğin, bir page table kullanarak, 0 ila 4095 sanal adres alanını çevirebilir ve bunun 4096 ila 8191 fiziksel adres alanında bulunduğunu söyleyebiliriz. Artık tüm PTE’leri ayrı ayrı eşleştirmeye ihtiyaç duymuyoruz ve page table kullanarak çok daha verimli olmamız gerekiyor.
MMU (Memory Management) ve TLB (Translation Lookaside Buffer)
Page tables, bir Memory Management Unit (MMU) tarafından yönetilir. Tüm fiziksel bellek referansları MMU’dan geçirilir. MMU, sanal bellek adresleri ile fiziksel bellek adresleri arasındaki çeviriden sorumludur. vSphere ESXi ile, sanal makinenin vCPU’su, Virtual machine Monitor (VMM) işlemi tarafından, MMU işlevine veya satıcıya özel bir CPU boşaltma talimatı (CPU Offloading instruction) tarafından desteklenen bir donanım MMU’suna çağrıda bulunur.
Memory Management Unit (Bellek Yönetimi Birimi-MMU), sanal bellek adreslerini fiziksel bellek katmanıyla eşleştirmek için Translation Lookaside Buffer (TLB) ile birlikte çalışır. Page table, her zaman fiziksel bellek üzerinde bulunur ve bellek sayfalarını doğrudan fiziksel bellekte aramaya çalışır. Sonuç olarak, MMU için gecikmeye neden olduğu bir durum ortaya çıkmış oluyor. Tam da bu noktada TLB devreye giriyor.
Ayrıntılarıyla TLB
TLB, MMU için fiziksel belleğe erişim süresini azaltmak için kullanılan bir cache bellek görevi görür. TLB, MMU’nun bir parçasıdır. Bir CPU’nun markasına ve modeline bağlı olarak, TLB hatalarını önlemek ve mümkün olduğunca düşük bellek gecikmesi sağlamak için bellek önbelleklerinde olduğu gibi birden fazla TLB veya hatta birden fazla TLB seviyesi vardır.
Temelde, TLB sanaldan fiziğe son bellek çevirilerini saklar. Page table için bir önbellektir bu. TLB, MMU’nun bir parçası olduğundan, CPU paketinin içinde yaşamaktadır. Bu yüzden TLB, page table’ların bulunduğu ana bellekten daha hızlıdır. Tipik olarak, bir ana bellek erişim süresinin 100 ns olduğu bir ortamı düşünürseniz TLB için bu erişim süresi ~ 10 ns’dir.
Şimdi bellek çevirisinin temellerini ele aldığımıza göre, TLB için bazı örnek senaryolara göz atalım.
TLB hit durumu
Fiziksel adrese çevrilmesi gereken bir sanal bellek adresi gelmiş olsun. İlk adım her zaman, sanal adresi sanal bir sayfa numarasına ve sayfa ofsetine (page offset) ayırmaktır. Offset, sanal adresin son bitlerinden oluşur. Ofset bitlerinin, çevrimi ve fiziksel bellek adresine iletimi yapılmaz. Offset, bir sayfa tablosundaki tüm bellek adreslerini temsil edebilen bitler içerir.
Böylece, offset doğrudan fiziksel bellek katmanıyla eşlenir ve sanal sayfa numarası zaten TLB’de bulunan bir etiketle eşleşmiş olur. MMU artık global belleğe bakmaya gerek kalmadan, hangi fiziksel bellek sayfasına erişileceğini biliyor durumdadır.
Yukarıdaki şemada verilen örnekte, sanal sayfa numarası TLB’de bulunur ve hemen fiziksel sayfa numarasına çevrilir.
- Sanal adres, sanal sayfa numarasında ve page offset’inde kesilir.
- Page offset, çevrilmemiş olarak iletilir.
- Sanal sayfa numarası TLB’de aranır. Buna karşılık gelen numaraya sahip bir etiket aranır.
- TLB’de bir entry bulunur, böylece sanal adres, hemen fiziksel adrese çevrilir.
TLB miss durumu
TLB’de sanal bir sayfa numarası bulunmazsa ve “TLB eksik” olarak da işaretlenirse ne olur? TLB’nin hangi fiziksel sayfa numarasının kullanıldığını anlamak için sistemin global belleğine bakması gerekir. Fiziksel belleğe ulaşmaya çalışması, TLB hit’e kıyasla daha yüksek gecikme anlamına gelir. TLB doluysa ve TLB eksik olursa, en son TLB girişi temizlenir ve yerine yeni giriş yerleştirilir. Aşağıdaki örnekte, sanal sayfa numarası TLB’de bulunamıyor ve TLB’nin sayfa numarasını almak için belleğe bakması gerekiyor.
- Sanal adres, sanal sayfa numarasında ve page offset’inde kesilir.
- Page offset, çevrilmemiş olarak iletilir.
- Sanal sayfa numarası, ilgili numaraya sahip bir etiket ile TLB’de aranır. Bu örnekte TLB’nin henüz geçerli bir girişi yok.
- TLB sayfa 3’ü bulmak için belleğe ulaşır (etiket nedeniyle sanal sayfa numarasından türetilmiştir). Sayfa numarası 3, 0x0006 değeri ile belleğe alınır.
- Bellek çevirisi yapılır ve bulunan giriş bilgisi, TLB’de önbelleğe alınır.
Depolama alanından geri veriyi alma
Bir TLB miss durumu, istenen bir durum değildir. Fakat en kötü senaryo, bellekte değil de depolama ortamında (flash veya disk) bulunan verilerle ilgili senaryodur. Önbelleklerden veya global bellekten veri almak için nanosaniye cinsinden yapılan işlemler, depolama ortamından veri almak gerektiğinde kullanılan ortama bağlı olarak hızla milisaniye veya saniye olarak zaman alacaktır.
- Sanal adres, sanal sayfa numarasında ve page offset’inde kesilir.
- Page offset, çevrilmemiş olarak iletilir.
- Sanal sayfa numarası, ilgili numaraya sahip bir etiket ile TLB’de aranır. Bu örnekte TLB’nin henüz geçerli bir girişi yok.
- TLB sayfa 0’ü bulmak için belleğe ulaşır (etiket nedeniyle sanal sayfa numarasından türetilmiştir). Sayfa numarası 0, belleğe alınır fakat verilerin bellekte değil depolama alanında olduğunu farkeder. Bellekte olmayan veriler için bellek sayfalarını çevrimleyemediğimiz için bir sayfa hatası tetiklenir. Depolanma alanından bu verilerin getirilmesi beklenir.
Sonuç olarak,
Bu makalede sadece bellek çevirilerinin nasıl çalıştığına dair temel bilgileri ele aldık. Tartıştığımız bilgiler, bellek erişim istekleri söz konusu olduğunda, sanal makinenizde ve ESXi sunucularınızda neler olup bittiğiyle ilgili temel bir anlayış sağlamalıdır.
vSphere’in ileri seviye teknik detaylarından birini aktarmaya çalıştım.
Yararlı olması dileğiyle.
Yusuf İşleyen
kaynak : https://blogs.vmware.com/vsphere/2020/03/how-is-virtual-memory-translated-to-physical-memory.html