Дата публикации: 26.07.2025 01:10
Просмотров: 21

Работа в Т-Банке

NUMA (Non-Uniform Memory Access)

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

 

Основные принципы NUMA

  1. Локальная и удалённая память:
    • В NUMA-системах память физически распределена между узлами (nodes). Каждый узел состоит из одного или нескольких процессоров (или ядер) и их локальной памяти.
    • Локальная память — это память, которая физически ближе к процессору (обычно подключена к тому же узлу). Доступ к ней быстрее.
    • Удалённая память — это память, расположенная на других узлах. Доступ к ней медленнее из-за необходимости передачи данных через межузельные соединения (например, через шину QPI в процессорах Intel или HyperTransport в AMD).
  2. Неравномерный доступ:
    • Время доступа к локальной памяти значительно меньше, чем к удалённой. Это ключевая особенность NUMA, отличающая её от UMA (Uniform Memory Access), где все процессоры имеют одинаковое время доступа к общей памяти.
    • Разница во времени доступа может составлять от 10% до 100% в зависимости от архитектуры и используемой технологии межузельного соединения.
  3. Узлы NUMA:
    • Каждый узел NUMA включает процессор(ы), кэш и локальную память. Узлы соединены высокоскоростными каналами (например, Intel QPI, AMD Infinity Fabric).
    • Узел может быть представлен как отдельный процессорный сокет или как группа ядер внутри одного процессора в современных многоядерных системах.

 

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

  1. Масштабируемость:
    • NUMA позволяет масштабировать системы с большим количеством процессоров, минимизируя узкие места, связанные с доступом к общей памяти.
    • В отличие от SMP, где шина памяти становится узким местом при увеличении числа процессоров, NUMA распределяет память, снижая конкуренцию за ресурсы.
  2. Высокая пропускная способность:
    • Локальный доступ к памяти быстрее, что улучшает производительность для задач, оптимизированных под NUMA.
  3. Гибкость:
    • NUMA-системы могут эффективно работать с различными типами нагрузок, особенно в серверных и высокопроизводительных вычислительных (HPC) средах.

 

Недостатки NUMA

  1. Сложность программирования:
    • Для достижения максимальной производительности программы должны быть оптимизированы под NUMA (NUMA-aware). Это требует учёта локальности данных, что усложняет разработку.
    • Неправильное распределение данных или потоков может привести к частому доступу к удалённой памяти, снижая производительность.
  2. Задержки при удалённом доступе:
    • Доступ к удалённой памяти медленнее, что может стать проблемой для приложений, не оптимизированных под NUMA.
  3. Сложность настройки:
    • Операционные системы и приложения должны поддерживать NUMA, чтобы эффективно распределять ресурсы между узлами.

 

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

  1. Распределение памяти:
    • Операционная система (например, Linux или Windows Server) распределяет память для процессов, стараясь размещать данные в локальной памяти узла, где выполняется процесс.
    • Политики NUMA (NUMA policies) определяют, как память будет выделяться (например, предпочтение локальной памяти, чередование страниц между узлами и т.д.).
  2. Политики NUMA:
    • Local allocation (локальное выделение): память выделяется на узле, где выполняется процесс.
    • Interleaving (чередование): страницы памяти распределяются равномерно между всеми узлами для балансировки нагрузки.
    • Binding (привязка): процесс или поток привязывается к конкретному узлу, чтобы минимизировать доступ к удалённой памяти.
  3. Инструменты управления:
    • В Linux для работы с NUMA используются утилиты, такие как numactl, которые позволяют задавать политики распределения памяти и привязки процессов к узлам.
    • Команда numastat предоставляет статистику использования памяти по узлам.

 

Примеры использования NUMA

  1. Серверы и HPC:
    • NUMA широко используется в серверных системах с несколькими процессорами (например, серверы с Intel Xeon или AMD EPYC).
    • В высокопроизводительных вычислениях (HPC) NUMA помогает эффективно распределять задачи между узлами для минимизации задержек.
  2. Базы данных:
    • СУБД, такие как Oracle, PostgreSQL или SQL Server, оптимизируются под NUMA для повышения производительности запросов за счёт локального доступа к данным.
  3. Виртуализация:
    • Виртуальные машины в гипервизорах (например, 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

  1. Программная оптимизация:
    • Разработчики должны учитывать локальность данных, размещая связанные данные и потоки на одном узле.
    • Использование библиотек, таких как OpenMP или MPI, с поддержкой NUMA.
  2. Настройка ОС:
    • В Linux можно использовать параметры ядра, такие как numa_balancing, для автоматической оптимизации размещения памяти.
    • Утилита numactl позволяет задавать политики NUMA для конкретных приложений.
  3. Мониторинг:
    • Инструменты, такие как 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, для достижения максимальной производительности.



Нашли ошибку? Сообщите нам!
Материал распространяется по лицензии CC0 1.0 Universal