Уважаемые дамы и господа!

Я врываюсь несколько не в мою область. Но это страшно интересно. Параллельные архитектуры... Всю жизнь я работал бок о бок с пострясающе квалифицированными специалистами в области компьютерных архитектур. Однако после полного распада советской вычислительной техники мне стало не хватать свежей информации. Предлагаемый Вашему вниманию обзор, конечно, не является полным и исчерпывающим, но он интересен. Обратите внимание, как аккуратно автор опускает наиболее сложные технические вопросы. Например, подробно обсуждаются аспекты выборки данных, но ничего не говорится про запись в память. А именно с этим связаны самые большие неприятности. Если хотите, можем обсудить эти проблемы. (Не справлюсь сам - попрошу помощи Виктора Зиновьевича Шнитмана.)

С уважением, Сергей Кузнецов


DataBase Programming & Design OnLine, May 1998

Sizing Up Parallel Architectures

(http://www.dbpd.com/9805feat.htm)
Greg Pfister, старший технический специалист компании IBM
E-mail: pfister@us.ibm.com

Параллельная обработка, т.е. применение несколько процессорных устройств, может обеспечить широкий набор преимуществ, но ни одна из известных параллельных компьютерных архитектур не является идеальной. Более того, решение об использовании конкретной архитектуры может иметь далеко идущие последствия, поскольку этот выбор сильно влияет на организацию приложений, переделка которых для другой архитектуры может достаточно дорого стоить.

В статье обсуждаются особенности трех наиболее распространенных в настоящее время параллельных архитектур: симметричных мультипроцессоров (SMP), кластеров и архитектуры ccNUMA (более часто называемая просто NUMA), акроним от "cache-coherent nonuniform memory architecture" (архитектура с неоднородным доступом к памяти и обеспечением когерентности кэшей). Основное внимание уделяется тому, как влияют характеристики архитектур на масштабируемость систем при решении задач OLTP и поддержки принятия решений, на доступность и управляемость систем.

Три параллельных архитектуры
За время существования компьютерной индустрии предлагались и появлялись на рынке сотни параллельных архитектур. Однако проверку временем выдержали только две из них: SMP и кластеры. Вероятно, эти архитектуры будут использоваться и в обозримом будущем.

Архитектура SMP появилась в начале 1970-х и быстро стала фактическим стандартом наиболее распространенных параллельных архитектур. Если компания, производящая компьютерное оборудование, поддерживает хотя бы какой-нибудь вид параллелизма, то с большой вероятностью используется SMP.

Кластеры, вероятно, стали использоваться даже раньше, чем SMP. Причиной возникновения кластерной архитектуры было то, что необходимую для пользователя работу было невозможно выполнить на одном компьютере или эта работа была настолько важна, чтобы приобрести дублирующее оборудование. Много позже этот подход удостоился общепринятого названия (термин "кластер" был введен в обиход компанией Digital Equipment Corp. в середине 1980-х), и его стали поддерживать поставщики систем. Сегодня кластерная архитектура является козырной картой практически каждого поставщика компьютерных систем, ориентированных на применение ОС UNIX и/или Windows NT.

Архитектура NUMA была разработана в начале 1990-х. На сегодняшний день она поддерживается только несколькими поставщиками аппаратуры (например, Sequent Computers Inc., Data General Corp., Silicon Graphics Inc. и Hewlett-Packard) и систем баз данных (к моменту публикации статьи - Oracle и Informix). Сторонники NUMA утверждают, что эта архитектура позволяет решить все проблемы, свойственные другим параллельным архитектурам. Однако так было всегда: каждый, кто предлагал новую параллельную архитектуру, заявлял, что она решает все старые проблемы. Вместе с тем, имеются основания ожидать, что архитектура NUMA останется среди реально используемых. Несколько поставщиков аппаратуры демонстрируют намерения скоро начать поддерживать эту архитектуру.

Архитектура SMP
SMP - это один компьютер с несколькими равноправными процессорами. Все остальное - в одном экземпляре: одна память, одна подсистема ввода/вывода, одна операционная система. Слово "равноправный" (как и слово "симметричная" в названии архитектуры) означает, что каждый процессор может делать все, что любой другой. Каждый процессор имеет доступ ко всей памяти, может выполнять любую операцию ввода/вывода, прерывать другие процессоры и т.д. Но это представление справедливо только на уровне программного обеспечения. Умалчивается то, что на самом деле в SMP имеется несколько устройств памяти.

В SMP каждый процессор имеет по крайней мере одну собственную кэш-память (а возможно, и несколько). Наличие кэш-памяти (или просто кэша) необходимо для достижения хорошей производительности, поскольку основная память (DRAM - Direct Random Access Memory) работает слишком медленно по сравнению со скоростью процессоров, и каждый год это соотношение ухудшается. Уже сейчас скорость основной памяти в 20-40 раз меньше, чем требуется, а в ближайшее время этот показатель будет порядка 100. Кэш работает со скоростью процессора, но эта аппаратура дорогая, и поэтому устройства кэш-памяти обладают относительно небольшой емкостью. В настоящее время размер кэш-памяти составляет 10-100 Кбт, в то время как основная память может иметь объем в 10-100 Мбт. Для процессора кэш исполняет роль "рабочего стола", на котором хранится используемая в текущее время информация; основная память подобна большому шкафу, находящемуся в комнате. При том, что в SMP имеется несколько устройств памяти, программное обеспечение ожидает видеть только одну общую память. Грубо говоря, из этого следует, что если процессор A сохраняет значение X в ячейке Q, а позже процессор B загружает значение из ячейки Q, то процессор B должен получить X. Но если на самом деле значение X было помещено в кэш процессора A, то как его сможет получить процессор B?

Этот пример иллюстрирует одну из сложных проблем SMP, называемую проблемой когерентности кэшей. Если процессор B обращается к ячейке Q, и содержимое этой ячейки отсутствует в кэше B, то через системную шину для всего компьютера посылается широковещательный запрос "У кого Q?". Все немедленно начинают искать Q. Все устройства кэш-памяти, основной памяти и даже подсистема ввода/вывода (если она работает с основной памятью напрямую) определяют, не у них ли находится актуальная копия Q. То устройство, которое находит актуальную копию, посылает ее процессору B.

Имеются три причины, по которым когерентность кэшей является важной. Во-первых, это свойство играет ведущую роль в системах NUMA. Во-вторых, поддержка когерентности серьезно влияет на производительность. И в третьих, именно из-за поддержки когерентности кэшей архитектура SMP не может обеспечить высокой доступности. Влияние на производительность очевидно. Программа работает гораздо быстрее, в 10-20 раз, если используются данные, уже содержащиеся в кэше. Программы, которые обращаются к другим устройствам памяти, выполняются очень медленно. Даже если для реорганизации кода с целью повышения вероятности использованию данных из кэша требуется большее число команд, эти команды гораздо более быстрые.

Но имеется еще одно следствие, связанное с параллелизмом. Неявно прозводимая аппаратурой SMP пересылка данных между кэшами является наиболее быстрым и самым дешевым средством коммуникации в любой параллельной архитектуре общего назначения. Поэтому при наличии большого числа коротких транзакций (свойственных, например, банковским приложениям), когда приходится часто синхронизовать доступ к общим данным, архитектура SMP является наилучшим выбором; любая другая архитектура работает хуже. Кроме того, архитектура SMP наиболее безопасна, если нет уверенности в том, сколько действий по синхронизации потребуется, поскольку реальность всегда хуже ожиданий. Из этого не следует, что передача данных между кэшами желательна. Параллельная программа всегда будет выполняться тем быстрее, чем меньше взаимодействуют ее части. Но если эти части должны взаимодействовать часто, то программа будет работать быстрее на SMP.

Рассмотрим теперь аспекты доступности. Что случится, если процессор A сохранит значение Q в своем кэше, а затем выйдет из строя? Когда процессор B инициирует поиск Q, кэш процессора A не сможет ответить. Должно ли это привести к выходу из строя процессора B по причине бесконечного ожидания ответа? Вспомним, что ячейка Q по прежнему входит в состав основной памяти. Q содержит неверные данные, но основная память получает запрос наряду со всеми другими компонентами SMP, и если кэш не отвечает, то основная память выдает то, что имеет. Если бы копия Q не содержалась ни в одном кэше, то этот ответ был бы правильным. К сожалению, в рассматриваемом нами случае основная память предоставит неверное значение. В результате вся SMP начнет работать как однопроцессорная система. Ее можно перезагрузить и запустить заново без использования вышедшего из строя процессора, но, конечно, это означает деградацию системы.

При наличии нескольких процессоров эта ситуация достаточно нелепа; осмысленной причиной для выхода системы из строя был бы отказ основной памяти или подсистемы ввода/вывода. Но поскольку процессоры слишком тесно связаны, и работает одна копия операционной системы, разделяемая всеми процессорами, не удается сохранить работоспособность системы при отказе любого процессора. Теоретически эту проблему можно разрешить за счет увеличения объема оборудования, существенного усложнения аппаратуры кэша и массы дополнительного программного обеспечения. В результате даже производители мейнфреймов, исторически использовавшие SMP, переходят к применению кластерных архитектур с присущей им высокой доступностью.

Архитектуры NUMA
Проще всего охарактеризовать NUMA-систему, представив себе большую систему SMP, распиленную пополам, причем половинки связаны кабелем, подключенным к системным шинам, и каждая половинка включает собственную основную память и подсистему ввода/вывода. Это и есть NUMA: большая SMP, разбитая на набор более мелких и простых SMP. Основной проблемой NUMA является обеспечение когерентности кэшей. Аппаратура позволяет работать со всеми отдельными устройствами основной памяти составных частей системы (называемых обычно узлами) как с единой гигантской памятью. Этот подход порождает ряд следствий. Во-первых, в системе имеется одно адресное пространство, распространяемое на все узлы. Реальный (не виртуальный) адрес 0 для каждого процессора в любом узле соответствует адресу 0 в частной памяти узла 0; реальный адрес 1 для всей машины - это адрес 1 в узле 0 и т.д., пока не будет использована вся память узла 0. Затем происходит переход к памяти узла 1, затем узла 2 и т.д. Для реализации этого единого адресного пространства каждый узел NUMA включает специальную аппаратуру (Dir).

Предположим, что процессор в узле A пытается загрузить значение из ячейки с адресом Q, и это значение не находится в кэше, а содержится только в основной памяти. Кроме того, предположим, что действительный адрес Q не относится к частной памяти узла A. Тогда выполняется следующая последовательность действий:

Понятно, что этот процесс длится несколько дольше, чем если бы адрес Q относился к частной памяти узла A. Вот откуда происходит словосочетание "неоднородный доступ к памяти". В отличие от SMP, время выборки значения зависит от адреса и от того, от какого процессора исходит запрос (если, конечно, Q не содержится в кэше). По аналогии архитектуру SMP можно было бы характеризовать как UMA - Uniform Memory Access.

Ключевым вопросом является то, насколько "неоднородна" NUMA? Например, если для взятия значения из другого узла требуется только на 10% большее время, то это никого не задевает. В этом случае все будут относиться к системе как к UMA (SMP), и разработанные для SMP программы будут выполняться достаточно хорошо. В действительности на рынке имеются системы, к которых доступ к памяти в другом узле занимает на 40% больше времени. Никто не оглашает этот факт, и он никого не задевает.

Однако в текущем поколении NUMA-систем для соединения узлов используется сеть. Это позволяет включать в систему большее число узлов, до 64 узлов с общим числом процессоров 128 в некоторых системах. В результате, современные NUMA-системы не выдерживают правила 10%. Даже лучшие представители серии Origin компании Silicon Graphics обеспечивают замедление в 200-300%. NUMA-Q компании Sequent дает замедление в 750% и даже больше при сильной загрузке. Не имея точных данных, на основе анализа структуры NUMALiiNE компании Data General можно считать, что система дает еще большее замедление, чем NUMA-Q.

При такой разнице в скорости доступа к памяти для обеспечения должной эффективности следует позаботиться о правильном расположении требуемых данных. Чтобы этого добиться, можно соответствующим образом модифицировать операционную систему (и это сделали поставщики систем в архитектуре NUMA). Например, такая операционная система при запросе из программы блока памяти выделяет память в узле, в котором выполняется эта программа, так что когда процессор ищет соответствующие данные, то находит их в своем собственном узле. Аналогичным образом должны быть изменены подсистемы (включая СУБД), осуществляющие собственное планирование и распределение памяти (что и сделали Oracle и Informix). Как утверждает компания Silicon Graphics, такие изменения позволяют эффективно выполнять в системах с архитектурой NUMA приложения, разработанные для SMP, без потребности изменения кода.

Но это еще не конец всей истории. Напомним, что должна поддерживаться когерентность кэшей. Если процессор в узле A изменяет в своем кэше значение, полученное из узла B, а затем процессор в узле B запрашивает это значение, то должна быть произведена соответствующая выборка. Для этого Dir в узле B сохраняет в своем "каталоге" (отсюда Dir) информацию о том, кто получил значения из узла B. Когда процессор в узле B распространяет запрос "У кого Q?", Dir этого узла просматривает свой каталог. Если в нем находится ссылка на Q, то Dir как бы говорит: "Подождите, Q имеется у кого-то еще", а потом извлекает значение из узла A с использованием описанной ранее последовательности действий. Таким образом поддерживается семантика SMP - выполнять операции загрузки значений из памяти и их записи в память таким образом, как если бы существовала только одна память.

Обсудим теперь, сколько времени занимает пересылка данных между кэшами. Основная память работает медленно, поэтому время выборки значения из этой памяти создает постоянные дополнительные накладные расходы при обращении и к локальным, и к удаленным данным. Конечно, доступ к удаленным данным в основной памяти существенно дороже, чем доступ к локальным данным, но эта разница несколько сглаживается за счет величины времени выборки из основной памяти. Кэш-память работает быстро, поэтому подобный фактор сглаживания отсутствует. Результаты сравнения времени пересылки данных между локальными и между удаленными кэшами существенно хуже тех, которые обсуждались раньше.

Насколько они хуже? Никто не говорит об этом, по крайней мере, публично. Тем не менее, можно в процентах разницу во времени можно оценить в 400-1500 и даже больше. Поэтому NUMA-системы вряд ли могут заменить SMP при решении задач, требующих частой синхронизации. Ситуация улучшается, если удается разделить приложение на части, каждая из которых располагается в одном узле и взаимодействия между которыми возникают не слишком часто. Например, NUMA-систему с двумя узлами можно эффективно использовать для ведения бухгалтерии корпорации, имеющей два относительно независимых офиса. Эффективно использовать NUMA-системы могут СУБД, оптимизаторы которых в состоянии разбить сложный запрос на независимо выполняемые части (например, сканирующие разные части большой таблицы).

Что касается доступности, то NUMA наследует все неприятности, свойственные SMP, по той же причине обеспечения когерентности кэшей и наличия единой операционной системы. В отличие от кластеров, NUMA-систему любого размера можно считать "одной машиной". Для достижения высокого уровня доступности нужно использовать кластеры.

Кластерные архитектуры
Кластер - это связанный набор полноценных компьютеров, используемый в качестве единого ресурса. Под словосочетанием "полноценный компьютер" понимается завершенная компьютерная система, обладающая всем, что требуется для ее функционирования, включая процессоры, память, подсистему ввода/вывода, а также операционную систему, подсистемы, приложения и т.д. Обычно для этого годятся готовые компьютеры, которые могут обладать архитектурой SMP и даже NUMA.

Словосочетание "единый ресурс" означает наличие программного обеспечения, дающего возможность пользователям, администраторам и даже приложениям считать, что имеется только одна сущность - кластер. Например, система пакетной обработки кластера позволяет послать задание на обработку кластеру, а не какому-нибудь отдельному компьютеру. Более сложным примером являются системы баз данных. У всех ведущих поставщиков систем баз данных имеются версии, работающие в параллельном режиме на нескольких машинах кластера. В результате приложения, использующие базу данных, не должны заботиться о том, где выполняется их работа. СУБД отвечает за синхронизацию параллельно выполняемых действий и поддержание целостности базы данных.

При соединении компьютеров в кластер почти всегда поддерживаются прямые межмашинные коммуникации. Решения могут быть простыми, основывающимися на аппаратуре Ethernet, или сложными с высокоскоростными сетями с пропускной способностью в сотни мегабайт в секунду. К последней категории относятся RS/6000 SP компании IBM, системы компании Digital на основе Memory Channel, ServerNet компании Compac Computer Corp. Часто, хотя и не всегда, обеспечивается доступ каждого компьютера, входящего в состав кластера, к любому диску. Это не означает, что копьютеры обязательно совместно используют диски каким-либо разумным образом; при разработке СУБД или других подсистем возможен выбор, и в большинстве таких систем применяется подход "sharing-nothing", при котором в любой момент времени каждым диском "владеет" только один компьютер. Исключениями являются Oracle8 и DB2 c IBM OS/390; в них диски активно используются в совместном режиме, образуя большую и медленную память, с помощью которой поддерживается когерентность кэшей базы данных.

Кластеры демонстрируют высокий уровень доступности, поскольку в них отсутствуют единая операционная система и совместно используемая память с обеспечением когерентности кэшей. Кроме того, специальное программное обеспечение в каждом узле постоянно производит контроль работоспособности всех остальных узлов. Этот контроль основан на периодической рассылке каждым узлом сигнала "Я еще бодрствую". Если такой сигнал от некоторого узла не поступает, то этот узел считается вышедшим из строя; ему не дается возможность выполнять ввод/вывод, его диски и другие ресурсы переназначаются другим узлам (включая IP-адреса), а выполнявшиеся в вышедшем из строя узле программы перезапускаются в других узлах.

Производительность кластеров хорошо масштабируется при добавлении узлов. В кластере может выполняться несколько отдельных приложений, но для масштабирования отдельного приложения требуется, чтобы его части взаимодействовали путем обмена сообщениями. Это сильно отличается от приемов программирования для SMP, но если приложение выполняется под управлением монитора транзакций или СУБД, то поставщик монитора транзакций или СУБД уже проделал соответствующую работу. Однако невозможно не учитывать, что взаимодействия между узлами кластера занимают гораздо больше времени, чем в NUMA-системах, не говоря уже о SMP. Во многих случаях в качестве коммуникационного протокола используется TCP/IP с временные расходами, несоизмеримыми с требуемые для пересылки данных между кэшами. Специальные протоколы работают намного лучше, и возглавляемый компанией Intel консорциум предложил API для внутрикластерных коммуникаций, который называется Virtual Interface Architecture и претендует на роль стандарта.

Тем не менее кластерная архитектура более всего подходит для решения хорошо разделяемых параллельных задач, хотя в системах, подобных Parallel Sysplex компании IBM используется специализированные аппаратура и программное обеспечение, позволяющие решить проблемы коммуникаций между узлами и эффективно выполняющие даже неразделенные OLTP-приложения.

Возможность практически неограниченного наращивания числа узлов и отсутствие единой операционной системы делают кластерные архитектуры исключительно хорошо масштабируемыми. Успешно используются массивно параллельные системы с сотнями и тысячами узлов.

Но мультисистемная природа кластеров имеет и обратную сторону: управление кластером подобно управлению несколькими системами. Помогает наличие инструментов администрирования и управления, но результаты до сих пор менее удовлетворительны, чем для систем с архитектурой SMP и NUMA.