Неравномерный доступ к памяти ( NUMA ) — это конструкция компьютерной памяти , используемая в многопроцессорной обработке , где время доступа к памяти зависит от расположения памяти относительно процессора. В рамках NUMA процессор может получать доступ к своей локальной памяти быстрее, чем к нелокальной памяти (локальной памяти другого процессора или памяти, разделяемой между процессорами). [1] NUMA выгодна для рабочих нагрузок с высокой локальностью памяти ссылок и низким уровнем конкуренции за блокировки , поскольку процессор может работать с подмножеством памяти в основном или полностью в пределах своего собственного узла кэша, что снижает трафик на шине памяти. [2]
Архитектуры 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 значительно усугубляют проблему. Теперь система может одновременно заставлять работать несколько процессоров, в частности потому, что только один процессор может одновременно получать доступ к памяти компьютера. [3]
NUMA пытается решить эту проблему, предоставляя отдельную память для каждого процессора, избегая падения производительности, когда несколько процессоров пытаются обратиться к одной и той же памяти. Для проблем, связанных с распределенными данными (обычно для серверов и подобных приложений), NUMA может улучшить производительность по сравнению с одной общей памятью примерно в число процессоров (или отдельных банков памяти). [4] Другим подходом к решению этой проблемы является архитектура многоканальной памяти , в которой линейное увеличение числа каналов памяти линейно увеличивает параллелизм доступа к памяти. [5]
Конечно, не все данные в конечном итоге ограничиваются одной задачей, что означает, что более чем одному процессору могут потребоваться одни и те же данные. Для обработки таких случаев системы NUMA включают дополнительное оборудование или программное обеспечение для перемещения данных между банками памяти. Эта операция замедляет процессоры, подключенные к этим банкам, поэтому общее увеличение скорости за счет NUMA в значительной степени зависит от характера выполняемых задач. [4]
AMD реализовала NUMA со своим процессором Opteron (2003), используя HyperTransport . Intel объявила о совместимости NUMA для своих серверов x86 и Itanium в конце 2007 года с процессорами Nehalem и Tukwila . [6] Оба семейства процессоров Intel используют общий чипсет ; соединение называется Intel QuickPath Interconnect (QPI), которое обеспечивает чрезвычайно высокую пропускную способность для обеспечения высокой встроенной масштабируемости и было заменено новой версией под названием Intel UltraPath Interconnect с выпуском Skylake (2017). [7]
Почти все архитектуры ЦП используют небольшое количество очень быстрой несовместной памяти, известной как кэш , для использования локальности ссылок при доступе к памяти. С NUMA поддержание согласованности кэша в общей памяти имеет значительные накладные расходы. Хотя системы NUMA с несовместным кэшем проще в проектировании и построении, они становятся чрезмерно сложными для программирования в стандартной модели программирования архитектуры фон Неймана . [8]
Обычно ccNUMA использует межпроцессорную связь между контроллерами кэша для сохранения согласованного образа памяти, когда более одного кэша хранят одно и то же место памяти. По этой причине ccNUMA может работать плохо, когда несколько процессоров пытаются получить доступ к одной и той же области памяти в быстрой последовательности. Поддержка NUMA в операционных системах пытается снизить частоту такого рода доступа, выделяя процессоры и память дружественными NUMA способами и избегая алгоритмов планирования и блокировки, которые делают недружественный NUMA доступ необходимым. [9]
В качестве альтернативы, протоколы когерентности кэша, такие как протокол MESIF, пытаются сократить объем коммуникаций, необходимых для поддержания когерентности кэша. Scalable Coherent Interface (SCI) — это стандарт IEEE , определяющий протокол когерентности кэша на основе каталогов, чтобы избежать ограничений масштабируемости, обнаруженных в более ранних многопроцессорных системах. Например, SCI используется в качестве основы для технологии NumaConnect. [10] [11]
Можно рассматривать NUMA как тесно связанную форму кластерных вычислений . Добавление подкачки виртуальной памяти к архитектуре кластера может позволить реализовать NUMA полностью в программном обеспечении. Однако задержка между узлами программного NUMA остается на несколько порядков больше (медленнее), чем у аппаратного NUMA. [2]
Поскольку 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).