Eşit olmayan bellek erişimli (NUMA) mimarilerde, özellikle Arm tabanlı örneklerde işlemler bazen kendi yerel düğümü yerine uzak bir NUMA düğümünde depolanan kod bölümlerine erişir. Bu düğümler arası erişim gecikme süresini artırır ve bant genişliği kullanımını yükseltir. Code duptext özelliği, uzak kod bölümlerini yerel düğüme kopyalayarak işlemlerin yerel bellekten okumasını sağlar ve bu ek yükü ortadan kaldırır.
Nasıl çalışır?
Çekirdek, bir NUMA düğümündeki bir işlemin başka bir düğümdeki kod bölümlerine eriştiğini algıladığında sayfa düzeyinde granüleriteyle (her sayfa 4 KB'dir) yerel bir kopya oluşturur:
Düğüm 1'deki bir işlem, düğüm 0'da depolanan
libc.sodosyasına erişir veya düğüm 0'daki bir işlem, düğüm 1'de depolanantestdosyasına erişir.Çekirdek, uzak kod bölümünün yerel düğümde bir kopyasını oluşturur; düğüm 1'de bir
libc.sokopyası ve düğüm 0'da birtestkopyası bulunur.Her işlem kendi yerel kopyasından okuma yapar, böylece düğümler arası erişim ortadan kalkar.
Kod bölümünü tutan orijinal sayfaya ana sayfa adı verilir. Duptext özelliği tarafından oluşturulan yerel kopyaya ise alt sayfa adı verilir.
İşletim sistemi, bellek baskısını gidermek veya yük dengeleme gereksinimlerini karşılamak amacıyla belleği birden fazla NUMA düğümüne dağıtabilir; bu durum düğümler arası kod erişimine neden olur. Önerilen azaltma yöntemi, code duptext özelliğini etkinleştirmektir.
Sınırlamalar
Code duptext özelliği aşağıdaki iki koşulu aynı anda gerektirir:
Örnek türü: ECS Bare Metal Instance aileleri. Daha fazla bilgi için bkz. Genel Bakış.
Görüntü: Çekirdek sürümü
5.10.112-11veya üzeri olan Alibaba Cloud Linux 3.
Örneğinizin çekirdek sürümünü kontrol etmek için aşağıdaki komutu çalıştırın:
uname -r
Anahtarlar
Bu özellikte iki anahtar bulunur: genel bir anahtar ve memcg başına bir anahtar. Çekirdeğin bir işlem için alt sayfalar oluşturabilmesi için her ikisinin de etkinleştirilmesi gerekir.
| Anahtar | Açıklama | Varsayılan |
|---|---|---|
/sys/kernel/mm/duptext/enabled |
Genel anahtar. Özelliği tüm sistem için etkinleştirmek üzere 1 değerine, devre dışı bırakmak üzere 0 değerine ayarlayın. |
0 |
/sys/fs/cgroup/memory/<memcg-dir>/memory.allow_duptext |
Memcg başına anahtar. Özelliği ilgili memcg içindeki tüm işlemler için etkinleştirmek üzere 1 değerine, devre dışı bırakmak üzere 0 değerine ayarlayın. |
0 |
Genel anahtar 0 olarak ayarlandığında çekirdek, örnekteki tüm alt sayfaları otomatik olarak temizler.
Alt sayfaları izleyin
Duptext etkinliğini kontrol etmek için aşağıdaki dosyaları kullanın:
| Dosya veya alan | Gösterdiği bilgiler |
|---|---|
nr_duptext içeren /proc/vmstat |
Çekirdekte şu anda duptext olarak işaretlenmiş alt sayfa sayısı. Sıfırdan büyük bir değer, özelliğin aktif olarak alt sayfalar oluşturduğunu doğrular. Özelliği etkinleştirdikten sonra değer sıfırda kalıyorsa düğümler arası kod erişimi algılanmamıştır. |
DupText içeren /proc/meminfo |
Duptext alt sayfaları tarafından kullanılan toplam bellek miktarı (KB cinsinden). |
/proc/<pid>/smaps |
İşlem başına alt sayfa istatistikleri. Çıktıdaki DupText alanı, ilgili işlem için yerel düğümde bir alt sayfa oluşturulup oluşturulmadığını doğrular. |
Code duptext özelliğini etkinleştirin
Bu örnekte, iki düğümlü bir NUMA örneğinde bir test programı derlenip çalıştırılır.
Ön koşullar
Başlamadan önce aşağıdakilere sahip olduğunuzdan emin olun:
Alibaba Cloud Linux 3 (
5.10.112-11veya üzeri) çalıştıran bir ECS Bare Metal InstanceKök veya sudo erişimi
Adımlar
ECS örneğine bağlanın. Talimatlar için bkz. SSH üzerinden bir Linux örneğine bağlanmak için Workbench'i kullanma.
-
(İsteğe bağlı) Örneğin NUMA topolojisini görüntüleyin:
numactlyüklü değilse önceliklesudo yum install numactlkomutunu çalıştırın.numactl -HÇıktı, tüm NUMA düğümlerini listeler. Aşağıdaki örnekte, düğüm 0 ve düğüm 1'e sahip iki düğümlü bir örnek gösterilmektedir.

-
Test programını düğüm 1'de derleyin; böylece
testikili dosyası için sayfa önbelleğini düğüm 1 tutar:numactl -N 1 -m 1 gcc test.c -o test -
Genel anahtarı etkinleştirin:
sudo sh -c 'echo 1 > /sys/kernel/mm/duptext/enabled' -
Bir memcg dizini oluşturun ve bunun için duptext özelliğini etkinleştirin:
sudo mkdir /sys/fs/cgroup/memory/test sudo sh -c 'echo 1 > /sys/fs/cgroup/memory/test/memory.allow_duptext' -
testikili dosyasını memcg altında, düğüm 0'a bağlı olarak çalıştırın. Çekirdek düğümler arası erişimi algılar vetestkod bölümünün bir alt sayfa kopyasını düğüm 0'da oluşturur:cgexecyüklü değilse önceliklesudo yum install -y libcgroup-toolskomutunu çalıştırın.sudo cgexec -g "memory:test" numactl -N 0 -m 0 ./test -
testişlemi için bir alt sayfa oluşturulduğunu doğrulayın:sudo cat /proc/$(pidof test)/smapsÇıktıdaki
DupTextalanı, düğüm 0'da bir alt sayfa kopyası oluşturulduğunu doğrular.
Örnek düzeyindeki duptext istatistiklerini kontrol etmek için aşağıdaki komutları çalıştırın:
cat /proc/vmstat | grep -i duptext cat /proc/meminfo | grep -i duptextnr_duptextdeğeri sıfırdan büyükse özellik aktif olarak alt sayfalar oluşturmaktadır.
Code duptext özelliğini devre dışı bırakın
İş gereksinimlerinize göre code duptext özelliğini devre dışı bırakabilirsiniz. Devre dışı bırakıldığında çekirdek, örnekteki tüm alt sayfaları otomatik olarak temizler.
ECS örneğine bağlanın. Talimatlar için bkz. SSH üzerinden bir Linux örneğine bağlanmak için Workbench'i kullanma.
-
Genel anahtarı devre dışı bırakın:
sudo sh -c 'echo 0 > /sys/kernel/mm/duptext/enabled' -
Tüm alt sayfaların temizlendiğini doğrulayın:
cat /proc/vmstat | grep -i duptext cat /proc/meminfo | grep -i duptextHer iki değer de
0olmalıdır; bu durum özelliğin devre dışı bırakıldığını ve tüm alt sayfaların geri alındığını doğrular.