Неоднородный доступ к памяти¶
Неоднородный доступ к памяти (англ. Non-Uniform Memory Access, NUMA) — это архитектура организации компьютерной памяти, используемая в многопроцессорных системах, при которой время доступа к различным областям оперативной памяти зависит от того, к какому процессору (или группе процессоров) она физически привязана. В отличие от симметричной многопроцессорной архитектуры (SMP) с однородным доступом (UMA), где все процессоры имеют равное время доступа ко всей памяти, в NUMA-системах память разделена на локальные и удалённые зоны, что позволяет масштабировать вычислительные системы до сотен и тысяч ядер без критического роста задержек.
¶История
Идея неоднородного доступа к памяти возникла в 1980-х годах как ответ на ограничения SMP-архитектур. В SMP-системах все процессоры подключаются к общей шине памяти, что при увеличении числа процессоров приводит к перегрузке шины и росту задержек. Первые коммерческие NUMA-системы появились в начале 1990-х годов: например, машины семейства BBN Butterfly (Bolt Beranek and Newman) и системы Sequent NUMA-Q. В 1995 году компания Silicon Graphics (SGI) выпустила систему SGI Origin 2000, которая стала одной из первых широко распространённых NUMA-архитектур для рабочих станций и серверов.
В 2000-х годах NUMA стала стандартом для серверов на базе процессоров Intel Itanium 2 и AMD Opteron. В 2007 году Intel внедрила NUMA-архитектуру в процессоры Xeon серии 7300, а с 2010-х годов NUMA является неотъемлемой частью всех многопроцессорных систем x86-64, включая серверы на базе AMD EPYC и Intel Xeon Scalable. В современных суперкомпьютерах и системах с процессорами ARM (например, Fujitsu A64FX) NUMA также применяется для управления памятью.
¶Принцип работы
В NUMA-системе вся оперативная память физически делится на несколько узлов (NUMA-узлов), каждый из которых привязан к одному или нескольким процессорам (или ядрам) через контроллер памяти. Каждый процессор имеет прямой доступ к своему локальному узлу памяти с минимальной задержкой (обычно 50–100 нс). Доступ к памяти другого узла (удалённой) осуществляется через межсоединения (например, Intel UPI, AMD Infinity Fabric, IBM PowerBus) и занимает в 1,5–3 раза больше времени.
¶Ключевые понятия
- NUMA-узел — группа процессоров (ядер) и связанная с ними локальная память.
- Локальная память — память, физически подключённая к контроллеру памяти данного узла.
- Удалённая память — память, принадлежащая другому узлу.
- Межсоединение — канал передачи данных между узлами (например, шина, кольцо, сетка).
- Политика размещения — стратегия, определяющая, на каком узле выделяется память для процесса (например, first-touch, round-robin, interleaving).
¶Типы NUMA
- Аппаратная NUMA (ccNUMA) — когерентная NUMA, где аппаратно обеспечивается согласованность кэшей всех процессоров. Примеры: процессоры AMD EPYC, Intel Xeon.
- Программная NUMA — эмуляция неоднородного доступа через операционную систему, часто используется в виртуализации.
- Гибридная NUMA — комбинация аппаратной и программной поддержки, применяемая в суперкомпьютерах (например, Cray XC).
¶Архитектура и устройство
Современные NUMA-системы строятся на основе многоядерных процессоров, каждый из которых содержит встроенный контроллер памяти (IMC). Например, в процессоре AMD EPYC 7763 (64 ядра) имеется 8 контроллеров памяти, каждый из которых обслуживает до 2 каналов DDR4. Таким образом, процессор сам является NUMA-узлом, а его ядра делятся на группы (CCD — Core Complex Die), каждая из которых имеет доступ к своему сегменту памяти.
В многопроцессорных серверах (например, с 4 или 8 процессорами) каждый процессор образует отдельный NUMA-узел. Межсоединения между процессорами (например, Infinity Fabric у AMD или UPI у Intel) образуют топологию: кольцо, сетка 2D-тор, гиперкуб. В системах с большим числом узлов (например, суперкомпьютер Fugaku с 7 630 848 ядрами) используется иерархическая NUMA (hNUMA), где узлы объединены в кластеры.
¶Пример топологии
Рассмотрим 4-процессорный сервер Intel Xeon Platinum 8380 (40 ядер на процессор). Каждый процессор имеет 8 каналов памяти DDR4-3200. Процессоры соединены через UPI в кольцо. В такой системе:
- Доступ к локальной памяти (своего процессора) — ~80 нс.
- Доступ к памяти соседнего процессора (через одно UPI-соединение) — ~120 нс.
- Доступ к памяти через два UPI-соединения — ~160 нс.
¶Применение
NUMA-архитектура широко используется в следующих областях:
- Серверы баз данных — системы управления базами данных (например, Oracle, PostgreSQL) оптимизируют размещение данных в локальной памяти для ускорения запросов.
- Высокопроизводительные вычисления (HPC) — суперкомпьютеры, такие как Summit (США) и «Ломоносов-2» (Россия), используют NUMA для распределения памяти между узлами.
- Виртуализация — гипервизоры (VMware ESXi, KVM) привязывают виртуальные машины к конкретным NUMA-узлам для минимизации задержек.
- Облачные вычисления — платформы (AWS, Яндекс.Облако) используют NUMA-аффинность для повышения производительности инстансов.
- Научные расчёты — моделирование климата, молекулярная динамика, обработка больших данных.
¶Классификация по степени неоднородности
- SMP (UMA) — однородный доступ, все процессоры имеют равное время доступа ко всей памяти. Используется в настольных ПК и небольших серверах (до 8 ядер).
- NUMA — неоднородный доступ, время доступа зависит от узла. Характерен для серверов с 2–8 процессорами.
- hNUMA — иерархическая NUMA, где узлы объединены в несколько уровней (например, в суперкомпьютерах с тысячами узлов).
- NUMA с кэш-когерентностью (ccNUMA) — аппаратно обеспечивается согласованность кэшей, что упрощает программирование.
- NUMA без кэш-когерентности (ncNUMA) — каждый процессор работает с собственной памятью, обмен данными требует явной синхронизации (используется в некоторых встраиваемых системах).
¶Особенности программирования для NUMA
Разработка приложений для NUMA-систем требует учёта локальности памяти. Основные подходы:
- First-touch allocation — память выделяется на том узле, где процессор впервые обращается к ней. Это стандартная политика в Linux.
- Явное связывание — использование системных вызовов (например,
mbind()в Linux) для привязки памяти к конкретному узлу. - Потоковая аффинность — привязка потоков к ядрам одного узла, чтобы избежать удалённых обращений.
- Интерливинг — равномерное распределение памяти по всем узлам, что снижает локальность, но увеличивает пропускную способность.
В языках программирования (C, C++, Fortran) для NUMA-оптимизации используются библиотеки, такие как numactl (Linux), libnuma (Linux), OpenMP с директивами OMP_PLACES и OMP_PROC_BIND.
¶Преимущества и недостатки
¶Преимущества
- Масштабируемость — возможность построения систем с сотнями и тысячами ядер без перегрузки шины.
- Снижение задержек — локальный доступ к памяти быстрее, чем в SMP-системах с общей шиной.
- Энергоэффективность — меньшее энергопотребление за счёт локализации трафика.
- Гибкость — возможность комбинировать процессоры с разной производительностью.
¶Недостатки
- Сложность программирования — требуется учёт топологии и аффинности.
- Неравномерность производительности — при неправильном размещении данных производительность может падать на 30–50 %.
- Затраты на межсоединения — дополнительные аппаратные ресурсы для связи между узлами.
- Проблемы с кэш-когерентностью — в ccNUMA требуется протокол когерентности, что увеличивает сложность и задержки.
¶Примеры NUMA-систем
- Серверы на базе AMD EPYC — процессоры с 8–12 контроллерами памяти, образующими до 12 NUMA-узлов на один процессор.
- Серверы Intel Xeon Scalable — 2–8 процессоров, каждый с 6–8 каналами памяти, соединённых через UPI.
- Суперкомпьютер «Ломоносов-2» (МГУ, Россия) — использует гибридную архитектуру с NUMA-узлами на базе процессоров Intel Xeon E5-2697v3.
- Fujitsu A64FX — процессор для суперкомпьютера Fugaku, имеет 4 NUMA-узла (CMG) с 8 ядрами и 8 ГБ памяти каждый.
- IBM Power10 — серверы с поддержкой до 16 процессоров и иерархической NUMA.
¶Интересные факты
- В NUMA-системах с большим числом узлов (например, 256) задержка доступа к удалённой памяти может превышать 1 микросекунду, что в 10–20 раз больше локальной задержки.
- В операционной системе Linux поддержка NUMA была добавлена в ядро версии 2.5 (2002 год), а в Windows — начиная с Windows Server 2008.
- Некоторые процессоры (например, Intel Xeon Phi) используют гибридную NUMA-архитектуру, где часть памяти является локальной, а часть — удалённой через PCI Express.
- В суперкомпьютере Fugaku (Япония) используется технология Tofu Interconnect D, которая обеспечивает 6D-тор для соединения NUMA-узлов.
¶Источники
- Hennessy, J. L., Patterson, D. A. «Computer Architecture: A Quantitative Approach», 6th Edition, 2019.
- Intel Corporation. «Intel Xeon Processor Scalable Family Technical Overview», 2021.
- AMD. «AMD EPYC 7003 Series Processor Architecture», 2022.
- Linux Kernel Documentation. «NUMA Memory Policy», 2023.
- «High Performance Computing: Modern Systems and Practices», 2020.