| NUMA (Non-Uniform Memory Access, неравномерный доступ к памяти) — это архитектура памяти, используемая в многопроцессорных системах, где время доступа к памяти зависит от её расположения относительно процессора. Эта архитектура была разработана для повышения производительности и масштабируемости систем с большим количеством процессоров, в отличие от более ранних архитектур, таких как SMP (Symmetric Multiprocessing, симметричная мультипроцессорная обработка), где доступ к памяти был одинаковым для всех процессоров.  Основные принципы NUMA 
 Локальная и удалённая память:
 
 В NUMA-системах память физически распределена между узлами (nodes). Каждый узел состоит из одного или нескольких процессоров (или ядер) и их локальной памяти.Локальная память — это память, которая физически ближе к процессору (обычно подключена к тому же узлу). Доступ к ней быстрее.Удалённая память — это память, расположенная на других узлах. Доступ к ней медленнее из-за необходимости передачи данных через межузельные соединения (например, через шину QPI в процессорах Intel или HyperTransport в AMD).Неравномерный доступ:
 
 Время доступа к локальной памяти значительно меньше, чем к удалённой. Это ключевая особенность NUMA, отличающая её от UMA (Uniform Memory Access), где все процессоры имеют одинаковое время доступа к общей памяти.Разница во времени доступа может составлять от 10% до 100% в зависимости от архитектуры и используемой технологии межузельного соединения.Узлы NUMA:
 
 Каждый узел NUMA включает процессор(ы), кэш и локальную память. Узлы соединены высокоскоростными каналами (например, Intel QPI, AMD Infinity Fabric).Узел может быть представлен как отдельный процессорный сокет или как группа ядер внутри одного процессора в современных многоядерных системах.  Преимущества NUMA 
 Масштабируемость:
 
 NUMA позволяет масштабировать системы с большим количеством процессоров, минимизируя узкие места, связанные с доступом к общей памяти.В отличие от SMP, где шина памяти становится узким местом при увеличении числа процессоров, NUMA распределяет память, снижая конкуренцию за ресурсы.Высокая пропускная способность:
 
 Локальный доступ к памяти быстрее, что улучшает производительность для задач, оптимизированных под NUMA.Гибкость:
 
 NUMA-системы могут эффективно работать с различными типами нагрузок, особенно в серверных и высокопроизводительных вычислительных (HPC) средах.  Недостатки NUMA 
 Сложность программирования:
 
 Для достижения максимальной производительности программы должны быть оптимизированы под NUMA (NUMA-aware). Это требует учёта локальности данных, что усложняет разработку.Неправильное распределение данных или потоков может привести к частому доступу к удалённой памяти, снижая производительность.Задержки при удалённом доступе:
 
 Доступ к удалённой памяти медленнее, что может стать проблемой для приложений, не оптимизированных под NUMA.Сложность настройки:
 
 Операционные системы и приложения должны поддерживать NUMA, чтобы эффективно распределять ресурсы между узлами.  Как работает NUMA 
 Распределение памяти:
 
 Операционная система (например, Linux или Windows Server) распределяет память для процессов, стараясь размещать данные в локальной памяти узла, где выполняется процесс.Политики NUMA (NUMA policies) определяют, как память будет выделяться (например, предпочтение локальной памяти, чередование страниц между узлами и т.д.).Политики NUMA:
 
 Local allocation (локальное выделение): память выделяется на узле, где выполняется процесс.Interleaving (чередование): страницы памяти распределяются равномерно между всеми узлами для балансировки нагрузки.Binding (привязка): процесс или поток привязывается к конкретному узлу, чтобы минимизировать доступ к удалённой памяти.Инструменты управления:
 
 В Linux для работы с NUMA используются утилиты, такие как numactl, которые позволяют задавать политики распределения памяти и привязки процессов к узлам.Команда numastat предоставляет статистику использования памяти по узлам.  Примеры использования NUMA 
 Серверы и HPC:
 
 NUMA широко используется в серверных системах с несколькими процессорами (например, серверы с Intel Xeon или AMD EPYC).В высокопроизводительных вычислениях (HPC) NUMA помогает эффективно распределять задачи между узлами для минимизации задержек.Базы данных:
 
 СУБД, такие как Oracle, PostgreSQL или SQL Server, оптимизируются под NUMA для повышения производительности запросов за счёт локального доступа к данным.Виртуализация:
 
 Виртуальные машины в гипервизорах (например, VMware ESXi, KVM) могут быть настроены для оптимального использования NUMA, чтобы виртуальные процессоры и память располагались на одном узле.  NUMA в современных процессорах Современные процессоры, такие как AMD EPYC и Intel Xeon Scalable, активно используют NUMA даже в рамках одного процессора. Например: 
 AMD EPYC: использует архитектуру Infinity Fabric, где каждый чиплет (chiplet) может рассматриваться как отдельный NUMA-узел.Intel Xeon: применяет UPI (Ultra Path Interconnect) для связи между сокетами, а в некоторых случаях NUMA применяется внутри одного процессора с несколькими кэш-доменами.  Оптимизация под NUMA 
 Программная оптимизация:
 
 Разработчики должны учитывать локальность данных, размещая связанные данные и потоки на одном узле.Использование библиотек, таких как OpenMP или MPI, с поддержкой NUMA.Настройка ОС:
 
 В Linux можно использовать параметры ядра, такие как numa_balancing, для автоматической оптимизации размещения памяти.Утилита numactl позволяет задавать политики NUMA для конкретных приложений.Мониторинг:
 
 Инструменты, такие как numastat или perf, помогают отслеживать производительность NUMA и выявлять проблемы, связанные с удалённым доступом к памяти.  NUMA vs UMA 
 UMA (Uniform Memory Access): все процессоры имеют одинаковое время доступа к общей памяти. Подходит для систем с малым числом процессоров, но не масштабируется для больших систем.NUMA: время доступа зависит от расположения памяти. Лучше подходит для масштабируемых систем, но требует оптимизации.  NUMA в Linux В Linux поддержка NUMA встроена в ядро. Основные команды и инструменты: 
 lscpu: показывает конфигурацию NUMA-узлов.numactl --hardware: отображает доступные узлы и их память.numastat: предоставляет статистику использования памяти по узлам./proc/sys/kernel/numa_balancing: включает/выключает автоматическую балансировку NUMA. 
  Заключение NUMA — это мощная архитектура для многопроцессорных систем, обеспечивающая высокую производительность и масштабируемость. Однако её эффективность зависит от правильной оптимизации приложений и операционной системы. NUMA особенно важна в серверных и HPC-средах, где большое количество процессоров и высокая пропускная способность памяти критически важны. Для разработчиков и администраторов важно понимать принципы NUMA и использовать инструменты, такие как numactl, для достижения максимальной производительности. |