📌 NUMA

NUMA (Non-Uniform Memory Access, неоднородный доступ к памяти) — архитектурная модель многопроцессорных систем, в которой каждый процессор имеет собственный локальный блок памяти с низкой задержкой доступа и может обращаться к памяти других процессоров с более высокой задержкой. NUMA позволяет масштабировать производительность и память в многопроцессорных системах, снижая узкие места традиционного общего доступа к памяти.


🧠 Как работает

Основная концепция

  • Система разбита на несколько узлов (nodes), каждый содержит процессор(ы) и локальную память.
  • Доступ к локальной памяти узла происходит быстро (низкая задержка, высокая пропускная способность).
  • Доступ к памяти других узлов — более медленный, с увеличенной задержкой.
  • Общая память адресуется единой системой, но время доступа зависит от физического расположения данных.

Аппаратная реализация

  • Процессоры соединены через высокоскоростные межузловые шины/интерконнекты (HyperTransport, QPI, Infinity Fabric, NVLink).
  • Каждому процессору предоставляется таблица адресов, позволяющая локализовать память и различать локальную/удалённую.
  • Контроллер памяти и маршрутизаторы адресов координируют запросы.

Схема NUMA-системы

flowchart TB
    CPU0["CPU Node 0"]
    MEM0["Local Memory 0"]
    CPU1["CPU Node 1"]
    MEM1["Local Memory 1"]
    CPU2["CPU Node 2"]
    MEM2["Local Memory 2"]

    CPU0 --> MEM0
    CPU1 --> MEM1
    CPU2 --> MEM2

    CPU0 --- CPU1
    CPU1 --- CPU2
    CPU2 --- CPU0

Особенности доступа

  • Локальный доступ: быстрый, минимальные задержки.

  • Удалённый доступ: медленнее, из-за межузловой передачи.

  • ОС и приложение должны учитывать распределение памяти для оптимизации производительности (например, через numactl в Linux).


⚙️ Где применяется

  • Высокопроизводительные серверы, кластерные системы, дата-центры.

  • Многоядерные/многопроцессорные системы с большим объёмом памяти.

  • Виртуализация и облачные платформы.

  • Системы с высокой нагрузкой на память (базы данных, аналитика, HPC).

  • Процессоры и платформы: AMD EPYC, Intel Xeon Scalable, IBM POWER, ARM Neoverse.


✅ Преимущества

  • Масштабируемость: позволяет расширять систему с большим числом процессоров и памяти.

  • Повышенная производительность: локальный доступ к памяти быстрее, снижает узкие места.

  • Гибкость архитектуры: оптимизация распределения памяти и нагрузки.

  • Поддержка крупных рабочих нагрузок: HPC, базы данных, виртуализация.


❌ Недостатки

  • Сложность программирования: необходимость учитывать локализацию памяти, оптимизировать распределение.

  • Нестабильность производительности: удалённый доступ медленнее и может стать узким местом.

  • Дополнительные накладные расходы: управление маршрутизацией памяти и синхронизацией.

  • Совместимость: не все ОС и приложения эффективно работают с NUMA без настройки.


🔗 Связанные технологии

CPU, Memory Controller, Cache Coherence, Interconnect, QPI, HyperTransport, NVLink, numactl, Virtualization, HPC, Distributed Computing, Memory Latency, SMP


Резюме

NUMA — архитектурный подход к организации памяти в многопроцессорных системах, позволяющий масштабировать объём и пропускную способность памяти, минимизируя задержки при локальном доступе. Требует осознанного подхода к распределению данных и вычислений, чтобы использовать преимущества локальной памяти и минимизировать дорогие удалённые обращения. Ключевая технология для современных серверов и высокопроизводительных вычислительных систем.


Примеры кода

Linux: просмотр NUMA узлов и памяти

numactl --hardware
cat /sys/devices/system/node/node*/meminfo

Linux: запуск процесса с привязкой к NUMA узлу

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

C: использование libnuma для распределения памяти

#include <numa.h>
#include <stdio.h>
 
int main() {
    if (numa_available() < 0) {
        printf("NUMA not supported.\n");
        return 1;
    }
    numa_set_preferred(0); // Предпочтительно использовать узел 0
    char *buf = numa_alloc_onnode(1024*1024, 0);
    // Использовать buf
    numa_free(buf, 1024*1024);
    return 0;
}

Источники: Intel® Architectures Optimization Manual, AMD EPYC Architecture, Linux Kernel Documentation, Wikipedia, osdev.org, habr.com, papers on NUMA performance and design.