Özel Sunucular için NUMA Farkındalığı ve CPU Sabitleme

16 dakikalık okuma - 16 Haziran 2026

hero section cover
İçindekiler
  • Özel sunucular için NUMA farkındalığı ve CPU sabitleme
  • NUMA'nın çok soketli sunucularda nasıl çalıştığı
  • Linux'ta NUMA topolojisini inceleme
  • CPU sabitleme ve bellek politikaları
  • İş yüküne göre strateji seçimi
  • Kontrol edilmesi gereken BIOS ve çekirdek ayarları
Paylaş

NUMA topolojisini inceleme ve Linux iş yüklerini doğru çekirdeklere ve belleğe atama. Numactl, taskset, systemd, BIOS ayarları ve iş yüküne özgü stratejileri kapsar.

Özel sunucular için NUMA farkındalığı ve CPU sabitleme

Herhangi bir çok soketli sunucuda, bir işlemin nerede çalıştığı ve belleğinin nerede bulunduğu iki farklı sorudur ve bunların senkronizasyonunun bozulması, performanstan ödün vermenin en kolay yollarından biridir. NUMA farkındalığı ve CPU sabitleme, bu sorunu çözen iki unsurdur. Bu yazıda NUMA'nın nasıl çalıştığı, Linux'ta nasıl denetleneceği ve veritabanları, yapay zeka eğitimi ve gecikmeye duyarlı hizmetler için iş yüklerinin nasıl doğru şekilde sabitleneceği ele alınmaktadır.

NUMA'nın çok soketli sunucularda nasıl çalıştığı

NUMA (Non-Uniform Memory Access) düğümü, özel bir bellek denetleyicisi aracılığıyla yerel bir RAM bloğuna bağlı bir CPU çekirdekler grubudur. İki soketli bir sunucuda genellikle iki düğüm bulunur. Herhangi bir çekirdek herhangi bir adresi okuyabilir, ancak yerel erişim yaklaşık 80 ns iken, Intel'in UPI veya AMD'nin Infinity Fabric üzerinden soketler arası geçiş yaklaşık 130–150 ns'dir. Daha fazla sokete sahip daha büyük sistemlerde, en kötü durumdaki düğüm 250 ns'yi aşabilir.

Bant genişliği de aynı modeli izler. İki soketli bir Sapphire Rapids sistemi, çekirdekler yerel belleğe eriştiğinde yaklaşık 600 GB/s hızını sürdürebilir, ancak soketler arası bağlantı bunun çok küçük bir kısmını oluşturur, bu nedenle buradan geçen trafik hızla darboğaza girer. Çok çekirdekli işlemciler bunu daha ayrıntılı hale getirir: Intel'in Sub-NUMA Clustering (SNC) ve AMD'nin Nodes Per Socket (NPS) teknolojileri, her soketi birden fazla NUMA etki alanına böler, böylece "iki soketli" bir kutu, Linux'a kolayca dört veya sekiz düğüm sunabilir.

NUMA farkındalığı olmadan, Linux zamanlayıcı, çalışma kümesi orijinal düğümde kalırken bir iş parçacığını soketler arasında rahatlıkla taşır. Sonraki her erişim uzaktan erişim haline gelir. Görünen belirti, çekirdekler zamanlarını belleği bekleyerek geçirdikleri için düşük gerçek verim ile yüksek CPU kullanımıdır. G/Ç aygıtları bunu daha da kötüleştirir. Bir GPU veya NIC, bir NUMA düğümüne ait belirli bir PCIe köküne bağlıdır. Onu besleyen işlem diğer sokette çalışıyorsa, her DMA aktarımı ara bağlantıyı geçer.

Linux'ta NUMA topolojisini inceleme

Dört araç, ihtiyacınız olan hemen hemen her şeyi karşılar:

  • lscpu hızlı bir soket ve düğüm özeti için.
  • numactl --hardware düğüm bellek toplamları ve düğümler arası mesafe matrisi için.
  • numastat işlem başına isabet/ıskalama sayaçları için.
  • lstopo (hwloc'tan) önbellek hiyerarşisi ve PCIe cihaz yerelliği için.

ile başlayın numactl --hardwareile başlayın. Burada her düğüm, ona ait çekirdekler ve bellek ile mesafe matrisi listelenir. 10 değeri yerel, 20+ ise uzaktır. Çok soketli bir kutuda tek bir düğüm görüyorsanız, BIOS'unuzda Düğüm Aralamasını etkinleştirilmiş ve topolojiyi gizliyor demektir; önce bunu düzeltin (aşağıya bakın).

Belirli bir işlem için numastat -p <PID> , belleğinin gerçekte nereye ayrıldığını ayrıntılı olarak gösterir. Dört sayaç önemlidir:

  • numa_hit: amaçlanan düğümde ayrılan bellek. Bu değerin yüksek olmasını istersiniz.
  • numa_miss: amaçlanan düğüm doluydu, tahsis başka bir yere taşındı.
  • numa_foreign: başka bir düğüm yerel olarak ayırmaya çalıştı ancak başaramadı; bu, bellek baskısını gösterir.
  • other_node: işlemin çalıştığı düğümden başka bir düğümde ayrılan sayfalar. Buradaki yüksek değerler, kötü sabitlemenin klasik işaretidir.

GPU veya NIC iş yükleri için lstopo-no-graphics komutunu çalıştırın ve her bir PCIe cihazının hangi NUMA düğümüne bağlı olduğuna bakın. Cihazı çalıştıran çekirdekler diğer düğümdeyse, düzeltilmesi gereken ilk şey budur.

CPU sabitleme ve bellek politikaları

CPU sabitleme (veya CPU afinitesi), bir işlemi belirli çekirdeklere bağlar, böylece zamanlayıcı onu taşıyamaz. Bu tek başına yeterli değildir, çünkü Linux varsayılan olarak ilk temas bellek politikasını kullanır: sayfalar, ilk yazan düğüme tahsis edilir. Bir iş parçacığı sabitlenmeden önce yanlış düğümde başlarsa, belleği orada kalır. Hem yerleştirmeyi hem de tahsisi birlikte kontrol etmeniz gerekir.

Üç araç, yaygın durumları kapsar:

AraçKontrollerKullanım
tasksetYalnızca CPU çekirdekleriMevcut bir işlemin hızlı tek seferlik bağlanması
numactlCPU çekirdekleri ve bellekSıkı yerellik ile iş yüklerini başlatma
systemdCPU çekirdekleri ve bellek, kalıcıYeniden başlatmalar arasında sabitlenmeye ihtiyaç duyan hizmetler

numactl dört bellek politikasını destekler:

  • --membind=N: yalnızca N düğümünde ayır, doluysa başarısız ol.
  • --preferred=N: N düğümünü tercih et, gerekirse diğerlerine geri dön.
  • --interleave=all: eşit bant genişliği dağılımı için düğümler arasında yuvarlak dönüşlü dağıtım.
  • --localalloc: Çalışan CPU'nun bulunduğu düğüme tahsis et.

Bir iş yükünü tek bir düğüme sabitleme

İlk olarak, hedef düğümünüze ait çekirdekleri belirleyin:

numactl --hardware

Ardından, hem çekirdekler hem de bellek için o düğüme bağlı uygulamayı başlatın:

numactl --cpunodebind=0 --membind=0 ./your_application

Zaten çalışmakta olan bir işlem için, CPU afinitesini şu şekilde ayarlayın taskset:

taskset -cp 0-7 <PID>

Yeniden başlatma sonrasında da kalıcı olması için, bunu systemd biriminde ayarlayın:

[Service]
CPUAffinity=0-7
NUMAPolicy=bind
NUMAMask=0

Yeniden yükleyin ve yeniden başlatın:

sudo systemctl daemon-reload && sudo systemctl restart <service>

Manuel olarak sabitleme yaparken, yerleştirmenize engel olmaması için çekirdeğin otomatik dengeleyicisini kapatın:

sysctl -w kernel.numa_balancing=0

Bunu /etc/sysctl.conf 'ye ekleyin. Ardından, numastat -p <PID> birkaç dakikalık gerçek iş yükü ile doğrulayın. Eğer other_node değeri sıfıra yakın kalırsa, sabitleme işlemi etkili olmaktadır.

İş yüküne göre strateji seçimi

Doğru politika, iş yükünüzün düşük gecikmeden mi yoksa tüm düğümler genelindeki toplam bant genişliğinden mi daha fazla fayda sağladığına bağlıdır.

İş yüküPolitikaNeden
Veritabanları (PostgreSQL, MySQL, SQL Server)--cpunodebind + --membindBüyük paylaşımlı arabellekler, gecikmeye duyarlı sorgu yolları
Bellek içi önbellek (Redis, Memcached)Tek düğüm bağlamaHer şey RAM erişimidir, uzaktan gecikme anında ortaya çıkar
AI/ML eğitimi ve çıkarımGPU'nun NUMA düğümüne bağlanmaPCIe köklerini geçen tensör aktarımlarını önler
Analitik (Spark, Elasticsearch)--interleave=allBüyük çalışma kümesi, tüm düğümlerde bant genişliği gerektirir
Gecikmeye duyarlı API'ler, ticaretSıkı pin + IRQ afinitesiTahmin edilebilirlik, en yüksek verimden daha önemlidir
Ağ yoğunluğu yüksek (RoCEv2, InfiniBand)Pini NIC'nin NUMA düğümüne bağlayın, IRQ'lar için çekirdekleri ayırınKesme işlemeyi yerel tutar ve uygulama iş parçacıklarının yoluna çıkmaz

Özellikle GPU iş yükleri için, lstopo komutunu çalıştırarak GPU'nun hangi NUMA düğümünde bulunduğunu bulun, ardından numactl --cpunodebind=N --membind=N aynı N için başlatın. Varsayılan zamanlayıcı yerleşimi genellikle yanlış olduğundan, bu çok soketli bir GPU sunucusunda elde edilebilecek en kolay kazançlardan biridir.

Her iki soketi de kapsayan HPC ve MPI iş yükleri için, her sırayı tek bir düğüme sabitleyin localalloc kullanarak her bir sırayı tek bir düğüme sabitleyin. Her sıra yerel belleğe sahip olur ve paralellik sıra düzeyinde gerçekleşir.

Pratik bir not: Tek bir düğüme sabitlerseniz, üzerinde 2–4 GB boş alan bırakın. Kapasitesinin neredeyse tamamını kullanan bir düğüm, geri kazanım işlemini tetikler ve bu da tasarruf etmeye çalıştığınız gecikme süresine mal olur.

Kontrol edilmesi gereken BIOS ve çekirdek ayarları

Araç çıktısı, yalnızca ürün yazılımının ortaya koyduğu topoloji kadar doğrudur. Doğrulanması gereken birkaç ayar:

  • Node Interleaving: devre dışı bırakın. Etkinleştirildiğinde, BIOS tüm belleği tek bir düz havuz olarak sunar ve NUMA'yı işletim sisteminden tamamen gizler. numactl --hardware Bu durumda, çok soketli bir kutuda tek bir düğüm gösterilir.
  • Sub-NUMA Kümeleme (Intel) veya Soket Başına Düğüm Sayısı (AMD): Daha hassas yerellik istediğinizde yüksek çekirdekli işlemcilerde etkinleştirin. lscpu : çoğu üretim sunucusu için 0 olarak ayarlayın. Sıfırdan farklı bir değer, uzaktan bellek ayırmak yerine yerel belleği agresif
  • vm.zone_reclaim_mode: Çoğu üretim sunucusu için 0 olarak ayarlayın. Sıfırdan farklı bir değer, uzaktan ayırmak yerine yerel belleği agresif bir şekilde geri kazanır; bu da yararlı sayfa önbelleğini boşaltabilir.
  • kernel.numa_balancing: genel amaçlı iş yükleri için açık bırakın, manuel olarak sabitleme yaparken kapatın. Otomatik dengeleyici, sayfaları ve iş parçacıklarını politikanızla çakışacak şekilde taşıyacaktır.

BIOS, çekirdek parametreleri ve IRQ afinitesini kontrol ettiğiniz bare metal üzerinde NUMA ayarlaması yapıyorsanız, hipervizör soyutlamalarını atlatmaya gerek kalmadan yukarıdakilerin tümünü uygulayabilirsiniz. Bu tür işlerin bulut sanal makinelerine kıyasla özel donanımlarda daha kolay olmasının ana nedeni budur.

Tam kök erişimi olan çok soketli özel sunucular için FDC'nin özel sunucularına bakın.

Blog

Bu hafta öne çıkanlar

Daha fazla makale
Linux Sunucu İş Yükü Optimizasyonu için Ayarlanmış Profiller

Linux Sunucu İş Yükü Optimizasyonu için Ayarlanmış Profiller

Örnekler ve Ansible dağıtım ipuçları ile GPU, veritabanı ve yüksek bant genişliğine sahip Linux sunucuları için ayarlanmış profillerin nasıl seçileceği, uygulanacağı ve özelleştirileceği.

16 dakikalık okuma - 9 Haziran 2026

VPS için Linux OOM Killer Tuning: Pratik Bir Kılavuz

12 dakikalık okuma - 8 Haziran 2026

Daha fazla makale
background image

Sorularınız mı var veya özel bir çözüme mi ihtiyacınız var?

icon

Esnek seçenekler

icon

Küresel erişim

icon

Anında dağıtım

icon

Esnek seçenekler

icon

Küresel erişim

icon

Anında dağıtım