Неравномерный доступ к памяти ( NUMA ) — это конструкция компьютерной памяти , используемая в многопроцессорной обработке , где время доступа к памяти зависит от местоположения памяти относительно процессора. В рамках NUMA процессор может получить доступ к своей локальной памяти быстрее, чем к нелокальной памяти (памяти, локальной для другого процессора или памяти, совместно используемой между процессорами). NUMA полезен для рабочих нагрузок с высокой локальностью памяти и низким уровнем конфликтов за блокировки , поскольку процессор может работать с подмножеством памяти в основном или полностью внутри своего собственного узла кэша, уменьшая трафик на шине памяти. [1]
Архитектуры NUMA по масштабированию логически следуют за архитектурами симметричной многопроцессорной обработки (SMP). Они были коммерчески разработаны в 1990-е годы компаниями Unisys , Convex Computer (позже Hewlett-Packard ), Honeywell Information Systems Italy (HISI) (позже Groupe Bull ), Silicon Graphics (позже Silicon Graphics International ), Sequent Computer Systems (позже IBM ), Data General (позже EMC , теперь Dell Technologies ), Digital (позже Compaq , затем HP , теперь HPE ) и ICL . Методы, разработанные этими компаниями, позже использовались во многих Unix-подобных операционных системах и, в некоторой степени, в Windows NT .
Первая коммерческая реализация системы Unix на базе NUMA была [ где? ] [ когда? ] семейство серверов Symmetrical Multi Processing XPS-100, разработанное Дэном Гиланом из корпорации VAST для Honeywell Information Systems Italy.
Современные процессоры работают значительно быстрее, чем используемая ими основная память. На заре вычислений и обработки данных ЦП обычно работал медленнее, чем собственная память. Линии производительности процессоров и памяти пересеклись в 1960-х годах с появлением первых суперкомпьютеров . С тех пор процессоры все чаще обнаруживают, что им не хватает данных, и им приходится останавливаться в ожидании поступления данных из памяти (например, для компьютеров на основе архитектуры фон Неймана см. « Узкое место фон Неймана» ). Многие разработки суперкомпьютеров 1980-х и 1990-х годов были ориентированы на обеспечение высокоскоростного доступа к памяти в отличие от более быстрых процессоров, что позволяло компьютерам работать с большими наборами данных на скоростях, к которым другие системы не могли приблизиться.
Ограничение количества обращений к памяти стало ключом к достижению высокой производительности современного компьютера. Для обычных процессоров это означало установку все большего количества высокоскоростной кэш-памяти и использование все более сложных алгоритмов для предотвращения промахов кэша . Однако резкое увеличение размера операционных систем и приложений, работающих на них, в целом свело на нет эти улучшения в обработке кэша. Многопроцессорные системы без NUMA значительно усугубляют проблему. Теперь система может одновременно отключать несколько процессоров, в частности потому, что только один процессор может одновременно обращаться к памяти компьютера. [2]
NUMA пытается решить эту проблему, предоставляя отдельную память для каждого процессора, избегая снижения производительности, когда несколько процессоров пытаются обратиться к одной и той же памяти. Для проблем, связанных с распространением данных (обычных для серверов и подобных приложений), NUMA может повысить производительность одной общей памяти примерно в раз, равный количеству процессоров (или отдельных банков памяти). [3] Другим подходом к решению этой проблемы является многоканальная архитектура памяти , в которой линейное увеличение количества каналов памяти линейно увеличивает параллелизм доступа к памяти. [4]
Конечно, не все данные ограничиваются одной задачей, а это означает, что одни и те же данные могут потребоваться более чем одному процессору. Чтобы справиться с этими случаями, системы NUMA включают дополнительное оборудование или программное обеспечение для перемещения данных между банками памяти. Эта операция замедляет работу процессоров, подключенных к этим банкам, поэтому общее увеличение скорости благодаря NUMA сильно зависит от характера выполняемых задач. [3]
AMD реализовала NUMA в своем процессоре Opteron (2003 г.), используя HyperTransport . В конце 2007 года Intel объявила о совместимости NUMA для своих серверов x86 и Itanium со своими процессорами Nehalem и Tukwila . [5] Оба семейства процессоров Intel используют общий набор микросхем ; это соединение называется Intel QuickPath Interconnect (QPI), которое обеспечивает чрезвычайно высокую пропускную способность для обеспечения высокой встроенной масштабируемости и было заменено новой версией под названием Intel UltraPath Interconnect с выпуском Skylake (2017). [6]
Почти все архитектуры ЦП используют небольшой объем очень быстрой отдельной памяти, известной как кэш, для использования локальности ссылок при доступе к памяти. При использовании NUMA поддержание согласованности кэша в общей памяти сопряжено со значительными издержками. Несмотря на то, что NUMA-системы без кэш-когерентности проще проектировать и создавать, их программирование в стандартной модели программирования архитектуры фон Неймана становится непомерно сложным . [7]
Обычно ccNUMA использует межпроцессорную связь между контроллерами кэша для поддержания согласованного образа памяти, когда одна и та же ячейка памяти хранится в нескольких кэшах. По этой причине ccNUMA может работать плохо, когда несколько процессоров пытаются быстро получить доступ к одной и той же области памяти. Поддержка NUMA в операционных системах пытается снизить частоту такого доступа, распределяя процессоры и память NUMA-дружественными способами и избегая алгоритмов планирования и блокировки, которые делают необходимым недружественный NUMA доступ. [8]
Альтернативно, протоколы согласованности кэша, такие как протокол MESIF, пытаются уменьшить объем связи, необходимый для поддержания согласованности кэша. Масштабируемый когерентный интерфейс (SCI) — это стандарт IEEE , определяющий протокол согласованности кэша на основе каталогов, позволяющий избежать ограничений масштабируемости, обнаруженных в более ранних многопроцессорных системах. Например, SCI используется в качестве основы для технологии NumaConnect. [9] [10]
NUMA можно рассматривать как тесно связанную форму кластерных вычислений . Добавление подкачки виртуальной памяти в кластерную архитектуру может позволить полностью реализовать NUMA программно. Однако задержка между узлами программного NUMA остается на несколько порядков больше (медленнее), чем у аппаратного NUMA. [1]
Поскольку NUMA в значительной степени влияет на производительность доступа к памяти, необходимы определенные оптимизации программного обеспечения, чтобы позволить планировать потоки и процессы, близкие к их данным в памяти.
По состоянию на 2011 год системы ccNUMA представляют собой многопроцессорные системы на базе процессора AMD Opteron , который может быть реализован без внешней логики, и процессора Intel Itanium , для которого требуется набор микросхем с поддержкой NUMA. Примерами наборов микросхем с поддержкой ccNUMA являются SGI Shub (Super Hub), Intel E8870, HP sx2000 (используется в серверах Integrity и Superdome), а также те, которые используются в системах NEC Itanium. Более ранние системы ccNUMA, например системы от Silicon Graphics, были основаны на процессорах MIPS и процессоре DEC Alpha 21364 (EV7).