THP geri kazanımı, Şeffaf Büyük Sayfaları (THP) alt sayfalara bölerek ve sıfır alt sayfaları geri kazanarak bellek şişmesinden kaynaklanan yetersiz bellek (OOM) hatalarını önler. Bu konuda, bellek kontrol gruplarında THP geri kazanımını yapılandırmak için kullanılan arayüzler ile bu özelliğin nasıl etkinleştirileceği ve test edileceği açıklanmaktadır.
Arka plan
Linux belleği sayfalar halinde yönetir. Standart sayfalar 4 KiB boyutundadır. THP'ler ise Çeviri Yan Bakış Arabelleği (TLB) kayıplarını azaltmak ve uygulama performansını artırmak amacıyla çekirdek tarafından dinamik olarak ayrılan 2 MiB veya 1 GiB gibi daha büyük bloklardır.
THP'ler bellek şişmesine neden olabilir. Bir uygulama yalnızca 8 KiB istediğinde çekirdek 2 MiB'lik bir THP ayırabilir. Bu THP istenen iki adet 4 KiB'lik sayfanın yanı sıra 510 adet sıfır dolu 4 KiB'lik sayfadan (sıfır sayfalar) oluşur. Bu durum yerleşik küme boyutunu (RSS) boşa harcar ve OOM riskini artırır.
THP geri kazanımı THP'leri alt sayfalara bölerek ve sıfır alt sayfaları geri kazanarak bu sorunu çözer. THP geri kazanımını etkinleştirmenin bellek performansını düşürebileceğini unutmayın.
Arayüzler
Aşağıdaki arayüzler THP geri kazanımı davranışını kontrol eder.
| Arayüz | Açıklama |
|---|---|
memory.thp_reclaim |
Bir bellek kontrol grubu için THP geri kazanımını etkinleştirir veya devre dışı bırakır. Geçerli değerler: reclaim (etkinleştir), swap (gelecekteki kullanım için ayrılmıştır), disable (varsayılan). Bellek şişmesi OOM hatalarına neden oluyorsa reclaim seçeneğini etkinleştirin; bunun bellek performansını düşürebileceğini unutmayın. |
memory.thp_reclaim_stat |
Bir bellek kontrol grubu için THP geri kazanımı durumunu sorgular. Artan NUMA düğüm kimliği sırasına göre (node0, node1, ...) her NUMA düğümü için üç sayaç bildirir: queue_length (geri kazanım kuyruğunda bulunan THP sayısı), split_hugepage (toplam bölünen THP sayısı), reclaim_subpage (geri kazanılan toplam sıfır alt sayfa sayısı). |
memory.thp_reclaim_ctrl |
THP geri kazanımının nasıl tetikleneceğini kontrol eder. Parametreler: threshold (geri kazanım tetiklenmeden önce bir THP'de bulunabilecek maksimum sıfır alt sayfa sayısı; varsayılan: 16), reclaim (salt yazılır; geri kazanımı hemen tetikler). Sıfır ağırlıklı bir THP'nin ne olarak nitelendirileceğini kontrol etmek için threshold değerini ayarlayın. Daha düşük değerler geri kazanımı daha agresif tetiklerken daha yüksek değerler geri kazanım sıklığını azaltır. |
/sys/kernel/mm/transparent_hugepage/reclaim |
Grup başına yapılan ayarları geçersiz kılan genel arayüz. Geçerli değerler: memcg (her cgroup kendi memory.thp_reclaim yapılandırmasını kullanır; varsayılan), reclaim (tüm cgroup'lar için geri kazanımı zorla etkinleştirir), swap (gelecekteki kullanım için ayrılmıştır), disable (tüm cgroup'lar için geri kazanımı zorla devre dışı bırakır). reclaim veya disable olarak ayarlandığında bu arayüz grup başına memory.thp_reclaim yapılandırmalarına göre önceliklidir. Genel arayüz tekrar memcg olarak sıfırlandığında grup başına yapılandırmalar korunur ve yeniden etkili olur. |
Desteklenen çekirdek sürümleri
THP geri kazanımı aşağıdaki Alibaba Cloud Linux çekirdek sürümlerinde desteklenir:
Alibaba Cloud Linux 2: çekirdek
4.19.91-24.al7veya üzeriAlibaba Cloud Linux 3: çekirdek
5.10.134-15.al8veya üzeri
Çekirdek sürümünüzü kontrol etmek için şunu çalıştırın:
uname -r
THP geri kazanımını yapılandırma
Aşağıdaki adımlar test adlı bir bellek kontrol grubu için THP geri kazanımını yapılandırır.
Ön koşullar
Başlamadan önce şunları doğrulayın:
Çekirdek sürümünüz Desteklenen çekirdek sürümleri bölümünde listelenen minimum gereksinimleri karşılar.
Örnek üzerinde
sudoyetkilerine sahipsiniz.
Yordam
-
testadında bir bellek kontrol grubu oluşturun:sudo mkdir /sys/fs/cgroup/memory/test/ -
testiçin THP geri kazanımını etkinleştirin:sudo sh -c 'echo reclaim > /sys/fs/cgroup/memory/test/memory.thp_reclaim' -
THP geri kazanımının etkin olduğunu doğrulayın:
cat /sys/fs/cgroup/memory/test/memory.thp_reclaimEtkin ayar köşeli parantez içinde gösterilir. Aşağıdaki çıktı THP geri kazanımının etkin olduğunu onaylar:
[reclaim] swap disable -
(İsteğe bağlı) Genel arayüzü kullanarak grup başına ayarları geçersiz kılın.
Tüm bellek kontrol grupları için THP geri kazanımını zorla etkinleştirmek için:
sudo sh -c 'echo reclaim > /sys/kernel/mm/transparent_hugepage/reclaim'Tüm bellek kontrol grupları için THP geri kazanımını zorla devre dışı bırakmak için:
sudo sh -c 'echo disable > /sys/kernel/mm/transparent_hugepage/reclaim'Not: Genel arayüz
reclaimveyadisableolarak ayarlandığındamemory.thp_reclaimarayüzüne göre önceliklidir. Grup başınamemory.thp_reclaimyapılandırmaları etkilenmez. -
testiçin sıfır alt sayfa eşik değerini ayarlayın.thresholdparametresi THP geri kazanımı tetiklenmeden önce bir THP'nin içerebileceği maksimum sıfır alt sayfa sayısını tanımlar. Varsayılan değer16değeridir. Bu değeri32olarak değiştirmek için:sudo sh -c 'echo "threshold 32" > /sys/fs/cgroup/memory/test/memory.thp_reclaim_ctrl'Bu ayarla bir THP 32'den fazla sıfır alt sayfa içerdiğinde THP geri kazanımı tetiklenir.
-
Sıfır alt sayfa geri kazanımını manuel olarak tetikleyin.
Not:
memory.thp_reclaim_ctrliçindekireclaimparametresi salt yazılırdır. Bu arayüzdecatkomutunu çalıştırmakreclaimayarını döndürmez.Yalnızca
testiçin geri kazanımı tetiklemek için:sudo sh -c 'echo "reclaim 1" > /sys/fs/cgroup/memory/test/memory.thp_reclaim_ctrl'testve tüm alt kontrol grupları için geri kazanımı özyinelemeli olarak tetiklemek için:sudo sh -c 'echo "reclaim 2" > /sys/fs/cgroup/memory/test/memory.thp_reclaim_ctrl'THP geri kazanımı ayrıca şu durumlarda otomatik olarak tetiklenir:
Cgroup içinde bir OOM hatası oluştuğunda.
Memcg arka uç zaman uyumsuz geri kazanım özelliği tetiklendiğinde. Ayrıntılar için bkz. Memcg arka uç zaman uyumsuz geri kazanma.
-
testiçin THP geri kazanımı durumunu kontrol edin:cat /sys/fs/cgroup/memory/test/memory.thp_reclaim_statÖrnek çıktı:
queue_length 14 split_hugepage 523 reclaim_subpage 256207queue_length 14: Geri kazanım kuyruğunda şu anda 14 THP bulunmaktadır.split_hugepage 523: 523 THP bölünmüştür.reclaim_subpage 256207: 256.207 sıfır alt sayfa geri kazanılmıştır.
THP geri kazanımı özelliğini test etme
Aşağıdaki örnek C kodu 10 THP'si sıfır alt sayfa içeren 1 GiB bellek (512 THP) ayırır. THP geri kazanımı etkin ve devre dışı iken bellek davranışını karşılaştırmak için bu kodu kullanın.
-
testiçin bellek sınırını 1 GiB olarak ayarlayın:sudo sh -c 'echo 1G > /sys/fs/cgroup/memory/test/memory.limit_in_bytes'Değeri doğrulayın:
cat /sys/fs/cgroup/memory/test/memory.limit_in_bytesBeklenen çıktı şöyledir:
1073741824 -
Testi izole etmek için memcg arka uç zaman uyumsuz geri kazanım özelliğini devre dışı bırakın:
sudo sh -c 'echo 0 > /sys/fs/cgroup/memory/test/memory.wmark_ratio'Bu özellik hakkında ayrıntılı bilgi için bkz. Memcg arka uç zaman uyumsuz geri kazanma.
-
Örnek C kodunu THP geri kazanımı etkin ve ardından devre dışı olacak şekilde derleyip çalıştırın. Sonuçları karşılaştırın.
Derleme:
gcc -o test <test.c><test.c>ifadesini gerçek kaynak dosya adınızla değiştirin.// Allocates 1 GiB (512 THPs). The first 10 THPs contain zero subpages. #include <stdlib.h> #include <string.h> #include <unistd.h> #define HUGEPAGE_SIZE 4096 * 512 int main() { int i, thp = 512; char *addr; posix_memalign((void **)&addr, HUGEPAGE_SIZE, HUGEPAGE_SIZE * thp); for (i = 0; i < 10; i++) { memset(addr, 0xc, HUGEPAGE_SIZE >> 1); addr += HUGEPAGE_SIZE; } for (; i < thp; i++) { memset(addr, 0xc, HUGEPAGE_SIZE); addr += HUGEPAGE_SIZE; } pause(); return 0; }Ayrı bir terminalde OOM hatalarını izleyin:
dmesg -wHBeklenen sonuçlar:
THP geri kazanımı etkin: Özellik ayrılan THP'leri böler ve sıfır alt sayfaları geri kazanarak bellek kullanımını azaltır ve OOM hatalarını önler.
THP geri kazanımı devre dışı: THP'ler bölünmez ve sıfır alt sayfalar geri kazanılmaz. OOM hataları oluşabilir. Çekirdek günlüklerinde yetersiz bellek ve sonlandırılabilecek işlemlerin ayrıntıları gösterilir.