неоднородный доступ к памяти (NUMA ) - это конструкция компьютерной памяти, используемая в многопроцессорной обработке, где время доступа к памяти de ожидает расположения в памяти относительно процессора. В соответствии с NUMA процессор может обращаться к своей собственной локальной памяти быстрее, чем к нелокальной памяти (локальная память для другого процессора или память, совместно используемая между процессорами). Преимущества NUMA ограничены конкретными рабочими нагрузками, особенно на серверах, где данные часто тесно связаны с определенными задачами или пользователями.
Архитектура 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 ) и Digital (позже Compaq, затем HP, теперь HPE ). Методы, разработанные этими компаниями, позже были использованы в различных Unix-подобных операционных системах и в некоторой степени в Windows NT.
. Первая коммерческая реализация NUMA- Основанная на Unix система представляла собой семейство серверов XPS-100 с симметричной многопроцессорной обработкой, разработанное Дэном Гиланом из корпорации VAST для Honeywell Information Systems Италия.
Современные ЦП работают значительно быстрее, чем используемая ими основная память. В первые дни вычислений и обработки данных ЦП обычно работал медленнее, чем его собственная память. Границы производительности процессоров и памяти пересеклись в 1960-х годах с появлением первых суперкомпьютеров. С тех пор центральные процессоры все чаще оказываются «голодными по данным» и вынуждены останавливаться в ожидании поступления данных из памяти. Многие проекты суперкомпьютеров 1980-х и 1990-х годов были ориентированы на обеспечение высокоскоростного доступа к памяти в отличие от более быстрых процессоров, позволяя компьютерам работать с большими наборами данных на скоростях, недоступных для других систем.
Ограничение количества обращений к памяти стало ключом к достижению высокой производительности современного компьютера. Для обычных процессоров это означало установку постоянно увеличивающегося объема высокоскоростной кэш-памяти и использование все более сложных алгоритмов для предотвращения промахов в кэше. Но резкое увеличение размера операционных систем и приложений, работающих на них, в целом подавляло эти улучшения обработки кэша. Многопроцессорные системы без NUMA значительно усугубляют проблему. Теперь система может не использовать несколько процессоров одновременно, особенно потому, что только один процессор может получить доступ к памяти компьютера одновременно.
NUMA пытается решить эту проблему, предоставляя отдельную память для каждого процессора, избегая падения производительности когда несколько процессоров пытаются адресовать одну и ту же память. Для проблем, связанных с распределенными данными (обычно для серверов и подобных приложений), NUMA может улучшить производительность по сравнению с одной общей памятью примерно в несколько раз, увеличивая количество процессоров (или отдельных банков памяти). Другой подход к решению этой проблемы, используемый в основном в системах без NUMA, - это многоканальная архитектура памяти , в которой линейное увеличение количества каналов памяти линейно увеличивает параллелизм доступа к памяти.
Конечно, не все данные ограничиваются одной задачей, а это означает, что одни и те же данные могут потребоваться более чем одному процессору. Для обработки таких случаев системы NUMA включают дополнительное оборудование или программное обеспечение для перемещения данных между банками памяти. Эта операция замедляет процессоры, подключенные к этим банкам, поэтому общее увеличение скорости из-за NUMA сильно зависит от характера выполняемых задач.
AMD реализовала NUMA со своим процессором Opteron (2003), используя HyperTransport. Intel объявила о совместимости NUMA для своих серверов x86 и Itanium в конце 2007 года со своими процессорами Nehalem и Tukwila. Оба семейства ЦП Intel имеют общий набор микросхем ; соединение называется Intel Quick Path Interconnect (QPI).
Почти все архитектуры ЦП используют небольшой объем очень быстрой не разделяемой памяти, известный как кэш, для использования локальности ссылки при доступе к памяти. При использовании NUMA поддержание согласованности кэша в разделяемой памяти имеет значительные накладные расходы. Несмотря на то, что их проще спроектировать и построить, некогерентные системы NUMA с кэш-памятью становятся чрезмерно сложными для программирования в стандартной модели программирования архитектуры фон Неймана.
Обычно ccNUMA использует межпроцессорную связь между кешем контроллеры для сохранения согласованного образа памяти, когда несколько кешей хранят одну и ту же ячейку памяти. По этой причине ccNUMA может работать плохо, когда несколько процессоров пытаются получить доступ к одной и той же области памяти в быстрой последовательности. Поддержка NUMA в операционных системах пытается снизить частоту такого рода доступа, выделяя процессоры и память удобными для NUMA способами и избегая алгоритмов планирования и блокировки, которые делают необходимым NUMA-недружественный доступ.
В качестве альтернативы, протоколы когерентности кэша, такие как протокол MESIF, пытаются уменьшить обмен данными, необходимыми для поддержания когерентности кэша. Scalable Coherent Interface (SCI) - это стандарт IEEE, определяющий протокол согласованности кэша на основе каталогов, чтобы избежать ограничений масштабируемости, обнаруженных в более ранних многопроцессорных системах. Например, SCI используется в качестве основы для технологии NumaConnect.
По состоянию на 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).
NUMA можно рассматривать как сильно связанную форму кластерных вычислений. Добавление виртуальной памяти подкачки к архитектуре кластера может позволить реализовать NUMA полностью программно. Однако межузловая задержка программной NUMA остается на несколько порядков больше (медленнее), чем у аппаратной NUMA.
Поскольку NUMA в значительной степени влияет на производительность доступа к памяти необходимы определенные оптимизации программного обеспечения, чтобы можно было планировать потоки и процессы, приближенные к их данным в памяти.