Открыть сервис

NUMA

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

История

Концепция NUMA возникла как ответ на ограничения масштабирования SMP-систем. В SMP-архитектуре все процессоры разделяют общую шину памяти, что при увеличении числа процессоров приводит к конфликтам и резкому падению производительности. Первые коммерческие реализации NUMA появились в 1990-х годах.

Ранние разработки

Одним из пионеров стала компания Sequent Computer Systems, выпустившая в 1991 году систему Sequent NUMA-Q. В 1995 году Silicon Graphics представила архитектуру SGI Origin 2000, которая использовала NUMA для масштабирования до сотен процессоров. В 1996 году компания Data General представила систему AViiON с архитектурой NUMA, основанную на процессорах Intel Pentium Pro.

Развитие в 2000-х годах

С выходом 64-разрядных процессоров Intel Itanium и AMD Opteron архитектура NUMA стала массовой. AMD в 2003 году внедрила NUMA в процессоры Opteron с помощью технологии HyperTransport, что позволило строить двух- и четырёхпроцессорные системы без отдельного контроллера памяти на материнской плате. Intel последовала этому примеру, начиная с архитектуры Nehalem (2008 год), где контроллер памяти был интегрирован в процессор.

Современное состояние

Начиная с 2010-х годов NUMA стала стандартом для серверных и высокопроизводительных систем. Все современные многопроцессорные серверы на архитектурах x86-64 (AMD EPYC, Intel Xeon), ARM (например, Ampere Altra) и POWER (IBM) используют NUMA. В 2020-х годах NUMA также применяется в гетерогенных системах, объединяющих центральные процессоры (CPU) и графические процессоры (GPU) с общей памятью.

Принцип работы

В системе NUMA вся оперативная память делится на несколько доменов (узлов). Каждый узел содержит один или несколько процессоров и локальный контроллер памяти. Процессор обращается к своей локальной памяти с минимальной задержкой (обычно 50–100 нс). При обращении к памяти другого узла данные передаются через межсоединение (например, Intel UPI, AMD Infinity Fabric, IBM PowerBus), что увеличивает задержку в 1,5–3 раза.

Топологии

Архитектуры NUMA различаются по способу соединения узлов:

  • Топология «звезда» — один центральный узел соединён со всеми остальными. Проста, но центральный узел становится узким местом.
  • Топология «кольцо» — узлы соединены последовательно. Увеличивает задержки для удалённых узлов.
  • Топология «гиперкуб» — каждый узел соединён с несколькими соседними. Обеспечивает низкую задержку для большинства пар узлов.
  • Топология «полный граф» — каждый узел соединён с каждым. Максимальная производительность, но сложность и стоимость растут квадратично.

Когерентность кэша

Ключевая проблема NUMA — поддержание когерентности кэш-памяти (cache coherence). Если один процессор изменяет данные в своей локальной памяти, другие процессоры, имеющие копию этих данных в своих кэшах, должны получить уведомление. Для этого используется протокол когерентности (например, MESI или MOESI), который реализуется аппаратно через межсоединение. В системах с большим числом узлов (более 32) накладные расходы на поддержание когерентности могут снижать производительность.

Классификация

Архитектуры NUMA делятся на два основных типа:

  • ccNUMA (Cache-Coherent NUMA) — аппаратно поддерживает когерентность кэша. Это наиболее распространённый тип, используемый в современных серверах. Примеры: Intel Xeon Scalable, AMD EPYC.
  • ncNUMA (Non-Cache-Coherent NUMA) — когерентность кэша не поддерживается, что требует программного управления. Используется в некоторых суперкомпьютерах и встраиваемых системах, где важна простота и низкое энергопотребление.

Преимущества и недостатки

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

  • Масштабируемость — NUMA позволяет строить системы с десятками и сотнями процессоров, тогда как SMP ограничена 8–16 процессорами.
  • Пропускная способность — каждый узел имеет собственную полосу пропускания к памяти, что увеличивает общую производительность при параллельных вычислениях.
  • Энергоэффективность — процессоры могут получать доступ к локальной памяти с меньшим энергопотреблением, чем через общую шину.

Недостатки

  • Неравномерность доступа — программисты и операционные системы должны учитывать топологию NUMA для оптимального размещения данных и потоков. Игнорирование этого может привести к снижению производительности на 20–50 %.
  • Сложность аппаратной реализации — требуется дорогостоящее межсоединение и поддержка когерентности кэша.
  • Проблема «удалённой памяти» — при интенсивном обмене данными между узлами задержки могут стать критическими.

Программная поддержка

Операционные системы и прикладное программное обеспечение должны быть оптимизированы для NUMA. Основные механизмы:

  • NUMA-аффинность — привязка процессов и потоков к конкретным узлам, чтобы они использовали локальную память. В Linux это реализуется через системные вызовы sched_setaffinity и mbind.
  • Политики размещения памятиоперационная система может размещать память на том же узле, что и процесс (локальная политика), или балансировать нагрузку между узлами.
  • Профилированиеинструменты (например, numactl, perf, likwid) позволяют анализировать обращения к памяти и выявлять узкие места.

Примеры в операционных системах

  • Linux — поддерживает NUMA с версии 2.5 (2002 год). Использует планировщик, учитывающий топологию NUMA, и библиотеку libnuma.
  • Windows — поддержка NUMA появилась в Windows Server 2003 и Windows Vista. В Windows 10 и 11 используется для серверных и рабочих станций.
  • FreeBSD — поддержка NUMA реализована с версии 12.0 (2018 год).

Применение

NUMA используется в областях, требующих высокой производительности и масштабирования:

  • Серверы баз данных — системы управления базами данных (Oracle, Microsoft SQL Server, PostgreSQL) оптимизированы для NUMA, чтобы распределять нагрузку между узлами.
  • Высокопроизводительные вычисления (HPC) — суперкомпьютеры, такие как «Ломоносов-2» (МГУ) и «Кристофари» (Россия), используют NUMA для объединения тысяч процессоров.
  • Виртуализация — гипервизоры (VMware vSphere, KVM) распределяют виртуальные машины по узлам NUMA для минимизации задержек.
  • Облачные вычисления — провайдеры (Yandex Cloud, VK Cloud) используют NUMA-серверы для обеспечения производительности многопользовательских нагрузок.

Примеры систем

  • AMD EPYC (серия 7000 и выше) — процессоры с поддержкой NUMA через технологию Infinity Fabric. В двухпроцессорной системе каждый процессор имеет свой контроллер памяти, образуя два узла NUMA.
  • Intel Xeon Scalable (3-го поколения и выше) — использует межсоединение Intel UPI (Ultra Path Interconnect) для соединения до 8 процессоров в единую NUMA-систему.
  • IBM Power9 и Power10 — архитектура с поддержкой NUMA, используемая в серверах IBM Power Systems для критически важных приложений.

Интересные факты

  • Термин «NUMA» впервые был введён в 1980-х годах исследователями из Университета Карнеги — Меллон (США) при разработке проекта «Cm*».
  • В 2019 году компания Huawei представила процессор Kunpeng 920, который использует NUMA для объединения до 64 ядер в одном узле.
  • В России системы с NUMA применяются в суперкомпьютерах МГУ («Ломоносов-2»), МФТИ (МФТИ-2) и в вычислительных кластерах «Росатома».

Источники

  • Hennessy, J. L., & Patterson, D. A. (2019). Computer Architecture: A Quantitative Approach. 6th ed. Morgan Kaufmann.
  • Intel Corporation. (2021). Intel Xeon Processor Scalable Family Technical Overview.
  • AMD. (2022). AMD EPYC Processor Architecture.
  • Linux man pages: numactl(8), sched_setaffinity(2), mbind(2).
  • Документация Microsoft: «NUMA Support in Windows Server».

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →