Apache Spark gibi iş yükleri kısa sürede büyük miktarda sayfa önbelleği biriktirebilir. Bu sayfaların çoğu kirli sayfalardır ve yavaş geri kazanılır. Geri kazanma işlemi belleği yeterince hızlı serbest bırakamazsa çekirdek bellek tükenmesiyle karşılaşır ve beklenmeyen bir bellek yetersizliği (OOM) hatası tetiklenerek iş süreçlerinde dalgalanmalara neden olur. Sayfa Önbelleği Sınırı, bellek kontrol grubu (memcg) başına sayfa önbelleği kullanımını sınırlar ve sınır aşıldığında fazla önbelleği geri kazandırarak hem sınırsız önbellek büyümesini hem de beklenmeyen OOM hatalarını önler. Alibaba Cloud Linux 3'te kernel sürümü 5.10.134-14 ve üzeri sürümlerden itibaren kullanılabilir.
Arayüzler
Aşağıdaki tabloda tüm arayüzler özetlenmiştir. Detaylı açıklamalar aşağıda yer almaktadır.
| Arayüz | Açıklama | Varsayılan |
|---|---|---|
/sys/kernel/mm/pagecache_limit/enabled |
Genel açma/kapama anahtarı | 0 |
/sys/fs/cgroup/memory/<memcg>/memory.pagecache_limit.enable |
Memcg başına açma/kapama anahtarı | 0 |
/sys/fs/cgroup/memory/<memcg>/memory.pagecache_limit.size |
Bayt cinsinden sayfa önbelleği sınırı | 0 |
/sys/fs/cgroup/memory/<memcg>/memory.pagecache_limit.sync |
Geri kazanma modu: asenkron (0) veya senkron (1) |
0 |
/sys/kernel/mm/pagecache_limit/enabled
Sayfa Önbelleği Sınırı için genel anahtarı kontrol eder. Geçerli değerler: 0 ve 1.
1: Sayfa Önbelleği Sınırı'nı genel olarak etkinleştirir.0: Sayfa Önbelleği Sınırı'nı genel olarak devre dışı bırakır.
/sys/fs/cgroup/memory/<memcg>/memory.pagecache_limit.enable
Memcg başına anahtarı kontrol eder. Geçerli değerler: 0 ve 1.
1: İlgili memcg için Sayfa Önbelleği Sınırı'nı etkinleştirir.0: İlgili memcg için Sayfa Önbelleği Sınırı'nı devre dışı bırakır.
/sys/fs/cgroup/memory/<memcg>/memory.pagecache_limit.size
Bir memcg için maksimum sayfa önbelleği kullanımını bayt cinsinden ayarlar. Geçerli aralık: 0 ile memcg'nin memory.limit_in_bytes değeri arasındadır.
0: Genel anahtar veya memcg başına anahtar ne olursa olsun ilgili memcg için Sayfa Önbelleği Sınırı'nı devre dışı bırakır.Sıfır dışı değer: Memcg'nin sayfa önbelleği kullanımını bu değerle sınırlar.
Not: Bir memcg'nin sayfa önbelleği kullanımı, altındaki tüm çocuk memcg'lerin sayfa önbelleği kullanımlarının toplamıdır.
/sys/fs/cgroup/memory/<memcg>/memory.pagecache_limit.sync
Geri kazanma modunu kontrol eder. Geçerli değerler: 0 ve 1.
0: Asenkron geri kazanma. Çekirdek geri kazanma görevlerini arka plan iş kuyruğu iş parçacıklarına devrederek ana iş parçacıkları üzerindeki etkiyi azaltır. İş yükü sayfa önbelleğini iş kuyruğunun geri kazandırabileceğinden daha hızlı oluşturursa sayfa önbelleği geçici olarak sınırı aşabilir.1: Senkron geri kazanma. Geri kazanma mevcut sürecin bağlamında çalışır ve yeterli sayfa önbelleği serbest bırakılana kadar süreci engeller. Bu yöntem daha güçlü garantiler sunar ancak süreç düzeyinde gecikme süresi artışlarına neden olabilir.
Nasıl çalışır
Sayfa Önbelleği Sınırı'nı etkinleştirdikten sonra çekirdek, bir memcg sürecine her sayfa önbelleği tahsis edildiğinde aşağıdaki mantığı uygular:
Geçerli memcg'yi denetleyin. Çekirdek, memcg'nin sayfa önbelleği sınırını aşıp aşmadığını belirler. Ardından memcg hiyerarşisi boyunca yukarı doğru ilerleyerek her üst memcg'nin
memory.pagecache_limitdeğerlerini kontrol eder. Bir üst memcg'nin değeri0ise özellik bu üst memcg ve onun tüm alt öğeleri için devre dışı bırakılır; bu durumda sayfa önbelleği sınırsızdır.Geri kazanma modunu seçin. Memcg sınırı aşmışsa çekirdek, asenkron ve senkron geri kazanma arasında karar vermek için
memory.pagecache_limit.syncdeğerini kontrol eder.-
Sayfa önbelleğini geri kazanın. Geri kazanma davranışı moda göre farklılık gösterir:
Mod Geri kazanma hedefleri Senkron Varsayılan olarak yalnızca eşlenmemiş dosya sayfaları. Dört taramadan sonra eşlenmiş dosya sayfaları da uygun hale gelir. Asenkron Varsayılan olarak hem eşlenmemiş hem de eşlenmiş dosya sayfaları. İki taramadan sonra kirli sayfalar da uygun hale gelir.
Aşağıdaki diyagram uçtan uca akışı göstermektedir:
Bellek sayfa türleri
| Tür | Açıklama |
|---|---|
| Eşlenmemiş dosya sayfaları | Herhangi bir dosyaya eşlenmemiş sayfalar. Genellikle diskte kalıcı olmayan özel ve geçici verileri tutar. |
| Eşlenmiş dosya sayfaları | Dosyalara eşlenmiş sayfalar. Süreçlerin dosya verilerini doğrudan bellekte okumasına ve yazmasına olanak tanır. |
| Kirli sayfalar | Değiştirilmiş ancak henüz diske yazılmamış eşlenmiş dosya sayfaları. Önce temizlenmeleri gerektiğinden yavaş geri kazanılırlar. |
Sayfa Önbelleği Sınırı'nı yapılandırma
Bu örnekte 20 MiB'lik bir sayfa önbelleği oluşturulur, 10 MiB'lik bir sınır uygulanır ve özelliğin fazlalığı geri kazandırdığı doğrulanır.
Ön koşullar
Başlamadan önce şunlara sahip olduğunuzdan emin olun:
Alibaba Cloud Linux 3 işletim sistemi ve
5.10.134-14veya üzeri kernel sürümü çalıştıran bir Elastic Compute Service (ECS) örneğiÖrnek üzerinde
sudoerişimi
Özelliği etkinleştirme ve yapılandırma
ECS örneğine bağlanın. Talimatlar için bkz. Linux örneğinde oturum açmak için Workbench'i kullanma.
-
Sayfa Önbelleği Sınırı'nı genel olarak etkinleştirin.
sudo sh -c 'echo 1 > /sys/kernel/mm/pagecache_limit/enabled' -
Bir memcg dizini oluşturun. Bu örnekte
/sys/fs/cgroup/memory/test/kullanılmaktadır.sudo mkdir -p /sys/fs/cgroup/memory/test/ -
Sayfa önbelleği sınırını 10 MiB (10.485.760 bayt) olarak ayarlayın.
sudo sh -c 'echo 10485760 > /sys/fs/cgroup/memory/test/memory.pagecache_limit.size' -
Geri kazanma modunu yapılandırın. İş yükünüze bağlı olarak aşağıdaki seçeneklerden birini seçin:
-
Asenkron geri kazanma:
sudo sh -c 'echo 0 > /sys/fs/cgroup/memory/test/memory.pagecache_limit.sync' -
Senkron geri kazanma:
sudo sh -c 'echo 1 > /sys/fs/cgroup/memory/test/memory.pagecache_limit.sync'
-
-
Memcg için Sayfa Önbelleği Sınırı'nı etkinleştirin.
sudo sh -c 'echo 1 > /sys/fs/cgroup/memory/test/memory.pagecache_limit.enable'
Test sayfa önbelleği oluşturma
-
cgexeckomutunu sağlayanlibcgrouppaketini yükleyin.sudo yum install libcgroup-tools -
20 MiB'lik bir test dosyası oluşturun ve 20 MiB'lik sayfa önbelleği oluşturmak için
testmemcg altında okuyun.sudo dd if=/dev/zero of=./testfile bs=1M count=20 oflag=direct sudo cgexec -g "memory:test" cat ./testfile > /dev/null
Sonuçları doğrulama
-
Sayfa önbelleği kullanımını kontrol edin.
memory.statiçindekicachealanı, memcg tarafından tüketilen toplam sayfa önbelleğini gösterir.grep cache /sys/fs/cgroup/memory/test/memory.statÇıktıda
cachedeğerinin yaklaşık 10.543.104 bayt (~10 MiB) olduğu görülür; bu da sayfa önbelleği kullanımının yapılandırılan sınırla kısıtlandığını doğrular.
-
Ne kadar sayfa önbelleğinin geri kazanıldığını kontrol edin.
memory.exstatiçindekipagecache_limit_reclaimed_kbalanı, özellik tarafından geri kazanılan kümülatif kilobayt cinsinden sayfa önbelleğini gösterir.cat /sys/fs/cgroup/memory/test/memory.exstatÇıktıda
pagecache_limit_reclaimed_kbdeğerinin yaklaşık 10.108 KB (~10 MiB) olduğu görülür; bu da 10 MiB'lik fazla sayfa önbelleğinin geri kazanıldığını doğrular.
Sonuç: 20 MiB'lik bir sayfa önbelleği oluşturuldu. Sayfa Önbelleği Sınırı kullanımı 10 MiB ile sınırladı ve beklenen şekilde kalan 10 MiB'i geri kazandırdı.
Not: Eğerpagecache_limit_reclaimed_kbbeklenenden yüksekse bunun nedeni aşırı sıralı okuma ön getirmesi (read-ahead) olabilir. Disk aygıtı için okuma ön getirme boyutunu azaltın ve ardından yeniden test edin:echo 128 | sudo tee /sys/block/<disk-device>/queue/read_ahead_kb<disk-device>yerine disk aygıtı adınızı yazın (örneğin,vda).read_ahead_kbparametresi çekirdeğin sıralı okumalar sırasında önceden kaç kilobayt veri getirdiğini kontrol eder. Bu değeri düşürmek gereksiz sayfa önbelleği tahsisini azaltır.
Sonraki adımlar
Memcg arka uç asenkron geri kazanma — Süreçleri engellemeden tipik bellek baskısını ele alan tamamlayıcı özellik hakkında bilgi edinin.