
NUMA (tekdüze olmayan bellek erişimi, İngilizce: non-uniform memory access), çok işlemcili bilgisayarlarda bir işlemcinin belleğe erişim süresinin, erişilen verinin bellekteki yerine bağlı olduğu bellek düzenidir. Bu düzende bellek fiziksel olarak düğümlere dağıtılır ve her işlemci kendi düğümündeki yerel belleğe, başka bir düğümdeki uzak belleğe göre daha hızlı erişir. Bütün işlemciler yine de tek bir adres uzayını paylaşır; uzak bellek yazılımın gözünden yerel bellekle aynı biçimde kullanılır, fark yalnızca erişim süresindedir. Hennessy ve Patterson bu makineleri belleği fiziksel olarak dağıtılmış paylaşımlı bellekli çok işlemcililer diye sınıflandırır ve erişim süresi verinin konumuna bağlı olduğu için NUMA adıyla da anıldıklarını belirtir.
Bütün işlemcilerin tek bir ortak bellek denetleyicisini paylaştığı simetrik çok işlemcili (SMP) sistemlerde bu tek bağlantı, işlemciler aynı anda belleğe eriştiğinde darboğaza döner ve işlemci sayısı arttıkça iyi ölçeklenmez. NUMA, SMP'nin bu ölçeklenme sınırını aşmak için tasarlanmıştır; sisteme eklenen her düğüm toplam bellek bant genişliğini ve kapasitesini de artırır. 1990'ların ikinci yarısında Silicon Graphics'in Origin 2000'inin yanında Sequent NUMA-Q, Data General NUMALiiNE ve Convex Exemplar X de ticari olarak satılan önbellek tutarlı NUMA makineleriydi. Intel'e göre Sequent gibi şirketlerin öncü çalışmaları sayesinde bu düzen üst sınıf sunucularda yıllarca kullanılmış ve çağdaş işletim sistemlerinin çoğu ona göre eniyilenmiştir. Linux, Solaris ve Microsoft Windows, uygulamaların belleğin yerini denetleyebilmesi için NUMA sistem çağrıları sunar.
Temel kavramlar
İşlemcilerin hızı uzun süre belleğin hızından çok daha çabuk arttı. Hennessy ve Patterson'ın 1980'i taban alan karşılaştırmasında DRAM erişim gecikmesi yılda yalnızca yüzde 7 dolayında iyileşirken tek bir işlemcinin başarımı 1986'ya dek yılda yüzde 25, 2000'e dek yılda yüzde 52 artmış; aradaki uçurum ancak logaritmik ölçekle gösterilebilecek kadar açılmıştır. Bu yüzden işlemci çoğu zaman bellekten veri beklemek zorunda kalır (Von Neumann darboğazı, Bellek duvarı) ve bellek gecikmesini azaltmak yazılımın başarımını doğrudan artırır.
Belleğe yapılan erişimlerin sayısını azaltmanın başlıca yolu işlemciye yakın, küçük ve hızlı önbellekler kullanmaktır. Programlar yakın zamanda kullandıkları veriyi ve buyrukları yeniden kullanma eğilimindedir; bellek hiyerarşisi bu yerellikten yararlanır. Çok işlemcili sistemlerde sorun büyür, çünkü ortak bellek bütün işlemcilerin isteklerini karşılamak zorundadır. Hennessy ve Patterson'a göre belleği merkezde tutan simetrik çok işlemcililer genellikle sekiz ya da daha az çekirdekle sınırlıdır; daha çok işlemciyi desteklemek için bellek işlemciler arasında dağıtılmalıdır, yoksa bellek sistemi aşırı uzun erişim gecikmesine yol açmadan gereken bant genişliğini sağlayamaz.
NUMA bu soruna her işlemciye ya da küçük bir işlemci öbeğine ayrı bir bellek vererek yaklaşır. Belleği dağıtmak hem bant genişliğini artırır hem de yerel belleğin gecikmesini düşürür; bedeli, işlemciler arasında veri aktarımının karmaşıklaşması ve artan bant genişliğinden yararlanmak için yazılımdan daha çok çaba istenmesidir. Bir işlemcinin kendi yerel belleğine erişimi yalnızca daha kısa sürmekle kalmaz, düğümler arası bağlantıda ve uzak bellek denetleyicilerinde çekişmeye de yol açmaz; verinin doğru yerleştirilmesi sistemin toplam bant genişliğini artırır.
Her veri tek bir işe ait kalmaz ve birden çok işlemci aynı veriye ihtiyaç duyabilir. NUMA sistemleri bu durumlar için veriyi düğümler arasında taşıyan donanım ve yazılım düzenekleri içerir; örneğin Origin 2000 sayfa başına donanım erişim sayaçları ve bellek hızına yakın çalışan bir blok kopyalama birimiyle sayfaların göçünü ve çoğaltılmasını destekliyordu. NUMA'dan elde edilecek kazanç iş yüküne bağlıdır: yerel ile uzak erişim arasındaki fark büyüdükçe veri yerleşiminin getirisi artar, ama işlemci önbellekleri bellek erişimlerinin çoğunu karşılıyorsa ya da uygulamanın darboğazı giriş/çıkış ise NUMA eniyilemelerinin etkisi kalmaz.
Yerel ve uzak erişim
Hennessy ve Patterson, belleği merkezde tutan simetrik çok işlemcilileri tekdüze bellek erişimli (İngilizce: uniform memory access, UMA) çok işlemciler olarak da anar; bu makinelerde bellek birden çok bankaya ayrılmış olsa bile bütün işlemcilerin bellek gecikmesi aynıdır. NUMA'da ise erişim süresi işlemci ile hedef bellek arasındaki uzaklığa göre değişir. Linux çekirdeğinin belgeleri donanımı, her biri sıfır ya da daha çok işlemci, yerel bellek ve giriş/çıkış yolları taşıyabilen hücrelerden kurulmuş bir yapı olarak tanımlar; her hücre sistemin simetrik çok işlemcili bir alt kümesi gibi görülebilir ve hücreler bir çapraz anahtar ya da noktadan noktaya bağlantılarla birbirine bağlanır. Linux bu hücreleri "düğüm" denen yazılım soyutlamalarına eşler; bir sistemde birbirine farklı uzaklıkta duran düğümler olabilir. Bir düğümdeki bütün bellek, belirli bir işlemci için aynı erişim özelliklerini gösterir; Solaris bu düğümlere yerellik grubu (İngilizce: locality group) der.
Uzak erişim gecikmesinin yerel erişim gecikmesine oranına NUMA oranı denir; oran 1 olsaydı sistem UMA gibi davranırdı. Bu oran makineden makineye çok değişmiştir. Stanford DASH'te işlemcinin kendi kümesinde karşılanan bir okuma bulamaması 29 işlemci çevrimi (870 ns) sürerken uzak bir bulamama bunun yaklaşık 3,5 katı sürüyordu. SGI Origin 2000'de en yakın komşu düğüme yapılan uzak erişim yerel erişimin yaklaşık iki katıydı; Sequent NUMA-Q'da ise yerel bellek gecikmesi 250 ns dolayındayken en iyi durumdaki uzak gecikme bunun yaklaşık sekiz katına çıkıyordu. Lameter 2013'te, iki soketli ve bu yüzden iki NUMA düğümlü tipik bir sunucuda rastgele bir bellek erişiminin yaklaşık 100 ns sürdüğünü, uzak düğüme erişimin buna yüzde 50 daha eklediğini aktarır.
İşletim sistemi bu uzaklıkları açılışta BIOS ya da donanım yazılımının sağladığı ACPI tablolarından öğrenir. Linux'ta numactl --hardware komutu sistem yerellik bilgi tablosunu (İngilizce: system locality information table, SLIT) gösterir; alışılmış gösterimde yerel erişimin uzaklığı 10, iki kat pahalı bir uzak erişiminki 20'dir. Bazı üreticiler, özellikle iki düğümlü sistemlerde, gerçek gecikme farkına bakmadan doğrudan 10 ve 20 bildirir.
Önbellek tutarlı NUMA (ccNUMA)
İşlemciler bellek erişimlerindeki yerellikten yararlanmak için çekirdeğe yakın, küçük ve çok hızlı önbellekler kullanır. Paylaşılan veri önbelleklere alındığında aynı bellek konumunun birden çok kopyası oluşur ve bir yazmadan sonra bu kopyaların güncellenmesi ya da geçersizleştirilmesi gerekir. Ana belleği fiziksel olarak dağıtılmış olan ve önbellek tutarlılığını donanımda sağlayan makinelere önbellek tutarlı NUMA (İngilizce: cache-coherent NUMA, ccNUMA ya da CC-NUMA) denir.
Tutarlılığı donanımda sağlamayan NUMA sistemleri daha kolay tasarlanıp kurulabilir, ama o zaman tutarlılık sorumluluğu kullanıcıya ya da derleyiciye kalır. DASH'i tasarlayanlara göre sorunu kullanıcıya bırakmak, kullanıcıların programlama yükünden kaçmak için paylaşılan veriyi önbelleğe almaktan vazgeçebileceği karmaşık bir programlama modeli doğurur; tutarlılık donanımda sağlandığında ise derleyici gecikmeyi azaltmak için programları daha kapsamlı biçimde eniyileyebilir. Lameter da tutarlılığı sağlanmayan NUMA sistemlerinde yazmaların belleğe doğru sırayla ulaşmayabileceğini ve bu sistemler için kod yazmanın birçok güçlük taşıdığını belirtir. Linux'un desteklediği NUMA platformları da çoğunlukla ccNUMA sistemleridir; bunlarda bütün bellek her işlemciden erişilebilir ve tutarlılık işlemci önbelleklerince ya da sistem bağlantı ağınca donanımda sağlanır.
Küçük çok işlemcililerde tutarlılık çoğunlukla bütün önbelleklerin ortak yolu izlediği gözetleme protokolleriyle sağlanır; ama ortak yol ve önbellekler her işlemcinin her bellek isteğini işlemek zorunda kaldığından işlemci sayısı arttıkça doyar. ccNUMA sistemleri bu yüzden dizin tabanlı protokoller kullanır. Dizin, önbelleğe alınabilecek her bellek öbeğinin durumunu ve hangi düğümlerde kopyası olduğunu tutar; dizin bellekle birlikte düğümlere dağıtıldığında bir öbeğin paylaşım durumu her zaman bilinen tek bir yerde durur ve protokol yayına gerek duymaz. Bir adresin fiziksel belleğini ve dizin kaydını taşıyan düğüm (İngilizce: home node) adresten doğrudan hesaplanır; örneğin adresin yüksek anlamlı bitleri düğüm numarasını, düşük anlamlı bitleri o düğümdeki konumu verebilir. İsteği başlatan düğüm ile bu düğüm aynı olabilir, öbeğin kopyası ise üçüncü bir düğümde bulunabilir.
Uzak bir okuma bulamamasında istek bağlantı ağı üzerinden adresin dizinini tutan düğüme gider. Öbek bellekte güncelse veri doğrudan döner; başka bir düğümde değiştirilmiş durumdaysa istek o düğüme iletilir ve güncel veri oradan alınır. DASH'te bir istek sırasıyla işlemcinin önbelleğinden, işlemcinin kendi kümesinden, adresin dizinini tutan kümeden ve kopyayı taşıyan uzak kümeden geçebiliyordu; özel verilere yapılan erişimlerin çoğunda ilk küme ile dizini tutan küme aynı olduğundan bu dört düzey üçe iniyordu. Bu çok adımlı yol, birden çok işlemci aynı bellek bölgesine kısa aralıklarla eriştiğinde ccNUMA'nın başarımını düşürür. Culler ve Singh, Origin2000 üzerinde çoğunlukla uzak düğümlere ayrılmış konumlara yazan bir sıralama programında istek, geçersizleştirme ve yanıt selinin düğüm denetleyicilerinde ve belleklerde ağır çekişmeye yol açtığını gösterir. İşletim sistemleri bu yüzden işlemcileri ve belleği NUMA'ya uygun biçimde atayarak bu tür erişimlerin sıklığını azaltmaya çalışır.
Bellek denetleyicisi ve işlemciler arası bağlantı işlemci yongasının içine alındıkça düğüm tek bir yongaya indi. Compaq mühendislerinin tanıttığı Alpha 21364 (EV7), 152 milyon transistörlük tek bir kırmıkta bir Alpha 21264 çekirdeğini, 1,75 MB ikinci düzey önbelleği, tutarlılık donanımını, iki bellek denetleyicisini ve çok işlemcili bir yönlendiriciyi birleştiriyordu; bu işlemcilerden 128 tanesi iki boyutlu simit biçimli bir ağla bağlanabiliyor, ağ dizin tabanlı tutarlılığı açıkça destekliyordu. AMD Opteron gibi bellek denetleyicisini işlemciye tümleştiren sistemlerde bir düğüm genellikle tek bir işlemciden oluşur; SGI Altix ya da HP Superdome gibi daha geleneksel NUMA sistemlerinde ise belleği paylaşan iki ila dört işlemci daha büyük düğümler kurar.
Bağlantı ağları

Intel, 2008'de Nehalem ve Tukwila kod adlı mikromimarilerle birlikte ölçeklenebilir paylaşımlı bellek dediği NUMA düzenine geçti. O güne dek Intel işlemcileri belleğe, bellek denetleyicisini taşıyan yonga setine giden ortak bir sistem yolu (İngilizce: front-side bus) üzerinden erişiyordu; QuickPath mimarisinde ise her işlemcinin kendi tümleşik bellek denetleyicisi ve kendi belleği oldu, bir işlemcinin öteki işlemcinin belleğine erişimi noktadan noktaya QuickPath bağlantıları üzerinden yapıldı. Intel ilk QuickPath bağlantılarının saniyede 6,4 milyar aktarıma ve toplam 25 GB/s bant genişliğine ulaştığını duyurdu; şirket daha önce de Intel 8870 yonga setli sunucularda ölçeklenebilir paylaşımlı bellek kullanmıştı. Xeon Scalable ailesinde QuickPath'in yerini Ultra Path Interconnect (UPI) aldı. İşlemci başına iki ya da üç UPI bağlantısı olan bu aile iki soketten sekiz sokete kadar ölçeklenir; UPI, dizin tabanlı bir tutarlılık protokolü kullanır ve saniyede 10,4 milyar aktarıma kadar çalışır.
AMD'nin EPYC 9004 serisinde hesaplama yongacıkları (CCD) belleğe, giriş/çıkışa ve birbirine merkezdeki bir G/Ç kırmığı üzerinden bağlanır. AMD Infinity Fabric denen bu yapı çekirdek kompleksleri, bellek ve giriş/çıkış arasındaki veri yolunu ve denetimi sağlar; her yongacık G/Ç kırmığına kendine ayrılmış bir bağlantıyla bağlanır. G/Ç kırmığı önbellek tutarlılığını korumaya yardım eder ve veri yapısını ikinci bir işlemciye taşıyan en çok dört xGMI bağlantısı sunar. AMD bu işlemcileri, bir çekirdeğin bellek ve giriş/çıkış denetleyicilerine yakınlığına göre farklı gecikmeler görülebilen bir NUMA mimarisi olarak tanımlar.
Yonga içi NUMA bölgeleri

Tek bir soketin içi de tekdüze değildir; çekirdeğin kırmık üzerindeki konumu bile bellek denetleyicisine erişim gecikmesini değiştirir. Intel Xeon Scalable ailesindeki Sub-NUMA Clustering (SNC) özelliği bir işlemcinin içinde iki yerellik alanı kurar: bellek denetleyicilerinden birine eşlenen adresler son düzey önbelleğin o denetleyiciye yakın yarısındaki dilimlere, öteki denetleyicinin adresleri öbür yarıya eşlenir. Böylece aynı alandaki çekirdekler aynı alanın belleğini kullandığında daha düşük önbellek ve bellek gecikmesi görür. Alanlar işletim sistemine olağan NUMA yakınlık bilgileriyle bildirilir ve işletim sistemi görevleri zamanlarken ve belleği ayırırken bunları hesaba katabilir. SNC, belleğin bellek denetleyicileri arasında ince taneli serpiştirilmemesini gerektirir.
AMD EPYC 9004 serisinde aynı seçim BIOS'taki soket başına düğüm sayısı (İngilizce: nodes per socket, NPS) ayarıyla yapılır. NPS1'de bir soketin bütün bellek kanalları tek bir NUMA düğümü oluşturur ve bellek on iki kanalın hepsine serpiştirilir; AMD, soket içindeki bütün erişimlere tutarlı bir ortalama gecikme sağladığı için bulut sağlayıcılarının çoğunun bu ayarı kullandığını belirtir. NPS2 soketi altışar kanallı iki düğüme, NPS4 ise her birinde üç yongacık, üç bellek denetleyicisi ve bir G/Ç birimi olan dört çeyreğe böler. Bu düzende en kısa işlemci-bellek uzaklığı aynı çeyrek içinde, en uzunu çapraz köşedeki çeyrekler ya da iki işlemcili bir sistemde öteki işlemci arasındadır. NPS0 ise iki soketli bir sistemin bütününü tek bir NUMA düğümü yapar. Ayrıca her üçüncü düzey önbelleği ayrı bir NUMA düğümü olarak bildiren bir seçenek de vardır.
İşletim sistemi desteği
Lameter işletim sistemlerinin NUMA'yı ele alış yollarını beş öbekte toplar. En basiti farkı yok saymaktır: sistem çalışır, ama başarım belleğin nereye düştüğüne göre çalıştırmadan çalıştırmaya değişir. İkinci yolda donanım ardışık önbellek satırlarını farklı bellek denetleyicilerinden alarak belleği satır düzeyinde serpiştirir; NUMA etkileri ortalamaya dağılır ve işletim sisteminin farkı bilmesi gerekmez, ama bağlantı ağı sürekli kullanımda kalır ve başarım hiçbir zaman en iyi düzeye çıkmaz. Üçüncü yol, NUMA'yı tanıyan işletim sisteminin belleği sezgisel olarak işin çalıştığı düğümden vermesidir; dördüncüsünde yönetici bir uygulamanın bellek politikasını kodunu değiştirmeden araçlarla belirler, beşincisinde ise uygulama sistem çağrılarıyla her bellek bölgesinin nereden ayrılacağını kendisi seçer.
Linux, çekirdeğin 2.4 sürümünden beri NUMA platformlarını destekler; bugünkü bellek politikası altyapısı 2004'te 2.6 sürümüyle geldi. Linux, belleği olan her düğüm için boş ve kullanılan sayfa listeleri, istatistikleri ve kilitleri olan bağımsız bir bellek yönetimi alt sistemi kurar. Bir bellek isteğini öncelikle isteği yürüten işlemcinin bağlı olduğu düğümden karşılamaya çalışır; buna yerel tahsis denir. Yerel düğüm isteği karşılayamazsa NUMA uzaklığına göre sıralanmış öteki düğümlere geçer. Açılış sırasında çekirdek kendi veri yapılarını bütün düğümlere serpiştirerek ilk düğümün aşırı yüklenmesini önler, ilk kullanıcı süreci başladığında varsayılan politika yerel tahsise döner.
Uygulamalar ve yöneticiler bu varsayılanı bellek politikalarıyla değiştirebilir. Politika bütün sistem, bir süreç ya da bir sanal bellek bölgesi için tanımlanabilir ve daha dar kapsamlı politika genişini geçersiz kılar. MPOL_BIND belleğin yalnızca belirtilen düğümlerden alınmasını zorunlu kılar; MPOL_PREFERRED önce tek bir düğümü dener, yer yoksa uzaklığa göre öteki düğümlere geçer; MPOL_INTERLEAVE sayfaları belirtilen düğümlere sırayla dağıtır. Daha yeni MPOL_WEIGHTED_INTERLEAVE kipi dağıtımı düğüm başına ağırlıklarla yapar; örneğin 5 ve 2 ağırlıklı iki düğümde birinci düğüme her iki sayfaya karşılık beş sayfa düşer. Birçok iş parçacığının bütün düğümlerden sık eriştiği büyük ortak veri yapıları, bağlantı ağındaki yükü dengelemek için genellikle serpiştirilerek yerleştirilir.
Politika belirlemek kendi başına bellek ayırmaz. Sanal belleğin henüz dokunulmamış sayfalarına fiziksel bellek atanmamıştır; süreç bir sayfaya ilk kez eriştiğinde bir sayfa hatası oluşur ve çekirdek sayfayı o anda geçerli olan politikaya göre ayırır. Sayfanın nereye düşeceğini bu ilk dokunma belirler (İngilizce: first-touch policy). Aynı sayfayı birden çok iş parçacığı kullandığında sayfanın yerini ona ilk dokunan belirler; örneğin C kütüphanesinin sık kullanılan sayfaları açılışta onu ilk kullanan süreçlerce bir düğüme yerleştirilir ve sistem çalıştığı sürece orada kalır. Linux, sayfanın sanal adresini değiştirmeden fiziksel yerini başka bir düğüme taşıyabilir; migratepages aracı bir sürecin sayfalarını bir düğümden ötekine göçürür.
Yöneticiler için başlıca araç numactl'dir. Bu araç bir komutu belirli düğümlerin işlemcilerinde çalıştırabilir (--cpunodebind), belleğini belirli düğümlerle sınırlayabilir (--membind), bir düğümü yeğleyebilir (--preferred), belleği düğümlere serpiştirebilir (--interleave) ya da yerel tahsisi zorlayabilir (--localalloc). Daha eski ve yaygın taskset ise yalnızca bir işi işlemcilere bağlar. numastat ayırmaların ne kadarının yerel düğümden karşılandığını gösterir; numa_miss sayacı sistemin geri kazanımdan kaçınmak için belleği başka bir düğümden verdiği durumları sayar.
Kleen, NUMA'da düğüme bağlılığın simetrik çok işlemcilerdeki önbelleğe bağlılıktan daha önemli olduğunu vurgular. SMP'de bir iş parçacığı başka bir işlemciye geçtiğinde önbellek içeriği zamanla onunla birlikte taşınır; NUMA'da ise bir düğüme yerleşmiş bellek orada kalır ve başka düğümde çalışan iş parçacığının her erişimi bağlantı ağına yük bindirip gecikmeyi artırır. Linux'un zamanlayıcısı 3.8 sürümüne dek süreçlerin sayfalarının nerede durduğunu bilmiyordu; zamanlayıcı bir süreci başka düğüme taşıdığında sürecin belleği eski düğümde kalıyor, en iyi başarımı isteyen yöneticiler süreçleri taskset ya da cpuset'lerle düğüm sınırları içine sabitliyordu. Sonradan eklenen kendiliğinden NUMA dengelemesi, sayfaları düzenli aralıklarla eşlemeden çıkarıp ardından oluşan sayfa hatalarını yakalayarak hangi iş parçacığının hangi belleğe eriştiğini örnekler ve sık erişilen belleği ona erişen düğüme taşır. Bu örneklemenin ek yükü her zaman kazançla karşılanmaz; iş yükü zaten düğümlere bağlanmışsa özelliğin kapatılması önerilir.
Microsoft Windows da iş parçacıklarını kullandıkları belleğin bulunduğu düğümdeki işlemcilerde zamanlamaya, bellek isteklerini aynı düğümden karşılamaya çalışır ve gerektiğinde öteki düğümlere geçer. VirtualAllocExNuma gibi işlevler uygulamanın bir ayırma için yeğlediği düğümü belirtmesini sağlar; fiziksel sayfalar yine ilk kullanımda ayrılır. 64'ten çok mantıksal işlemcisi olan sistemlerde düğümler işlemci gruplarına yerleştirilir; Windows 10'un 20348 yapısından itibaren bir düğüm birden çok gruba yayılabilir ve gerçek NUMA topolojisi bildirilir. Solaris önemli çekirdek veri yapılarını her yerellik grubunda çoğaltır, FreeBSD ise donanımın satır düzeyinde serpiştirme yapamadığı sistemlerde belleği düğümlere sırayla dağıtabilir.
CXL ile bellek genişletme
Compute Express Link (CXL), belleğin işlemciye yeni bir bellek yolu arayüzüyle bağlanmasını sağlar. Yazılımın gözünden CXL belleği, özellikleri işlemciye doğrudan bağlı bellekten bağımsız olan işlemcisiz bir NUMA düğümü olarak görünür. Michigan Üniversitesi, Meta ve NVIDIA araştırmacılarının 2023'te ASPLOS'ta sunduğu TPP çalışmasında ana belleğin gecikmesi 80-140 ns, CXL belleğininki 170-250 ns aralığında verilir; iki büyük x86 işlemci üreticisi CXL belleğine erişimin iki soketli bir sistemdeki uzak erişim gecikmesine benzer olduğunu doğrulamıştır. TPP, soğuk sayfaları yavaş CXL düğümüne indiren, CXL düğümünde kalmış sık erişilen sayfaları ise yerel belleğe çıkaran bir işletim sistemi düzeneğidir; büyük bölümü Linux 5.18'e alınmış ve veri merkezi uygulamalarında varsayılan Linux'a göre yüzde 18'e varan iyileşme sağlamıştır.
Linux çekirdeği işlemcisiz bellek düğümlerini bellek isteği başlatan düğümler ile bellek hedefleri arasındaki erişim sınıflarıyla tanımlar; farklı ortam ve yollardan gelen bellekler aynı işlemci önbelleği tutarlılığını paylaşıp farklı başarım gösterebilir. Kendiliğinden NUMA dengelemesinin bir kipi de farklı bellek türleri arasında sayfa taşıyan bellek katmanlamasına ayrılmıştır. Microsoft Azure'da geliştirilen Pond sistemi ise CXL belleğini 8-16 soket arasında paylaşılan bir havuz olarak kullanır. Çalışmaya göre bu büyüklükteki bir havuz, aynı NUMA düğümündeki DRAM'e göre erişime 70-90 ns ekler; Pond havuz belleğini sanal makinenin konuk işletim sistemine çekirdeği olmayan bir sanal NUMA düğümü olarak sunar ve DRAM maliyetini, aynı düğüme yerleştirilmiş sanal makinelere göre yüzde 1-5 başarım farkıyla yüzde 7 azaltır. AMD EPYC 9004 serisi bu tür bellek genişletmesi için CXL 1.1+ desteği sunar.
NUMA ve kümeler
NUMA, sıkı bağlı bir küme biçimi olarak görülebilir. İleti geçirmeli makinelerde her işlemcinin belleğine yalnızca o işlemci erişir ve işlemciler arası iletişim açık iletilerle yapılır; bu makineler çok sayıda işlemciye kolayca ölçeklenir, ama verinin bölüştürülmesi ve yükün dağıtılması programcıya kalır. Küme mimarisine sanal bellek sayfalaması eklenerek paylaşımlı bellek tümüyle yazılımla da kurulabilir; bu paylaşımlı sanal bellek sistemlerinde tutarlılık sayfa düzeyinde, sayfa hataları üzerinden ve yazılımla sağlanır. Culler ve Singh'e göre 1997'deki temsilî bir sistemde uzak bir sayfa hatasını karşılamanın gidiş dönüş maliyeti birkaç yüz mikrosaniyeden bir milisaniyenin üstüne dek çıkıyordu; aynı dönemde DASH'te uzak bir önbellek bulamaması yaklaşık 3 mikrosaniye sürüyordu.
NUMA'nın bir başka seçeneği yalnız önbelleklerden oluşan bellek mimarisidir (İngilizce: cache-only memory architecture, COMA). Bu makinelerde her düğümün ana belleği, önbellek satırı büyüklüğündeki parçalara etiket eklenerek çok büyük bir önbelleğe çevrilir; veri, erişim örüntüsüne göre ana bellek düzeyinde kendiliğinden göç eder ve çoğaltılır. Stenström, Joe ve Gupta'nın 1992'de ISCA'da sunduğu karşılaştırmaya göre COMA'nın üstünlüğü, kapasite bulamamalarının tutarlılık kaynaklı bulamamalardan baskın olduğu ve farklı işlemcilerin erişimlerinin bellekte ince taneli iç içe geçtiği uygulamalarla sınırlıdır; öteki durumlarda hiyerarşik dizinlerin uzattığı gecikmeler yüzünden ccNUMA'dan kötü bile olabilir.
COMA'nın daha ucuz bir biçimi olan Simple COMA (S-COMA), ccNUMA ile aynı tutarlılık protokolünü kullanır, ama düğümün ana belleğinin bir bölümünü uzak sayfalar için büyük bir önbellek olarak ayırır ve bu sayfa önbelleğinin etiketleri yerine olağan adres çevirme donanımından yararlanır. Babak Falsafi ile David A. Wood'un 1997'de ISCA'da sunduğu Reactive NUMA (R-NUMA) bildirisine göre ana bellekte duran sayfa önbelleği bir ccNUMA düğümünün küme önbelleğinden çok büyük olabildiği için uzak bulamamaları azaltabilir; buna karşılık bu önbellekte yer ayırmak işletim sisteminin araya girmesini gerektirir ve sayfa büyüklüğündeki iri taneler, geniş ve seyrek veri kümeleri olan programlarda iç parçalanmaya yol açabilir. R-NUMA iki yaklaşımı birleştirir: uzak sayfaların hepsini önce ccNUMA biçiminde ayırır, her düğümde sayfa başına bir sayaçla bir veri öbeğinin çakışma ya da kapasite bulamaması yüzünden kaç kez yeniden getirildiğini sayar ve sayaç bir eşiği aşınca işletim sistemi sayfayı S-COMA sayfa önbelleğine taşır. Böylece her düğüm her sayfa için iki protokolden uygun olanı kendisi seçer. Bildiri, R-NUMA'nın en kötü durumdaki başarımının iki protokolden iyi olanın iki üç katıyla sınırlı kaldığını kuramsal olarak gösterir; benzetimlerde R-NUMA çoğu zaman iki protokolden de iyi sonuç vermiş, en kötü durumda en iyisinin yüzde 57 gerisinde kalmıştır.
Falsafi'nin de yazarları arasında olduğu ve 2014'te ASPLOS'ta sunulan Scale-Out NUMA (soNUMA), sunucular arasında sık iletişim gerektiren bellek içi veri merkezi uygulamaları için RDMA'dan esinlenen bir programlama modelini durumsuz bir ileti protokolüyle doğrudan bir NUMA bellek dokusunun üzerine kurar. Düğümün yerel tutarlılık hiyerarşisine eklenen uzak bellek denetleyicisi sayesinde benzetimlerde uzak okumalar yerel DRAM gecikmesinin en çok dört katı sürmüştür.
Tarihçe

Her bellek öbeği için o öbeğin hangi önbelleklerde kopyası olduğunu izleyen bir dizin kaydı tutma düşüncesi 1970'lerin sonunda Censier ve Feautrier'ce önerildi, ama ilk dizin yapıları merkezî olduğu için kısa sürede darboğaz oluşturuyordu. Stanford Üniversitesi Bilgisayar Sistemleri Laboratuvarı'nda Daniel Lenoski, James Laudon, Anoop Gupta, John L. Hennessy ve arkadaşlarının geliştirdiği DASH (İngilizce: Directory Architecture for Shared Memory) dizini ve belleği düğümlere dağıtarak bu sınırı aştı. 1990'da yayımlanan tutarlılık protokolü yayına dayanmıyor, işlemciler ile bellekler arasında noktadan noktaya iletiler kullanıyordu; isteklerin tek bir noktada sıraya konmasına ya da tek bir denetim noktasına da gerek duymuyordu. DASH'in prototipi ölçeklenebilir bir önbellek tutarlılığı düzeneği taşıyan ilk çalışan makineydi. Her küme dört adet 33 MHz'lik MIPS R3000 işlemcisi taşıyan bir Silicon Graphics 4D/340 iş istasyonuydu; kümeler biri isteklere, öteki yanıtlara ayrılmış iki kafes ağla bağlanıyor ve sistem 16 kümede en çok 64 işlemciye ulaşıyordu. Dizin, her bellek öbeği için 16 kümenin her birine bir bit ayıran bir bit vektörüydü. DASH donanımda bırakma erişim sıralamasını da destekliyordu; tasarımcılarının benzetimlerinde bu model ardışık erişim sıralamasına göre yüzde 10-40 başarım kazancı sağlamıştı.
Silicon Graphics'ten Laudon ve Lenoski, Origin 2000'i 1997'de ISCA'da tanıttı. Mimari en çok 512 düğümü, 1024 işlemciyi ve 1 TB belleği destekliyordu; her düğümde bir ya da iki MIPS R10000 işlemcisi, 4 GB'a kadar bellek ve bu belleğin dizini vardı. Düğümler SPIDER yönlendiricileriyle kurulan bir hiperküp ağıyla bağlanıyordu ve tutarlılık protokolü DASH'inkine benziyordu. Tasarımcılar, önceki Power Challenge sisteminin 36 işlemcilik sınırını aşmak için ortak yollu SMP yerine dağıtık belleği seçtiklerini, uzak ile yerel bellek gecikmesi arasındaki farkı küçük tutmayı hedeflediklerini yazar.
Aynı yıllarda başka ticari ccNUMA sistemleri de çıktı. Sequent NUMA-Q en çok 63 düğümden oluşuyordu; her düğüm dört Pentium Pro işlemcili bir SMP'ydi ve düğümler bir SCI halkasıyla bağlanıyordu. Data General NUMALiiNE mimari olarak NUMA-Q'ya çok benziyordu. HP/Convex Exemplar X ise on altı işlemcili, çapraz anahtarla bağlı hiperdüğümleri değiştirilmiş bir SCI protokolüyle çalışan halkalarla bağlıyordu ve 512 işlemciye ölçeklenebiliyordu; uzak veriler için üçüncü düzey bir küme önbelleği kullanıyordu. NUMA-Q, tutarlılığı IEEE'nin SCI (İngilizce: Scalable Coherent Interface) standardındaki önbellek tabanlı dizin protokolüyle sağlıyor, uzak verileri her düğümdeki IQ-Link kartının uzak veri önbelleğinde tutuyor ve veritabanları gibi ticari iş yüklerini hedefliyordu.
SGI'ın Altix ve UV sistemlerinde birden çok kasadaki işlemciler NUMALINK adlı özel bir bağlantıyla birleştiriliyordu ve bu ürünleri tasarlayanlar Linux çekirdeğini NUMA'yı desteklemek için değiştirmek zorunda kaldı. İşlemciler hızlandıkça belleğin doğrudan işlemcinin soketine bağlanması gerekti; Lameter 2013'te NUMA sistemlerine en çok çok soketli sunucularda rastlandığını, bellek denetleyicileri çekirdeklere yaklaştıkça NUMA'nın daha da yaygınlaşacağını yazıyordu.
Ayrıca bakınız
Kaynakça
- ^ a b c d e f g h i j Hennessy, John L.; Patterson, David A. (2012). Computer Architecture: A Quantitative Approach. 5. (İngilizce). Morgan Kaufmann. ss. 45, 72-73, 346-348, 378-382. ISBN 978-0-12-383872-8.
- ^ a b c d e f Kleen, Andreas (Nisan 2005). "A NUMA API for Linux" (PDF) (İngilizce). Novell. Erişim tarihi: 30 Eylül 2026. Arşivlenmesi gereken bağlantıya sahip kaynak şablonu içeren maddeler (link)
- ^ a b c d e Laudon, James; Lenoski, Daniel (Mayıs 1997). The SGI Origin: A ccNUMA Highly Scalable Server. 24th Annual International Symposium on Computer Architecture (ISCA '97) (İngilizce). ss. 241-251. doi:10.1145/264107.264206.
- ^ a b "Intel QuickPath Architecture (White Paper)" (PDF) (İngilizce). Intel. 2008. Erişim tarihi: 30 Eylül 2026. Arşivlenmesi gereken bağlantıya sahip kaynak şablonu içeren maddeler (link)
- ^ a b c d e f g h i j k l m n o p q r Lameter, Christoph (2013). "NUMA (Non-Uniform Memory Access): An Overview". ACM Queue (İngilizce). 11 (7). ss. 40-51. doi:10.1145/2508834.2513149.
- ^ a b c d Sarcar, Kanoj. "What is NUMA?" (İngilizce). The Linux Kernel documentation. Erişim tarihi: 30 Eylül 2026. Arşivlenmesi gereken bağlantıya sahip kaynak şablonu içeren maddeler (link)
- ^ Ergin, Oğuz (2026). Bilgisayar Mimarisi: RISC-V Tabanlı Yaklaşım. 0.4.8. doi:10.5281/zenodo.18903608. ISBN 978-625-00-6081-0.
- ^ a b c d e f g h Lenoski, Daniel; Laudon, James; Gharachorloo, Kourosh; Weber, Wolf-Dietrich; Gupta, Anoop; Hennessy, John; Horowitz, Mark; Lam, Monica S. (Mart 1992). "The Stanford Dash multiprocessor". Computer (İngilizce). 25 (3). ss. 63-79. doi:10.1109/2.121510.
- ^ a b c d Culler, David E.; Singh, Jaswinder Pal; Gupta, Anoop (1999). "8. ve 9. bölümler". Parallel Computer Architecture: A Hardware/Software Approach (İngilizce). Morgan Kaufmann. ISBN 1-55860-343-3.
- ^ Mukherjee, Shubhendu S.; Bannon, Peter; Lang, Steven; Spink, Aaron; Webb, David (2002). "The Alpha 21364 network architecture". IEEE Micro (İngilizce). 22 (1). ss. 26-35. doi:10.1109/40.988687.
- ^ a b Mulnix, David L. (1 Aralık 2022). "Intel Xeon Processor Scalable Family Technical Overview" (İngilizce). Intel. Erişim tarihi: 30 Eylül 2026. Arşivlenmesi gereken bağlantıya sahip kaynak şablonu içeren maddeler (link)
- ^ a b c "BIOS & Workload Tuning Guide for AMD EPYC 9004 Processors (Publication 58011)" (İngilizce). AMD. Mayıs 2025. Erişim tarihi: 30 Eylül 2026. Arşivlenmesi gereken bağlantıya sahip kaynak şablonu içeren maddeler (link)
- ^ a b c "NUMA Memory Policy" (İngilizce). The Linux Kernel documentation. Erişim tarihi: 30 Eylül 2026. Arşivlenmesi gereken bağlantıya sahip kaynak şablonu içeren maddeler (link)
- ^ "numactl(8), Linux manual page" (İngilizce). man7.org. Erişim tarihi: 30 Eylül 2026. Arşivlenmesi gereken bağlantıya sahip kaynak şablonu içeren maddeler (link)
- ^ a b "Documentation for /proc/sys/kernel/ (numa_balancing)" (İngilizce). The Linux Kernel documentation. Erişim tarihi: 30 Eylül 2026. Arşivlenmesi gereken bağlantıya sahip kaynak şablonu içeren maddeler (link)
- ^ "NUMA Support" (İngilizce). Microsoft Learn. 14 Temmuz 2025. Erişim tarihi: 30 Eylül 2026. Arşivlenmesi gereken bağlantıya sahip kaynak şablonu içeren maddeler (link)
- ^ Maruf, Hasan Al; Wang, Hao; Dhanotia, Abhishek; Weiner, Johannes; ve diğerleri. (2023). TPP: Transparent Page Placement for CXL-Enabled Tiered-Memory. 28th ACM International Conference on Architectural Support for Programming Languages and Operating Systems (ASPLOS '23) (İngilizce). ss. 742-755. doi:10.1145/3582016.3582063.
- ^ "NUMA Locality" (İngilizce). The Linux Kernel documentation. Erişim tarihi: 30 Eylül 2026. Arşivlenmesi gereken bağlantıya sahip kaynak şablonu içeren maddeler (link)
- ^ Li, Huaicheng; Berger, Daniel S.; Hsu, Lisa; Ernst, Daniel; ve diğerleri. (2023). Pond: CXL-Based Memory Pooling Systems for Cloud Platforms. 28th ACM International Conference on Architectural Support for Programming Languages and Operating Systems (ASPLOS '23) (İngilizce). ss. 574-587. doi:10.1145/3575693.3578835.
- ^ a b Lenoski, Daniel; Laudon, James; Gharachorloo, Kourosh; Gupta, Anoop; Hennessy, John (1990). The directory-based cache coherence protocol for the DASH multiprocessor. 17th Annual International Symposium on Computer Architecture (ISCA '90) (İngilizce). ss. 148-159. doi:10.1145/325164.325132.
- ^ Stenström, Per; Joe, Truman; Gupta, Anoop (1992). Comparative performance evaluation of cache-coherent NUMA and COMA architectures. 19th Annual International Symposium on Computer Architecture (ISCA '92) (İngilizce). ss. 80-91. doi:10.1145/139669.139705.
- ^ Falsafi, Babak; Wood, David A. (Mayıs 1997). Reactive NUMA: A Design for Unifying S-COMA and CC-NUMA. 24th Annual International Symposium on Computer Architecture (ISCA '97) (İngilizce). ss. 229-240. doi:10.1145/264107.264205.
- ^ Novakovic, Stanko; Daglis, Alexandros; Bugnion, Edouard; Falsafi, Babak; Grot, Boris (2014). Scale-out NUMA. 19th International Conference on Architectural Support for Programming Languages and Operating Systems (ASPLOS '14) (İngilizce). ss. 3-18. doi:10.1145/2541940.2541965.
