📌 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.