Özel Sunucular için NUMA Farkındalığı ve CPU Sabitleme
16 dakikalık okuma - 16 Haziran 2026

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:
lscpuhızlı bir soket ve düğüm özeti için.numactl --hardwaredüğüm bellek toplamları ve düğümler arası mesafe matrisi için.numastatiş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ç | Kontroller | Kullanım |
|---|---|---|
taskset | Yalnızca CPU çekirdekleri | Mevcut bir işlemin hızlı tek seferlik bağlanması |
numactl | CPU çekirdekleri ve bellek | Sıkı yerellik ile iş yüklerini başlatma |
| systemd | CPU ç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 --hardwareArdından, hem çekirdekler hem de bellek için o düğüme bağlı uygulamayı başlatın:
numactl --cpunodebind=0 --membind=0 ./your_applicationZaten ç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=0Yeniden 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=0Bunu /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ü | Politika | Neden |
|---|---|---|
| Veritabanları (PostgreSQL, MySQL, SQL Server) | --cpunodebind + --membind | Büyük paylaşımlı arabellekler, gecikmeye duyarlı sorgu yolları |
| Bellek içi önbellek (Redis, Memcached) | Tek düğüm bağlama | Her şey RAM erişimidir, uzaktan gecikme anında ortaya çıkar |
| AI/ML eğitimi ve çıkarım | GPU'nun NUMA düğümüne bağlanma | PCIe köklerini geçen tensör aktarımlarını önler |
| Analitik (Spark, Elasticsearch) | --interleave=all | Büyük çalışma kümesi, tüm düğümlerde bant genişliği gerektirir |
| Gecikmeye duyarlı API'ler, ticaret | Sıkı pin + IRQ afinitesi | Tahmin 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ın | Kesme 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 --hardwareBu 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.

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

Sorularınız mı var veya özel bir çözüme mi ihtiyacınız var?
Esnek seçenekler
Küresel erişim
Anında dağıtım
Esnek seçenekler
Küresel erişim
Anında dağıtım