Вашему вниманию предлагается обзор современных возможностей SQL Server 2008 R2 по поддержке многопроцессорных
серверных архитектур. Статья относится только к платформе Windows и затрагивает только те архитектурные особенности многопроцессорных систем, которые показались автору значимыми при развёртывании приложений баз данных SQL Server.
Статья адресована опытным администраторам баз данных SQL Server, знакомым с архитектурой SQLOS и современными платформами Intel и AMD.
Введение
До недавнего времени, наиболее распространённой архитектурой систем с большим числом физических процессоров являлась архитектура неоднородного доступа к памяти Non-Uniform Memory Architecture (NUMA). В основе этой архитектуры лежит такой способ организации доступа к оперативной памяти сервера, который зависит от её расположения (удалённости) по отношению к процессору. Внутренняя организация такой серверной архитектуры отличается от архитектуры SMP систем набором дополнительных компонент, которые обеспечивают взаимодействие процессорных блоков — узлов между собой. Говоря упрощённо, эти компоненты как бы связывают несколько обычных SMP серверов на одной или на нескольких материнских платах, обеспечивая обращения процессоров из одного узла к памяти на другом узле, если это оказывается необходимо.
Сегодня мы с вами становимся свидетелями смены тенденции в развитии архитектур неоднородного доступа к памяти. Классические типы архитектур, которые запомнились, прежде всего, своей высокой стоимостью решений, заменяются близкими по смыслу, но построенными на более дешёвых компонентах, архитектурными решениями. Если сделать краткий экскурс в историю, то мы увидим, что долгое время наиболее распространённой была архитектура NUMA с обеспечением когерентности процессорных кэшей. Вам должна быть знакома аббревиатура ccNUMA. Существовало несколько протоколов и реализаций поддержки когерентности кэшей, некоторые из них были подробно описаны в работе: Архитектура S2MP — свежий взгляд на cc-NUMA. Если кратко, то суть сводится к тому, что изменение в кэше приводит к удалению копий данных из кэшей других процессоров, а информация о копиях хранится в виде битового вектора, в специальном «оглавлении», которое иногда называют кэшем четвёртого уровня, который, по сути, является кэшем метаданных. Пример реализации и описание подобной архитектуры можно найти в статье: Архитектура серверов HP Superdome. Один из вариантов реализации архитектуры ссNUMA был предложен компанией Sequent, и получил название NUMA-Q (это ссNUMA с кводами). Компания была приобретена IBM, и развитие описываемых в статье технологий можно видеть в современных решениях этого вендора.
В последние годы существенно возросло число физических ядер процессоров на один процессорный разъем — сокет (многоядерные процессоры). Существуют решения, например, IBM X-Architecture, которые позволяют ещё больше увеличить число процессорных ядер, что осуществляется за счёт объединения многоядерных SMP систем в блоки серверов. Такие серверные «бутерброды» способны по числу процессоров и по производительности конкурировать с традиционными NUMA системами. По сути, обычные шасси SMP серверов связываются между собой специальными межсоединениями. Многоядерность сама по себе уже вносит неоднородность в доступ к памяти. В случае же, когда несколько серверов с многоядерными процессорами объединяются в единый серверный блок (управляемый одной операционной системой или гипервизором), доступ процессорных ядер к оперативной памяти другого шасси носит ярко выраженный неоднородный характер. Всё это размывает разницу между классическими NUMA — системами и современными SMP-решениями. Некоторые вендоры даже называют построенную на SMP многопроцессорную архитектуру — NUMA-like Architecture.
В современных массовых процессорных архитектурах тоже используется неоднородный доступ к памяти. Например, такая схема реализована для Intel QuickPath Integrated Memory Controller. Это решение отличается тем, что в нём отказались от архитектуры фронтальной шины. Вместе с процессорами на одном кристалле интегрирован контроллер памяти, посредством которых, по схеме точка — точка, подключаются модули оперативной памяти. Такое решение позволяет сгладить «застарелые» проблемы с поддержкой когерентности NUMA. Кроме того, за счёт применения дополнительных чипсетов (например, IBM eX5), удаётся с ущественно нарастить объём оперативной памяти, выделенной каждому процессорному ядру. Это позволяет очень сильно сократить трафик ввода-вывода через процессорные межсоединения. По сути, межсоединениям останется обслуживание только задач поддержки когерентности процессорных кэшей. О современных шинах межсоединений можно почитать в этих статьях: Intel QuickPath Interconnect и HyperTransport.
Что же дальше? Очень похоже на то, что нелинейность доступа к ресурсам останется головной болью администраторов надолго. Появление таких массовых архитектурных решений, как решения на основе QPI, и их «творческое» воплощение разными вендорами способно породить большое разнообразие топологий NUMA. Но это ещё не всё. Сегодня появляются решения, в основе которых заложена парадигма обратной виртуализации. Очень может оказаться, что изложенные в настоящей статье рекомендации и методики окажутся непригодны для таких нетрадиционных решений. Остаётся надеяться, что таким технологиям, как ScaleMP, не покорятся горизонты платформы Windows, и мне не придётся дополнять эту статью главой о NUMAlink.
Современные операционные системы уже немыслимы без поддержки NUMA. Эта поддержка обретает новые качественные улучшения от версии к версии. Так, например, в Windows 2003 была доработана поддержка NUMA в планировщике потоков и диспетчере памяти, а в Windows 2008 поддержка NUMA была добавлена в диспетчере запросов ввода-вывода и внесены усовершенствования в диспетчере памяти.
Существует утилита, которая позволяет увидеть топологию NUMA вашего компьютера. Эта утилита создана Марком Русиновичем, и скачать её можно с сайта sysinternals.com Название утилиты: «Coreinfo». Она позволяет получить данные о ядрах (параметр -c), о группах (параметр -g) и о NUMA — узлах (параметр -n).
Последние версии SQL Server тоже оптимизированы для работы в архитектуре NUMA. Особенности работы SQL Server в NUMA и способы настройки для оптимальной работы NUMA c нагрузками SQL Server будут разобраны в этой статье, а также вашему вниманию будут предложены ссылки на материалы, которые помогут уточнить или углубить представленные в статье рекомендации и описания.
Для успешного использования многопроцессорных платформ, системным администраторам и разработчикам приложений требуются дополнительные средства и меры, позволяющие влиять на распределение потоков между процессорами и закрепление за процессорами ресурсов сервера. Именно о таких мерах и средствах пойдёт речь в этой статье.
Традиционная архитектура NUMA
В этой статье речь идёт об особенностях работы SQL Server на платформе с архитектурой NUMA. Мы ограничимся в своём рассмотрении только теми компьютерами, на которые устанавливается версия операционной системы старше Windows 2000. Традиционной для использования с этой СУБД и ОС архитектурой NUMA являлась платформа на базе процессоров Intel Itanium. В этой главе вам будет представлен краткий обзор особенностей этой архитектуры. Долгие годы серверы масштаба предприятия строились именно на таких процессорах. В 2010 году было объявлено о выходе новой линейки процессоров Itanium, и в этом же году Корпорация Майкрософт объявила о прекращении поддержки этой платформы в своих новых версиях операционных систем, которые появятся после Windows Server 2008 R2.
В традиционной архитектуре NUMA каждый процессорный NUMA — узел имеет локальную по отношению к нему память, доступ к которой процессоры узла осуществляют симметрично и с минимальными задержками. Процессоры работают с памятью через специализированный контроллер памяти, который имеется у каждого узла. Этот контроллер решает и другие задачи, к числу которых относится организация взаимодействия с устройствами ввода-вывода и доступ к памяти других NUMA — узлов компьютера. Для доступа к памяти других узлов контроллеры использует специальную шину, позволяющую процессорам использовать память других узлов. Память других узлов будет являться для них удалённой, и доступ к ней будет с большей задержкой, чем к локальной памяти. Неоднородность доступа в этой архитектуре главным образом относится к памяти, что является основным отличием этой многопроцессорной архитектуры от SMP, и именно такой метод доступа к памяти определяет её название. Задержки обращения к удалённой по отношению к узлу памяти могут иногда на порядок отличаться от задержек обращения к локальной памяти узла. Современные архитектуры серверов используют механизмы «горячих» страниц, которые позволяют отслеживать наиболее активно используемые NUMA узлом участки удалённой по отношению к нему памяти и переносить располагаемые там данные в локальную память.
Кроме локальной памяти, каждый NUMA узел может иметь собственный канал ввода-вывода. Это позволяет соотносить NUMA узлы портам ввода-вывода и локализовать на этом узле только те задачи, которые поступили по предписанным узлам портам.
В качестве шины поддержки когерентности кэшей часто используются специализированные коммутаторы, которые позволяют масштабировать подключения контроллеров памяти. Контроллер памяти может иметь несколько портов, которые выделенной шиной подключаются к отдельным коммутаторам масштабируемости. Ещё одной задачей таких коммутаторов является обеспечение подключения контроллеров памяти к концентраторам ввода-вывода. Концентратор ввода-вывода через мосты подключается к дисковым устройствам ввода-вывода, а также другим, унаследованным устройствам ввода-вывода.
Основной целью NUMA является масштабируемость. Традиционно, наиболее сложными для масштабируемости являются массовые сетевые запросы. Основным недостатком NUMA — систем является их более высокая стоимость относительно традиционных SMP систем. Кроме того, сервера построенные не на платформе Itanium (NUMA-like системы) по числу ядер уже вплотную подобрались к традиционным NUMA системам. Ну и самой плохой новостью является уже упомянутый отказ Майкрософт поддерживать в будущих версиях семейство процессоров Intel Itanium.
Дополнительную информацию о неоднородном доступе к памяти можно найти в электронной документации Microsoft SQL Server Books Online: «Основные сведения о неоднородном доступе к памяти».
Особенности NUMA-like архитектур
Появление архитектуры NUMA-like обусловлено желанием масштабирования недорогих SMP серверов. Выглядит NUMA-like как многоядерный блок из нескольких шасси серверных SMP систем. В NUMA-like неоднородным становится не только доступ к памяти, но и дисковый ввод-вывод, сетевой ввод-вывод, доступ к устройствам на шинах PCI или USB. Такие устройства, как гибкие магнитные диски и приводы CD-ROM могут выборочно отключаться, поскольку классическая архитектура персонального компьютера не предусматривает наличие этих устройств на нескольких шинах.
Когда мы имеем дело с одним шасси сервера, процессоры могут обращаться ко всей его памяти, ко всем присутствующим шинам и адаптерам ввода-вывода. Разницы в производительности у процессоров при работе с памятью практически не будет. Всё меняется, когда шасси соединяются с помощью кабеля/разъёма масштабируемости. В этом случае, та память, шины и адаптеры ввода-вывода, которые будут с процессорами на одном шасси, позволят получать наибольшую операционную производительность. Аналогичные же устройства во втором шасси будут работать с процессорами первого шасси с издержками, которые могут оказаться весьма значительными. Кроме этих издержек, на производительность системы в целом могут повлиять и другие факторы, косвенно или напрямую зависящие от использования схемы с несколькими шасси.
В отличие от традиционной архитектуры NUMA, для которой выпускались специальные версии ОС и СУБД, архитектурные решения NUMA-like становятся чувствительны к выбору платформы, версий и редакций. Неверный выбор редакции или настроек операционной системы может породить проблемы. Например, возможна неверная оценка лицензий при учёте процессорных ядер, вследствие чего система будет неверно представлять прикладному уровню группировку ядер физических процессоров (сокетов). Неудачные реализации или настройки BIOS, а также драйверов устройств, тоже могут породить проблемы для определения точной топологии ресурсов соединённых межсоединениями серверов. Ещё одним возможным источником проблем могут стать неадаптированные к подобной схеме прикладные программы. Причиной деградации производительности таких программ может стать неправильная нагрузка на несколько шасси, приводящая к большому трафику по межсоединениям. Нужно очень тщательно подходить к планированию таких систем. Тут нет мелочей. Как уже отмечалось, даже выбор редакции операционной системы может сказаться на возможностях и производительности системы. Наиболее полный набор возможностей для многопроцессорных систем имеет редакция Datacenter. Проконсультируйтесь у вендора по поводу планируемой конфигурации и выбору версий и редакций её компонент.
В NUMA-like системе физическая память каждого из подключённых в одну систему серверов объединяется в единое, последовательное адресное пространство. С точки зрения организации доступа к памяти, это очень похоже на традиционную архитектуру NUMA. Физическая память каждого из серверов будет ближе к процессорным ядрам этого же сервера, чем к ядрам процессоров других SMP — серверов. Топология узла NUMA-like может включать в один узел все процессоры, относящиеся к одному шасси. Изменить такое формирование узлов позволяет только настройка Soft-NUMA, о которой речь пойдёт ниже.
У NUMA-like обращение к памяти другого сервера подвержено существенным задержкам, точно так же, как это было в традиционной архитектуре NUMA. Это необходимо учитывать при планировании нагрузки системы. Нужно учитывать и увеличение времени ожидания в процессорных очередях. Как ни странно, но численное увеличение числа ядер провоцирует увеличение числа передач контекста пользовательских запросов с одного сервера на другой. Это увеличивает затраты на исполнение запроса, но делает лучше параллелизм.
Более сложными становятся протоколы работы ядер с локальным кэшем. Например, в стандартном для SMP протоколе MESI (Modified. Exclusive. Shared. Invalid), используемом для определения актуальности состояния находящегося в кэше контекста, могут появиться дополнительные типы состояний. Обработка новых состояний тоже потребует дополнительных ресурсов. Да и сами размеры кэшей должны быть существенно больше, что обусловлено необходимостью снижения нагрузки на фронтальную шину FSB, если речь идёт о старых платформах Intel. Впрочем, одноранговые межпроцессорные соединения тоже не упрощают и не удешевляют такие решения.
Ещё одним отличием от традиционной NUMA является то, что соединяющие шасси серверов шины масштабируемости будут обслуживать не только задачи доступа к удалённой памяти. Межсоединения могут взять на себя ещё и задачи ввода-вывода с устройств, подключаемых по шинам PCI или USB. Такое произойдёт, если запросы ввода-вывода будут направлены с одного шасси на другое. В общем случае, для того, чтобы производительность не страдала от архитектурных особенностей NUMA-like, требуется добиться исполнения следующих трёх условий:
- Частота обращений к удаленной памяти должна оставаться существенно ниже, чем к локальной памяти шасси. Тут стоит стремиться к отношению 20% к 80%.
- Задержки удаленного доступа должны быть незначительны, т.е. они должны отличаться от задержек обращения к локальной памяти не больше чем в 10 раз.
- Пропускная способность межсоединения должна в идеале быть больше, чем та, которая требуется для SQL Server.
Бывают случаи, когда использовать возможности NUMA мешают другие аппаратные возможности. Например, у некоторых многопроцессорных серверов на базе процессоров AMD в BIOS может быть включена опция «Node memory interleave», которая фактически перетасовывает адресное пространство разных узлов и делает невозможным использование возможностей NUMA. Для обеспечения поддержки NUMA эта опция должна быть заблокирована.
Поддержка NUMA в операционной системе
Поддержка NUMA реализована в Windows Server 2003/2003R2/2008/2008R2 Enterprise Edition и Datacenter Edition. Для того чтобы операционная система могла задействовать предоставляемые NUMA и NUMA-like возможности, ей должно быть передано с аппаратного уровня описание физической топологии системы. Для этого задействуется специальный интерфейс расширений конфигурации, который определяет спецификацию передаваемой операционной системе таблицы статической привязки ресурсов — Static Resource Affinity Table (SRAT). Если на сервере запущено несколько операционных систем, таблица ресурсов будет включать только выделенные каждой системе ресурсы. Таблица привязки ресурсов может изменяться, при добавлении новых ресурсов, например «горячей» памяти, или вследствие физического изъятия ресурсов.
Во время запуска операционной системы для каждого узла NUMA формируется граф стоимости доступа ядер процессоров к ресурсам. Оценка стоимости основана на величине задержки запросов на доступ к памяти. Подсистема обслуживания листания памяти в Windows Server дополняется новым типом реакции на события доступа к странице памяти — «soft page fault». В отличие от «hard page fault», который показывал, что страницу нужно забрать с диска, этот новый признак говорит о том, что искомая страница находится на дальнем узле.
В спецификацию входит понятие доменов близости, которое позволяет объединить локальные ресурсы с точки зрения NUMA-узла в одну, прикреплённую к этому узлу логическую группу. Операционная система использует информацию из таблицы привязки ресурсов для того, чтобы выбрать используемую по умолчанию привязку процессора, процессов и потоков. Механизм доменов близости позволяет системе преимущественно планировать потоки одного процесса на процессоры одного и того же узла NUMA. Кроме того, система старается распределять для такого процесса локальную по отношению к выбранному узлу память. Таким образом система старается минимизировать дорогостоящие обращения процессоров одного узла к ресурсам других узлов. Каждый новый процесс будет планироваться на следующий по порядку NUMA узел.
Алгоритм работы с ближней и дальней памятью развивается вместе с появлением новых версий Windows. Мы затронем только те особенности, которые присутствовали в Windows 2003 и проследим некоторые изменения и улучшения этих алгоритмов в последующих версиях.
Для управления памятью система создаёт видимые и скрытые пулы для каждого домена близости, которые сопоставляются узлам NUMA. Аналогичным образом распределяется и расширенная для процесса память, доступная через окно трансляции адресов AWE. После первоначального выделения участков памяти для каждого из узлов, система не может динамически перераспределять для нужд приложения уже выделенные участки локальной по отношению к узлу памяти. В Windows 2003 это приводило к тому, что распределение памяти происходило за счёт ресурсов других узлов. Такое наблюдалось в тех случаях, когда поток, которому уже была выделена локальная память, нуждался в дополнительном распределении памяти, и такое распределение уже не возможно было сделать из локальных ресурсов NUMA-узла. Вследствие такого поведения, увеличивались задержки доступа к памяти, поскольку память являлась удалённой по отношению к работающему с ней процессору. Работа с удалённой памятью приводила к снижению производительности за счёт увеличения времени доступа примерно на 100ns. Фактически, по некоторым оценкам, стоимость доступа к удалённой памяти оказывается от 40% до — 300% больше, чем стоимость доступа к локальной памяти. Хотя эта стоимость существенно ниже стоимости доступа к физическим дискам. SQL Server очень часто используется в таких приложениях, которым свойственно большое число потоков. В этом случае, память должна делиться между большим числом потоков или процессов. Операционная система не способна самостоятельно оптимально распределить память, потоки и процессы. Это приводит к тому, что сервер баз данных на системе NUMA будет страдать от частого обращения к удаленным страницам памяти. Ещё одной проблемой становилась такая ситуация, когда процесс короткое время работал на неоптимальном по удалению от памяти узле, мог получать дальнейшее распределения памяти на этом же, неоптимальном узле. Такое распределение тоже снижало эффективность выполняемых операций.
В Windows Server 2003 необходимо особое внимание уделить настройке параметров устройств ввода-вывода и управляющего ими программного обеспечения. Это обусловлено тем, что в этой операционной системе возможности обслуживания ввода — вывода с учётом специфики NUMA были реализованы ещё не в полной мере. Если подсистема ввода — вывода постоянно взаимодействует с одним и тем же NUMA — узлом, снижение нагрузки на дисковую подсистему может быть достигнуто за счёт использования механизмов прямого доступа к памяти — DMA. Если же NUMA — узел должен взаимодействовать с внешней дисковой подсистемой, которая подключена к серверу посредством нескольких адаптеров, схема в вода — вывода будет многоканальной. Это потребует такой настройки программного уровня поддержки ввода — вывода, которая обеспечит обслуживание запросов на ввод — вывод по каждому каналу на тех узлах, которые располагают необходимыми для этих запросов ресурсами. В такой конфигурации прямой доступ к памяти не будет разделяться между несколькими узлами. В операционной системе реализованы возможности оптимизации многоканального ввода — вывода для многопроцессорных систем, но эти возможности должны быть предусмотрены производителем внешней дисковой подсистемы, который должен обеспечить необходимую поддержку для программного уровня.
Дисковая подсистема пока ещё является одним из ключевых компонентов производительности. Поскольку NUMA-like узел потенциально может иметь прямой доступ к дисковому вводу-выводу, операционная система может получить преимущество, обслуживая прерываниями локальных для узла устройств на локальных процессорах. В Windows Server 2003, операционная система умела получать топологию NUMA, но это ограничивалось получением числа узлов и памяти в каждом из узлов. В следующих версиях ситуация стала существенно лучше.
Windows 2008 и NUMA
В Windows Server 2008 алгоритмы распределения памяти были существенно доработаны и улучшены. Операционная система теперь старается распределять память на идеальном с точки зрения близости узле. Этот выбор будет сделан даже в том случае, если процесс начал выполняться на узле неоптимальном с точки зрения близости ресурсов. Если у оптимального узла нет свободной памяти, по таблице SRAT будет выбран наиболее близкий к идеалу узел. Такая политика распределения ресурсов повышает вероятность того, что процесс и его ресурсы будут обслуживаться на одном и том же узле или будет выбрана наиболее оптимальная альтернатива. Наверное, самым важным преимуществом Windows Server 2008 по отношению к Windows Server 2003 в поддержке NUMA является то, как оптимально они управляют близостью ресурсов. Улучшения планировщика в этом направлении позволили заметно оптимизировать размещение ресурсов в узлах NUMA.
Имеющиеся в операционной системе программные интерфейсы позволяют получать информацию о топологии NUMA из прикладных программ. Кроме того, через эти интерфейсы разработчики могут управлять привязкой задач к NUMA узлам. Приложения Windows могут получать информацию о NUMA через специализированный программный интерфейс (API). Вот несколько доступных для этого функций:
- GetNumaHighestNodeNumber — возвращает число узлов;
- GetNumaProcessorNode — возвращает номер узла данного процессора;
- GetNumaNodeProcessorMask — возвращает бинарную маску процессоров данного узла;
- GetNumaAvailableMemoryNode — возвращает размер доступной узлу памяти.
Приложения, адаптированные для использования возможностей предоставляемых интерфейсами NUMA , могут в полной мере воспользоваться масштабируемостью современных архитектур, и демонстрировать высокие показатели производительности. К таким приложениям относится SQL Server. Используя упомянутые выше API, высокопроизводительные приложения могут самостоятельно задавать или изменять привязку потоков к процессорам, чтобы они использовали ресурсы домена близости одного узла. Это особенно полезно, когда потоки сильно зависимы от одних и тех же структур памяти. Адаптированные приложения могут создавать множество потоков, и для этих потоков разработчики приложений смогут использовать возможности оптимизации распределений неоднородной памяти. За счёт этого, адаптированные приложения будут более эффективны в системах с числом процессоров более четырёх, и повышение числа процессоров будет позитивно сказываться на общей производительности.
В Windows 2008 добавилась возможность получения не только топологии процессоров, но и ввода-вывода. Например, можно узнать, на каких шасси NUMA-like системы размещены адаптеры шины (HBA). Имея такую расширенную информацию, можно заметно оптимизировать использование процессоров, настраивая привязку прерываний устройств к ближним процессорам. Это позволяет оптимизировать использование процессоров для обслуживания запросов ввода-вывода. Можно привязать обслуживающие ввод-вывод прерывания к наиболее оптимальным для производительной работы процессорам. В Windows 2003 ввод-вывод мог обслуживаться не тем процессором, который инициировал ввод-вывод. Таким образом данные могли попадать в память не того узла, через который к ним был получен доступ. Поэтому Windows 2008 старается обслуживать ввод-вывод и процедуры отложенного вызова (DPC) на процессорах того узла, где они были инициированы.
Кроме того, в Windows Server 2008 появился новый способ управления прерываниями. В Windows Server 2003 использовались прерывания в виде строки. Прерывание инициировалось устройством, путём подачи электрического сигнала на нужном штырьке (строка прерывания). Такая схема сильно затрудняла привязку нужного процессора к заданному устройству. В Windows Server 2008 устройство генерирует прерывание в виде сообщения, записывая значения данных по специальному адресу. С помощью MSI можно менять приоритет прерывания и для обслуживания прерываний стало возможно указывать конкретные процессоры. Мало того, если система оснащена PCI шиной с поддержкой расширения стандарта MSI-X, управлять обслуживанием прерываний ввода-вывода можно на уровне драйверов устройств. Делается это через специализированные программные интерфейсы Windows 2008. Т.о. прерывание ввода-вывода может быть сразу привязано к тому процессору, который инициировал этот ввод-вывод. Получить дополнительную информацию о поддержке NUMA операционной системой и специализированных функциях можно на сайте Майкрософт, в статье: «NUMA Support».
Диспетчер памяти операционной системы Windows 2008 при размещении невыгружаемого пула, т.е. тех участков оперативной памяти, которые распределяются для ядра и драйверов, учитывает топологию NUMA узлов. Он старается распределять их так, чтобы эти участки памяти выделялись на том NUMA-узле, на котором было инициировано это выделение памяти. Так, например, в случае возникновения необходимости распределения новой страницы PTE (таблица распределения страниц), она окажется на том узле, который инициировал распределение, а не на любом узле, как это было в Windows 2003.
В Windows 2008 диспетчер памяти всегда пытается распределять память потоку из пула наиболее подходящего узла, даже если поток в это время обслуживается другим узлом. Если же на идеальном узле недостаточно памяти, диспетчер проанализирует задержки доступа к другим процессорам и узлам, и на основании полученной информации выберет для распределения тот узел, задержки к которому меньше всего. Кроме того, если поток переходит в состояние ожидания доступа к данным или коду, диспетчер памяти переместит соответствующие страницы в список ожидания наиболее удачного для этого потока NUMA-узла.
Операционная система Windows Server 2008 выбирает оптимальный процессор на основе приоритетов, и если идеальный процессор недоступен, поток планируется на ближайшем к идеальному процессоре локального узла. Если все процессоры локального узла недоступны, операционная система планирует поток на самом ближнем к локальному узлу процессоре. Такая привязка потока к неоптимальному процессору называется мягкой. Привязку потока к процессору можно сделать жёсткой, чтобы впоследствии этот поток не мог быть привязан к другому NUMA узлу. В случае мягкой или жёсткой привязки, операционная система не может просигнализировать приложению, чтобы оно самостоятельно изменило привязку потока. Кроме того, операционная система не сможет самостоятельно перемещать данные из локальной памяти одного узла в локальную память другого узла. Такое перемещение можно осуществить из приложения. Кроме этого, данные могут быть перемещены естественным путём, за счёт механизма листания, который позволяет выгружать давно неиспользуемые страницы данных и по мере необходимости распределять их снова. В последнем случае высока вероятность того, что данные после повторного распределения окажутся в локальной памяти того узла, к которому относится запрашивающий данные поток.
Хотелось бы обратить внимание на то, что вполне вероятна ситуация, когда поток привязан к одному из процессоров NUMA узла, и ему необходимо выполнить распределение памяти, но для этого ему недостаточно локальной памяти этого узла. Важно понимать, что у администратора нет возможности повлиять на распределение памяти в рамках этого узла, и воспрепятствовать распределению потоку дальней по отношению к его узлу памяти. Только в самом приложении, за счёт использования соответствующих программных интерфейсов операционной системы, можно препятствовать тому, чтобы для потока кэшировалась дальняя память. Однако, при таком подходе велика вероятность того, что не занятая приложением дальняя память может быть помечена, как свободная, и будет задействована для других нужд. Вендоры не отмечают каких-либо существенных отличий в адаптации операционной системы к NUMA-like системе, относительно традиционной NUMA. Может возникнуть необходимость в изменении привязки ввода-вывода SQL Server к процессорным ядрам. Например, IBM для своих серверов серии «System x» рекомендует устанавливать адаптеры ввода-вывода (HBA) равномерно распределив их по всем шасси (как вариант: по 2 в каждом шасси). Если адаптеры ввода-вывода устанавливаются не во все шасси, то с помощью параметра глобальной конфигурации сервера «affinity I/O mask» лучше настроить привязку ввода-вывода для ядер тех узлов, в домене близости которых расположены имеющиеся адаптеры, т.е. в тех шасси серверов, куда физически адаптеры были установлены. По поводу привязки сетевых интерфейсов из разных шасси инженеры из IBM рекомендуют при планировании использования для нужд SQL сервера нескольких IP-адресов (например, для балансировки нагрузки или для обеспечения гарантированной производительности передачи данных пользователей и серверов приложений), и привязывать эти адреса к разным NUMA-узлам. Если планируется использовать только один IP-адрес, то никакой привязки делать не надо.
Windows 2008 R2 и NUMA
Начиная с Windows Server 2008 R2 добавлена возможность работы сервера с числом процессорных ядер больше 64-х. Это изменение напрямую повлияло на поддержку операционной системой многопроцессорных архитектур NUMA и non-NUMA. Наиболее заметным новшеством стало добавление ещё одной сущности — групп процессорных узлов. Если процессорных ядер больше 64 — число групп становится больше одной. По существу, с помощью механизма групп разделяются зоны планирования потоков, концентрируя в каждой группе возможности предыдущей версии Windows Server 2008. Это означает, что процесс может работать с несколькими группами одновременно, а поток может исполняться только в рамках одной группы. Кроме того, прерывание может вызываться только для процессоров той же группы. В рамках одной группы работа драйверов и приложений происходит точно так же, как это было в системах, где число процессоров не превышало 64. Это позволяет сохранить обратную совместимость для приложений, которые не были рассчитаны на работу с числом процессоров больше 64. Кроме этого, с помощью групп можно локализовать те аппаратные компоненты, работа которых зависит от места запуска связанных с ними программ, что может положительно сказаться на работе таких программно-аппаратных комплексов.
Каждая группа представляется статическим набором ядер, число которых не превышает 64. В Windows Server 2008 R2 администратору не предоставлено возможности влиять на формирование групп. Принадлежность ядер группе устанавливается во время начальной загрузки Windows, и каждое процессорное ядро может включаться только в одну группу. Операционная система старается минимизировать число групп. Кроме того, все логические процессоры ядра, и все ядра одного физического процессора тоже помещаются в одну и ту же группу. В одной и той же группе оказываются те процессоры, которые физически близки друг к другу. Группа может содержать процессоры одного или нескольких узлов архитектуры NUMA. Если в одном узле ядер больше 64-х, этот узел может быть поделён между несколькими группами. Если сервер non-NUMA, формирование групп основано только на ограничении в 64 ядра, а ядра по группам распределяются равномерно. Концепция групп процессорных ядер допускает горячее добавление процессоров. Если в системе есть сокеты, куда можно будет добавить процессоры, это будет учтено при создании групп, чтобы горячее добавление процессоров не привело к нарушению уже изложенных выше принципов формирования групп.
Каждый процесс или порождённые им процессы могут быть привязаны к неограниченному числу групп, однако в каждый момент времени одиночный процесс может принадлежать только одной группе. Разработчики операционной системы старались обеспечить наилучшую производительность приложений, потоки которых обслуживаются в одной группе (прежде всего, в целях поддержки унаследованных приложений). Кроме того, выбор процессорной группы для приложения может быть обусловлен близостью к тем аппаратным компонентам, к которым приложение обращается. Если приложение явно распределяет свои потоки по нескольким группам, потери производительности не произойдёт только при условии, что работа потоков из разных групп независима, например, приложение умеет выделять независимые секции данных для этих потоков. Иначе, производительность может оказаться существенно ниже варианта с обслуживанием потоков в одной группе.
В прежних версиях Windows, процесс или поток могли быть привязаны к указанному процессору, что гарантировало их исполнение на этом процессоре. В Windows Server 2008 R2 это стало немного сложнее, добавилась концепция групп. Вначале процессы не распределяются последовательно между процессорами групп. Процесс начинает исполняться в рамках только одной группы. Первый поток процесса будет исполняться в той группе, которую ему назначила Windows, если это не изменить из приложения (такая возможность существует и реализуется посредством интерфейсов). Каждый новый поток будет по умолчанию назначен в ту же группу, где обслуживается создавший его поток. Однако, при создании потока, приложение может определить группу, на которую он назначен.
В начале, все потоки процесса создаются в одной группе. Получить назначение в несколько групп может только системный процесс во время запуска системы. Все другие процессы должны быть явно назначены в несколько групп. Это им нужно для того, чтобы использовать все присутствующие в системе процессоры. Т.о. процесс может разрастись, и его потоки будут присутствовать во всех группах, но каждый поток единовременно может исполняться только в одной группе, хотя и может потом сменить её на другую. Смена группы потока отдаётся на откуп приложению, которое будет ответственно за привязку потока к правильной группе, считается, что разработчик может сделать это лучше. Если ничего не предпринимать, то каждое приложение будет удерживаться в рамках одной группы.
Системный пул потоков тоже был доработан и поддерживает теперь привязанную к узлу очередь. Это означает, что Windows будет планировать задачи из очереди узла для потоков этого узла. Если процесс в этом узле недоступен, Windows гарантирует, что задача будет обслужена в той же группе, из которой она попала в очередь. Такой механизм облегчает сохранение близости задачи приложения к её ресурсам. Однако есть несколько документированных исключений из последнего правила, которые выходят за рамки темы этой статьи.
NUMA I/O
Для настройки привязки прерываний устройств ввода-вывода к процессорам или узлам используется специализированный инструмент Майкрософт, который называется Interrupt-Affinity Policy Tool (IntPolicy). Привязка прерывания к одному процессору или группе в документации называется «Interrupt Affinity». Ранее для аналогичных целей использовался Interrupt-Affinity Filter (IntFiltr). Для устройства ввода-вывода IntPolicy позволяет выбрать одну из политик доступности данного устройства или задать маску привязки процессоров. Но даже без такой искусственной привязки, Windows Server 2008 будет стараться обслуживать ввод-вывод на тех процессорах и распределять для него память того узла, который является локальным для этого устройства ввода-вывода. Всё это стало возможно из-за усовершенствования механизма прерываний в Windows Server 2008. Пример использования утилиты IntPolicy для привязки прерываний сетевых интерфейсов можно найти в статье Майкрософт: We Loaded 1TB in 30 Minutes with SSIS, and So Can You. Следует помнить, что неверный выбор привязки прерываний может привести к деградации производительности.
Прерывание может применяться к процессорам только одной группы. В Windows Server 2008 R2 появилась возможность для PCI-адаптеров систем хранения динамически переадресовать прерывания и отложенные вызовы процедур. В документации эта функциональность названа соответственно: «Dynamic interrupt redirection» и «DPC redirection», где DPC это аббревиатура: «Deferred Procedure Call». Такой функционал получил название «NUMA I/O». Задача NUMA I/O — помочь многопроцессорной системе лучше секционировать рабочую нагрузку, повысить норму удачного попадания в кэш, и высвободить встроенные аппаратные средства межсоединений от передачи большого трафика ввода-вывода.
Windows Server 2008 R2 из коробки поддерживает работу сетевых адаптеров по протоколу Receive Side Scaling (RSS). Эта реализация RSS также адаптирована к NUMA. Данные из сетевых пакетов, которые посредством RSS распределяются между процессорами, будут обслуживаться теми же процессорными ядрами, которые обслуживают это TCP-подключение. Пакеты будут переданы на обслуживание физическим процессорам, без учёта гиперпоточности. Операционная система, балансируя средствами RSS входящие пакеты между процессорами, учитывает близость ресурсов узлов NUMA. Причём, при запуске адаптеры с более высокой пропускной способности получают больше процессоров, а несколько равноценных адаптеров поделят имеющиеся процессоры поровну. В системном реестре, в ветке «HKLM\system\CurrentControlSet\Control\class\{XXXXX72-XXX}\<номер сетевого адаптера>\», можно найти несколько ключей, которые показывают закрепление процессоров за адаптерами:
- RssBaseProcNumber — номер первого процессора из диапазона выделенных RSS адаптеру процессоров.
- MaxRSSProcessors — максимальное число процессоров для этого адаптера.
- NumaNodeID — NUMA узел на котором адаптер может распределять память.
Hard-NUMA
В SQL Server поддержка архитектуры NUMA появилась, в ограниченном виде, начиная с SQL Server 2000 SP4. После этого, разработчиками следующей версии SQL Server 2005 была проделана очень большая работа по совершенствованию механизмов взаимодействия с аппаратной платформой и операционной средой. Были выполнены необходимые доработки компонентов ядра сервера баз данных, для того чтобы обеспечить поддержку новшеств, появившихся в SQL Server 2005. Одной из первостепенных задач при разработке компонентов ядра было повышение масштабируемости сервера за счёт использования возможностей, заложенных в современные аппаратные платформы многопроцессорных серверов. В SQL Server 2005 поддержка NUMA была добавлена без каких-либо оговорок. Эта поддержка подразумевает, что планировщики непривилегированного режима (UMS) автоматически группируются точно так же, как группируются в NUMA узлы физические процессорные ядра. Необходимую для этого информацию получает специальный программный слой ядра сервера баз данный — SQLOS. Для этих целей используются описанные ранее программные интерфейсы операционной системы.
Операционная система передаёт в SQL Server аппаратную конфигурацию NUMA, которую принято называть Hard-NUMA. SQL Server создает для каждого узла памяти свой логический планировщик, так, чтобы привязка планировщиков соответствовала аппаратной конфигурации. Изменить привязку планировщиков к ядрам процессоров можно с помощью системной хранимой процедуры sp_configure и параметра глобальной конфигурации сервера «affinity mask». Впоследствии SQL Server старается удерживать планировщиков за своими узлами, если только какой-нибудь процессор не выйдет из строя или не будет отключен.
Если с аппаратного уровня передаётся информация о наличии NUMA — системы, но в топологии присутствует всего один процессор, SQL Server поведёт себя так, как будто он имеет дело с компьютером без NUMA (Non-NUMA).
Для администратора баз данных полезным является тот факт, что при запуске службы SQL Server обнаруженная конфигурация NUMA выводится в виде сообщения в журнал ошибок SQL Server. По этим сообщениям администратор может судить о том, какая конфигурация процессорных узлов используется сервером баз данных в настоящий момент.
В случае с Hard-NUMA, при изменении параметра глобальной конфигурации «max server memory», память для экземпляра SQL Server будет равномерно поделена между доступными ему узлами. SQLOS старается так распределить страницы буферного пула между узлами Hard-NUMA, чтобы потом потоки обращались к страницам буферного пула преимущественно в домене близости локального узла, а не из памяти удалённого узла. Однако возникает необходимость контроля равномерности распределения памяти между узлами. Во время отработки сигнала вытеснения памяти в системе с Hard-NUMA на процесс управления буферным пулом SQL Server будет влиять физическое расположение страниц памяти. Т.е. по сути, это повлияет на то, попадут ли страницы в домен близости данного узла. Однако если страница памяти оказалась вне домена близости узла, к которому относится работающий с ней поток, меры к перемещению страниц буферного пула в ближнюю память предприняты не будут. Если для работы SQL Server выделены не все процессоры, это означает, что при запуске будет предпринята попытка равномерного разделения буферного пула между всеми выделенными экземпляру процессорными узлами. Чтобы не допустить использование под буферный пул одного экземпляра всей оперативной памяти, необходимо задать максимальный размер используемой экземпляром памяти.
Встроенный в SQL Server стабилизатор нагрузки может перемещать процессы от одного процессора к другому. Следуя логике доменов близости, привязка процесса подразумевает то, что он не будет перемещён на процессор, который относится к другому узлу, т.е. на процессор вне домена близости первоначального процессора.
Когда сервер баз данных работает с Hard-NUMA, системный процесс отложенной записи (Lazy Writer) будет присутствовать в одном экземпляре на каждом процессорном узле. Сделано это для того, чтобы работа с памятью была локализована внутри домена близости каждого узла, а также это способствует сокращению числа страниц вне домена близости. Процесс отложенной записи будет вызываться для обслуживания каждой явной и неявной контрольной точки, поэтому работа на NUMA-системе приведёт к увеличению частоты появления контрольной точки.
С помощью системной хранимой процедуры sp_configure можно на ходу менять привязку процессоров к экземпляру сервера баз данных. Т.о. можно отключить процессоры, процессорные узлы и обслуживающие их планировщики. В Hard-NUMA, пока хотя бы один планировщик активен, активным считается и весть NUMA узел. Узел может считаться отключенным, только если все приписанные к нему планировщики отключены. Используемая до этого узлом память будет высвобождена и перераспределена между другими узлами. Если перераспределение памяти нежелательно, необходимо соответствующим образом уменьшить максимальный размер выделяемой серверу памяти. Исполнители, которые работали с отключенным планировщиком, перейдут к активным планировщикам.
Есть небольшая хитрость в том, к какому узлу в Hard-NUMA будут привязаны планировщики с самыми первыми идентификационными номерами. Дело в том, что SQL Server учитывает тот факт, что нулевой физический процессорный узел после запуска операционной системы будет загружен сильнее других, и у него будет меньше других свободной физической памяти. Поэтому, SQL Server перемещает узел по умолчанию с нулевого физического узла на другой узел, вследствие чего основные структуры данных для SQL Server будут обслуживаться на узле, который не так сильно обременён задачами операционной системы. Однако это не означает, что нулевому физическому процессорному узлу память SQL Server распределяться не будет, ему достанется примерно одна треть от нормы.
SQLOS и NUMA
Чтобы лучше понять базовые принципы дизайна и взаимодействия компонент SQLOS в многопроцессорной среде, давайте немного углубимся в архитектуру SQLOS. Узлы процессоров являются подмножеством узлов памяти. Для наглядности, этот факт проиллюстрирован на Рисунке 1. Более подробно о месте узлов памяти в архитектуре SQLOS можно узнать в серии переводов статей Славы Окс на сайте sql.ru: Архитектура SQL Server.
Рисунок 1. Вариант упрощённой блок — схемы SQLOS
Как видно из рисунка, основным элементом управления процессорными ресурсами является узел памяти SQLOS. Все процессорные ядра, попадающие в один узел NUMA, объединяются в узел процессора SQLOS, который сопоставляется с одним узлом памяти SQLOS. Т.о. производительность сервера может быть оптимальной, если приложение способно ограничиваться ресурсами одного узла памяти, либо оно физически так секционировано, что каждой секции данных достаточно одного узла памяти. Это достигается за счёт сбалансированной з агрузки доступных экземпляру сервера аппаратных и программных ресурсов. Однако даже если удастся оптимально секционировать нагрузку по процессорным узлам, останется возможность конфликтов за ресурсы памяти для ядер одного процессорного узла. Такие конфликты возможны, когда ядра разделяют в своей работе одну и ту же область оперативной памяти или общий кэш сокета.
В идеале, нагрузка пользовательских приложений должна секционироваться по всем процессорам или узлам NUMA. В реальных условиях этого достичь очень трудно, особенно, если такое секционирование не было заложено на этапе первоначального дизайна приложения. Операционная система и сервер баз данных должны настраиваться таким образом, чтобы каждый поток попадал на отдельный процессор и на этом же процессоре должно обслуживаться прерывание отдельного сетевого интерфейса, а также порта обслуживания дискового ввода-вывода. Т.е. число сетевых плат и дисковых контроллеров (или HBA) должно равняться числу процессорных ядер, или хотя бы числу узлов NUMA. Продвинутые модели сетевых коммутаторов умеют поддерживать работу с множеством сетевых плат одного сервера. В качестве альтернативы большому числу сетевых плат можно использовать современные сетевые адаптеры, которые поддерживают Receive Side Scaling (RSS) и адаптированы для NUMA архитектур.
В реальных системах достичь равномерного распределения нагрузки между ресурсами сервера оказывается очень сложно. Вероятность обращений к ресурсам вне домена близости процессора оказывается достаточно высокой. Однако прогресс не стоит на месте, и современные архитектурные решения позволяют существенно снизить потери от обращений к ресурсам других узлов. В первую очередь это относится к архитектурам, где процессор обращается к памяти посредством собственного контроллера, по схеме точка — точка, а не через общую шину. Чаще всего, приходится жертвовать оптимизацией загрузки узлов и ядер. Это обусловлено не только сложностью такой оптимизации, но и то, что потери на межузловых взаимодействиях с каждым годом становятся заметно меньше, а встроенные возможности операционных систем и адаптированных к NUMA приложений становятся всё лучше и лучше. Однако стоит помнить, что в резерве остаётся возможность повысить эффективность за счёт приближения распределения нагрузки между ресурсами сервера к идеалу.
Некоторые структуры данных, такие как блокировки или планы исполнения запросов, были адаптированы к использованию на NUMA системах. Такие структуры контролируют своё местоположение и стараются оставаться на том же узле, где они были созданы. Например, блокировки связаны со структурами данных, которые используются для обслуживания транзакций. Если бы они не придерживались единого местоположения, это могло бы породить проблемы. К примеру, стала бы возможна ситуация, когда, несколько организованных координатором распределённых транзакций сеансов попадут для обслуживания на разные узлы. Получается, что один из сеансов должен будет завершить всю транзакцию и получить доступ ко всем структурам данных блокировок. Это приведёт к потерям производительности, поскольку структуры памяти блокировок рассредоточены по разным узлам. По той же самой причине контролирует своё местоположение и буферный пул, т.е. обслуживающие блокировки структуры памяти будут возвращены в тот список свободных буферов, который относится к тому узлу, который владеет выделяемой под структуры памятью.
Посмотреть, сколько памяти распределено на каждом узле, можно с помощью команды DBCC MEMORYSTATUS. Описание этой команды можно найти в статье Базы Знаний Майкрософт: «How to use the DBCC MEMORYSTATUS command to monitor memory usage on SQL Server 2005».
Давайте рассмотрим особенности работы SQL Server со страницами памяти и буферами, которые для процессорного ядра считаются удалёнными, т.е. принадлежащими другому узлу процессора SQLOS. Буферный пул SQL Server может находиться в трёх состояниях. Вначале происходит инициализация буферного пула. Следующее состояние некого переходного периода, когда удалённые относительно локальных процессорных узлов буферы возвращаются операционной системе. После переходного периода наступает устойчивое состояние, когда положение буферов в пуле стабилизируется относительно узлов. Восьмикилобайтный буфер относительно узла может быть внешним или локальным. Число внешних буферов можно определить с помощью счётчика производительности: SQL Server: Buffer Node: Foreign pages. Он показывает число страниц, не относящихся к страницам памяти узла процессора SQLOS, т.е. распределённых узлу из дальней о тносительно узла памяти.
В начальном состоянии буферный пул каждого узла увеличивается до достижения расчётного максимума. При этом SQL Server сортирует выделяемые узлу буферы по двум спискам. В лист свободных буферов попадают те буферы, которые в ближней к узлу памяти. Остальные буферы попадают в лист неблизких буферов. Чтобы сократить использование удалённой памяти, SQL Server не использует буферы из второго списка, Увидеть распределение буферов по разным типам можно с помощью команды DBCC MEMORYSTATUS. К сожалению, в административном динамическом представлении sys.dm_os_buffer_descriptors нет информации о том, какими являются буферы, внешними или локальными. После того, как число буферов достигнет требуемого значения, лист неблизких буферов сбрасывается. Буферы, попавшие в лист неблизких буферов, возвращаются системе. Пока этого не произойдёт, дальнейший «захват» памяти под буферный пул не выполняется. После сброса неблизких буферов, процесс повторяется. Когда буферный пул, после завершения переходной фазы, достигнет заданных величин, его состояние стабилизируется. Листы свободных буферов закрепляются за узлами окончательно, а лист неблизких буферов больше не используется. В таком состоянии, SQL Server пытается по возможности распределять местную память из листа свободных буферов. Если будет использована внешняя страница, это будет отражено в значениях представленного чуть выше счётчика Foreign pages. Т.е., несмотря на то, что SQL Server во время запуска пытается оптимизировать выделение буферов в соответствии с их близостью узлу, наличие внешних страниц не исключается. Мало того, все последующие распределения могут включать внешние страницы. Последующие сжатия и рост буферных пулов NUMA узлов также может приводить к увеличению числа внешних страниц. Для решения подобной проблемы, может оказаться полезным установить в параметрах глобальной конфигурации SQL Server одинаковых значений для максимального и минимального объёма оперативной памяти, выделяемой экземпляру сервера.
Дополнительную информацию можно найти в статьях:
- How It Works: SQL Server 2008 NUMA and Foreign Pages.
- Расширение и сжатие буферного пула в конфигурации с неоднородным доступом к памяти (NUMA)
Важно также помнить, что SQL Server использует для всех NUMA узлов один и тот же откомпилированный план исполнения запроса, но этот план базируется на использовании локальной памяти узла.
Выделенное Административное Соединение (DAC) тоже зависит от того, используется ли NUMA система. SQL Server просто создает в одном из узлов планировщик и узел памяти, необходимые для DAC, и привязывает порт DAC к этому узлу. Дополнительную информацию о поддержке SQL Server архитектуры NUMA можно найти в электронной документации Microsoft SQL Server Books Online: «Как SQL Server поддерживает архитектуру NUMA».
Soft-NUMA
В SQL Server 2005 появилась возможность создавать программные абстракции физических NUMA-узлов, которые могут переопределять число NUMA-узлов и процессорный состав узлов. Это предоставляет администратору баз данных возможность самостоятельно изменить порядок группировки процессоров, с учётом особенностей архитектуры сервера. Такие абстракции получили название Soft-NUMA. Создавать эти абстракции можно путём добавления специальных ключей в системный реестр операционной системы. Подразумевается, что в каждый такой узел может входить один или несколько процессоров.
Soft-NUMA влияет на компоненты SQLOS, которые адаптированы к NUMA. Ели сервер и платформа поддерживают NUMA, то для расщепления узлов Hard-NUMA можно использовать узлы Soft-NUMA. С помощью узлов Soft-NUMA можно перераспределить планировщики и привязать к узлам порты сетевых интерфейсов. Soft-NUMA позволяет вносить изменения только в работу планировщиков и сетевых интерфейсов SQL Server (то, что в англоязычной документации относится к I/O Completion Threads). Число и привязка узлов памяти остаётся неизменно. Это нужно учитывать, т.к. с помощью Soft-NUMA невозможно изменить привязку памяти к узлам Hard-NUMA. Кроме того, узлы Soft-NUMA не получают свой процесс отложенной записи, как это происходит с физическими узлами.
Убедиться в том, что число потоков отложенной записи не превышает числа узлов Hard-NUMA, позволяет следующий сценарий:
SELECT scheduler_id FROM sys.dm_os_workers AS w
JOIN sys.dm_os_schedulers AS s
ON w.scheduler_address = s.scheduler_address
AND w.last_wait_type LIKE ‘%LAZYWRITER%’Важным является также тот факт, что использование Soft-NUMA не изменяет поведение буферного пула (Buffer Pool Locality). Во время инициализации буферного пула происходит его распределение для Hard-NUMA или для Soft-NUMA. В случае с Soft-NUMA, получается, что память узла может резервироваться из локальной и условно удалённой относительно такого узла памяти. Расположение страниц памяти буферного пула не отслеживается, как это делается в Hard-NUMA. Т.е. возможна ситуация обращения к удалённой памяти, что потенциально может привести к снижению производительности. С другой стороны, удалённая для Soft-NUMA узла память может оказаться (и, скорее всего, окажется) локальной для узла Hard-NUMA. Как было описано выше, сервер старается минимизировать работу с удалёнными страницами, что способствует их высвобождению. А поскольку новые страницы распределяются с приоритетом у локальной по отношению к узлу памяти, ситуация с большим количеством страниц в удалённой памяти может постепенно улучшаться.
Если по каким — либо причинам нежелательно разделение буферного пула между узлами Hard-NUMA, есть возможность изменить это поведение. Заставить SQL Server работать со всей памятью, выделенной под буферный пул, как с единственным узлом памяти (плоский доступ), можно включив флаг трассировки 8015, который отключает поддержку NUMA в SQL Server. Подробности о таком режиме использования буферного пула можно найти в статье: How It Works: Soft NUMA, I/O Completion Thread, Lazy Writer Workers and Memory Nodes.
По сути, наиболее важными возможностями Soft-NUMA являются две вещи. С помощью Soft-NUMA можно жёстко задать какие процессорные ядра будут задействованы для обслуживания запроса, направленного на заданный порт сетевого интерфейса. Это будет относиться только к пакетам TDS, и не будет касаться активности базы данных и журналирования этих операций. Каждый узел Soft-NUMA может иметь ассоциированный с ним порт сетевого ввода-вывода. В соответствии с выбранными настройками сетевого протокола, такие порты могут прослушиваться на разных сетевых интерфейсах, что позволяет балансировать не только процессоры, но и сетевой трафик, используя для этого сегментацию локальной сети. Т.е. запросы клиентов будут утилизировать те процессоры, Soft-NUMA узел которых привязан к указанному клиентом порту в строке подключения. Вторая возможность, это увеличение с помощью Soft-NUMA числа потоков завершения ввода-вывода (I/O Completion), о чём пойдёт речь ниже.
Soft-NUMA узлы можно создавать и для систем с обычной архитектурой симметричного доступа процессоров к памяти (SMP). Например, для Non-NUMA серверов, которые оборудованы многоядерными процессорами, характерно совместное, конкурентное использование кэшей второго и/или третьего уровней. Узлы Soft-NUMA можно определять на основе близости процессоров к таким кэшам. В этом случае за счёт объединения в один узел нескольких процессорных ядер оптимизируется использование ими кэша третьего или второго уровня. Также это позволяет частично балансировать загрузку процессоров, распараллеливая рабочую нагрузку среди процессоров Soft-NUMA узла. К слову, можно отметить, что некоторые возможности балансирования нагрузки между процессорами присутствовали и в предшествующих SQL Server 2005 версиях. К таким возможностям можно было отнести: параметры глобальной конфигурации «max degree of parallelism» и «cost threshold for parallelism», подсказку оптимизатору MAXDOP, опцию сервера и запроса — «query governor cost limit», а также методы, подобные описанным в книге Кена Хендерсона «Профессиональное руководство по SQL Server: хранимые процедуры, XML, HTML», и реализованных в виде расширенной хранимой процедуры xp_setpriority.
В случае серверов Non-NUMA, наиболее значительный эффект Soft-NUMA может дать для оптимизации ввода-вывода. Кроме уже упомянутого выше выигрыша от оптимизации за счёт снижения конкурентного доступа к кэшу третьего или второго уровня, дополнительный выигрыш можно получить за счёт увеличения числа потоков ввода-вывода. Увеличение числа потоков происходит потому, что для каждого Soft-NUMA узла будет создан свой поток завершения ввода-вывода. В Non-NUMA сервере существует только один узел с точки зрения NUMA. Современные многоядерные процессоры способны содержать до шести и больше ядер. Т.о. потенциально можно увеличить число потоков ввода-вывода во столько раз, сколько ядер размещено на одном кристалле процессора.
Получить информацию о процессорах и Soft-NUMA узлах, которые доступны SQL Server, можно с помощью специального динамического административного представления (Dynamic Management Views), вызвать которое можно так:
SELECT * FROM sys.dm_os_schedulers;
GO
Это динамическое представление выводит по одной строке для каждого присутствующего в системе планировщика. Каждый планировщик закреплён за одним из процессоров. Представление позволяет диагностировать состояние планировщиков и определять меру их активности, для чего в представлении присутствует множество полей со счётчиками разнообразных событий планировщиков. Принадлежность планировщика к NUMA узлу можно определить по полю parent_node_id, а по полю cpu_id можно определить привязку к процессору. Значение равное 255 в последнем из этих двух полей говорит о том, что планировщик не привязан ни к одному из присутствующих в системе процессоров. Другие поля позволяют определить статус планировщика, т.е. является ли он активным или скрытым, поле is_online позволяет определить используется ли данный планировщик, поле current_workers_count позволяет определить, сколько исполнителей обслуживается этим планировщиком. Более подробную информацию об этом динамическом системном представлении можно получить в комплекте электронных материалов SQL Server 2008 Books Online, поставляемых с дистрибутивом. Ознакомьтесь со статьёй «sys.dm_os_schedulers (Transact-SQL)».
Для того чтобы проверить, обеспечена ли аппаратная или программная поддержка архитектуры NUMA (Hard-NUMA или Soft-NUMA) можно воспользоваться сценарием из блога Славы Окс (blogs.msdn.com/b/slavao), одного из разработчиков подсистем SQLOS:
SELECT CASE COUNT (DISTINCT parent_node_id)
WHEN 1 THEN ‘Поддержка NUMA отключена’
ELSE ‘Поддержка NUMA включена’
END
FROM sys.dm_os_schedulers
WHERE arent_node_id <> 32
Существует ряд ограничений на количество и состав входящих в Soft-NUMA узел процессоров. Эти ограничения зависят от архитектуры сервера и числа процессоров, входящих в аппаратный NUMA — узел. Так, для SMP архитектуры, нельзя допускать, чтобы один и тот же физический процессор входил в состав более одного Soft-NUMA узла. В архитектуре NUMA нельзя включать в один Soft-NUMA узел процессоры из разных NUMA узлов.
Описание Soft-NUMA узла создаётся вручную в системном реестре операционной системы. Для размещения конфигураций узлов необходимо создать специальный раздел:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\90\NodeConfiguration]В этом разделе создаются по одному подразделу для каждого Soft-NUMA узла, и эти подразделы должны называться Node0, Node1, Node2 и т.д. Например:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\90\NodeConfiguration\Node0]В каждом разделе создаётся ключ-параметр с названием CPUMask, например:
«CPUMask»=dword:00000002
Последний пример задаёт шестнадцатеричное значение маски второго физического процессора. Значения маски процессоров устанавливается точно так же, как это делалось для глобального параметра конфигурации SQL Server, известного как: Affinity Mask. Значение этого параметра является целым числом размером в 4 байта и может быть установлено в окне редактирования параметров системного реестра в режиме десятичных или шестнадцатеричных значений.
Дополнительную информацию о том, как настраивать Soft-NUMA узлы, можно получить в электронной документации Microsoft SQL Server Books Online: «Как настроить сервер SQL Server на использование программной архитектуры NUMA».
После определения Soft-NUMA узлов, соответственно должен измениться и порядок закрепления планировщиков непривилегированного режима за этими узлами. Новый порядок закрепления планировщиков повлияет на порядок обслуживания этими планировщиками реальных, физических NUMA — узлов. Это может быть полезно, когда системное окружение SQL Server не позволяет равномерно распределить ресурсы узлам памяти и требуется внести коррективы, чтобы сделать такое распределение более равномерным. Администратор, определяя Soft-NUMA узлы, может постараться так перегруппировать процессорные узлы, чтобы сгладить возможные неравномерности распределения системой ресурсов между NUMA узлами.
Для того чтобы было легче понять, какими средствами обладает администратор в случае необходимости переопределения процессорных узлов, давайте рассмотрим жизненный пример, который можно найти в отчётах по эталонному тесту TPC-C. Информацию об этом тесте можно почерпнуть на сайте tpc.org. Речь идёт о результате в некластерной группе, показанном на сервере HP Integrity Superdome. Результат был опубликован 7 июня 2005г. На этом сервере удалось получить 1082203 tpmC.
Изучая полную версию отчёта, которую можно прочитать на странице краткого описания используемой в эталонном тесте аппаратно — программной конфигурации, можно понять как настраивалась Soft-NUMA. В отчёте легко обнаружить следующие дополнения, которые были внесены в системный реестр операционной системы тестируемого сервера, и которые показаны ниже:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\90\NodeConfiguration\Node0]
«CpuMask»=hex:0F,00,00,00,00,00,00,00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\90\NodeConfiguration\Node1]
«CpuMask»=hex:F0,00,00,00,00,00,00,00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\90\NodeConfiguration\Node2]
«CpuMask»=hex:00,0F,00,00,00,00,00,00
* * *
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\90\NodeConfiguration\Node13]
«CpuMask»=hex:00,00,00,00,00,00,F0,00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\90\NodeConfiguration\Node14]
«CpuMask»=hex:00,00,00,00,00,00,00,0F
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\90\NodeConfiguration\Node15]
«CpuMask»=hex:00,00,00,00,00,00,00,70
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\90\NodeConfiguration\Node16]
«CpuMask»=hex:00,00,00,00,00,00,00,80
Звёздочками в представленном здесь фрагменте ключей системного реестра заменены ключи нескольких программных узлов, алгоритм создания которых можно легко понять, анализируя представленные в отрывке значения CpuMask.
Суть этого решения сводится к тому, что операционная система в процессе загрузки, следуя внутреннему алгоритму очередности использования процессоров, планирует задачи начиная с первого процессора. Если для SQL Server поменять порядок очерёдности выбора процессоров на обратный, тогда SQL Server не будет нагружать во время своего запуска те же процессоры, которые нагружаются операционной системой. Следовательно, после запуска всех служб, процессорные узлы будут более сбалансированно распределять между собой ресурсы, и система быстрее придёт к равновесному их распределению. Для этого, Soft-NUMA узлы переопределяют в представленном выше примере реальные NUMA — узлы таким образом, чтобы последняя четвёрка процессоров последнего NUMA — узла стала первым Soft-NUMA узлом. Следуя этой логике, предпоследний реальный NUMA — узел переопределяется во второй Soft-NUMA узел и так далее, плоть до пятнадцатого узла.
Определение пятнадцатого и шестнадцатого Soft-NUMA узлов немного отличается. Суть этих отличий в том, что первый процессор второго реального NUMA — узла выделен в отдельный программный узел и на этот узел средствами специального скрипта посылается задача исполнения контрольной точки для тестовой базы данных. Это требование определяется спецификой организации тестирования и реализацией, которая была избрана компанией Hewlett-Packard.
Продемонстрированный Вам пример наглядно показывает, как с помощью абстракций процессорных узлов можно повлиять на распределение ресурсов между процессорами и выделить отдельные процессоры или их группы для решения отдельных задач или для обслуживания отдельных процессов, например, процесса контрольной точки.
29 октября 2005 года компания HP представила ещё лучший результат, который был получен путём изменения схемы разбивки и перераспределения физических процессоров на узлы Soft-NUMA. Использовался сервер HP Integrity Superdome 64P c/s, на котором удалось получить 1231433 tpmC. Ниже представлены в сокращённом виде ключи системного реестра, определяющие конфигурацию программных узлов NUMA:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\90\NodeConfiguration\Node0]
«CpuMask»=hex:01
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\90\NodeConfiguration\Node1]
«CpuMask»=hex:02
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\90\NodeConfiguration\Node2]
«CpuMask»=hex:0c
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\90\NodeConfiguration\Node3]
«CpuMask»=hex:30
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\90\NodeConfiguration\Node4]
«CpuMask»=hex:c0
* * *
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\90\NodeConfiguration\Node32]
«CpuMask»=hex:00,00,00,00,00,00,00,c0
Как видно, за исключением первых двух узлов, один из которых был оставлен для контрольной точки, все остальные программные узлы включают в себя по два процессора, чему соответствуют маски 0с и 30. И, как и раньше, избрана реверсивная схема распределения процессоров по узлам. Т.е. SQL Server получает процессоры для своих задач в обратном порядке. Этот подход основан на дроблении NUMA узлов на узлы Soft-NUMA, которые содержат в два раза меньше логических процессоров, чем в начале. Это позволяет сделать распределение ресурсов узлам ещё более равномерным, чем в предыдущем примере, и не нарушает при этом доменов близости аппаратного уровня. Кроме того, такое решение позволяет удвоить число потоков завершения ввода-вывода.
Soft-NUMA для Non-NUMA
Кроме NUMA, сегодня существует ещё несколько архитектур, которые направлены на реализацию масштабируемых многопроцессордер, или на кристалле процессора размещаются другие, общие для всех ядер элементы, например, контроллеры памяти. Такая компоновка сокета тоже вносит неоднородности в доступе к ресурсам, но это не представляется системе, как NUMA архитектура. Т.е. система не получает таблицу SRAT. По сути, Soft-NUMA становится единственным инструментом администратора, позволяющим указать SQL Server на присутствующую неоднородность. Давайте посмотрим, как это делается, на примерах.
22 ноября 2005г. сервер IBM eServer xSeries 460 16P c/s показал результат TPC-C равный 492307 tpmC. Сервер был оснащён двуядерными процессорами Intel Xeon Processor 7040 3.00GHz/2x2MB L2, каждое ядро которых использовало технологию гипертрейдинг. Таким образом, каждый физический процессор в операционной системе представлялся четырьмя логическими процессорами. Для того чтобы обозначить домены близости ресурсов каждого физического процессора, специалисты в IBM объединили четвёрки логических процессоров в Soft-NUMA узлы. Это позволяет учитывать реальное секционирование процессорных кэшей и оптимизировать число потоков завершения ввода-вывода.
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\90\NodeConfiguration\Node0]
«CpuMask»=hex:00,00,00,00,00,00,00,0f
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\90\NodeConfiguration\Node1]
«CpuMask»=hex:00,00,00,00,00,00,00,f0
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\90\NodeConfiguration\Node2]
«CpuMask»=hex:00,00,00,00,00,00,0f,00
* * *
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\90\NodeConfiguration\Node13]
«CpuMask»=hex:00,f0,00,00,00,00,00,00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\90\NodeConfiguration\Node14]
«CpuMask»=hex:0f,00,00,00,00,00,00,00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\90\NodeConfiguration\Node15]
«CpuMask»= hex:f0,00,00,00,00,00,00,00
Когда SQL Server запущен на многопроцессорной конфигурации без NUMA, это практически единственный способ включить оптимизацию работы с неоднородными ресурсами, без которой работа сервера баз данных в подобной конфигурации могла бы быть неоптимальной и не учитывала бы аппаратные особенности сервера.
Другой пример, это сервер Unisys ES7000 Enterprise Server (8P), на котором была установлена операционная система Microsoft Windows Server 2003, Datacenter x64 Edition и Microsoft SQL Server 2005 Enterprise x64 Edition. 22 февраля 2006г. На этом сервере был представлен результат TPC-C равный: 347854 tpmC. Сервер был оснащён восемью процессорами Intel® Dual-Core Xeon® Processor 7041 3.0GHz, 2x2MB Lvl 2 Cache. Каждый процессор, как и в предыдущем примере, имел по два ядра на кристалл, и каждое ядро работало в режиме гипертрейдинга. Таким образом, на восьми кристаллах было размещено шестнадцать процессоров, которые из-за включения режима гипертрейдинга были представлены в операционной системе, как тридцать два логических процессора.
Для того чтобы сервер баз данных мог учитывать реальное секционирование процессорных кэшей, специалисты из Unisys создали представленную ниже топологию Soft-NUMA узлов, объединив в каждый узел по два процессорных кристалла, т.е. по четыре физических процессора или по восемь логических процессоров. Поскольку они посчитали достаточным число узлов равное четырём, можно привести полный набор соответствующих ключей реестра, которые были представлены в отчёте по тесту:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\90\NodeConfiguration\Node0]
«CPUMask»=dword:0xff
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\90\NodeConfiguration\Node1]
«CPUMask»=dword:0xff00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\90\NodeConfiguration\Node2]
«CPUMask»=dword:0xff0000
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\90\NodeConfiguration\Node3]
«CPUMask»=dword:0xff000000
К оглавлению
NUMA для большого числа процессоров
До сих пор мы рассматривали примеры, в которых задействовалось сравнительно небольшое количество процессорных ядер. Однако с выходом Windows Server 2008 R2, возможности операционной системы по обслуживанию большого количества процессорных ядер и, соответственно, программных узлов значительно выросли. Есть некоторые особенности настройки Soft-NUMA для систем, число ядер которых превышает 32. С этими особенностями можно ознакомиться в статье блога «SQL Server SQLOS team»: How to configure Soft-NUMA on a system with > 32 processors?
Следуя этим рекомендациям, например, для создания восьми soft-NUMA узлов на 48-ми процессорном сервере потребуется:
- Привязать процессоры:EXEC sp_configure ‘show advanced options’, 1
RECONFIGURE
GO
EXEC sys.sp_configure N’affinity mask’, N’-1′
GO
EXEC sys.sp_configure N’affinity64 mask’, N’65535′
GO
RECONFIGURE WITH OVERRIDE
GO
EXEC sp_configure
GO
EXEC sp_configure ‘show advanced options’, 0
RECONFIGURE
GO - Выполнить необходимые изменения в системном реестре:Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\100\NodeConfiguration]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\100\NodeConfiguration\Node0]
«CPUMask»=hex:00,00,00,00,00,fc,00,00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\100\NodeConfiguration\Node1]
«CPUMask»=hex:00,00,00,00,f0,03,00,00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\100\NodeConfiguration\Node2]
«CPUMask»=hex:00,00,00,c0,0f,00,00,00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\100\NodeConfiguration\Node3]
«CPUMask»=hex:00,00,00,3f,00,00,00,00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\100\NodeConfiguration\Node4]
«CPUMask»=hex:00,00,fc,00,00,00,00,00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\100\NodeConfiguration\Node5]
«CPUMask»=hex:00,f0,03,00,00,00,00,00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\100\NodeConfiguration\Node6]
«CPUMask»=hex:c0,0f,00,00,00,00,00,00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\100\NodeConfiguration\Node7]
«CPUMask»=hex:3f,00,00,00,00,00,00,00
В этом примере выбрана реверсивная схема определения программных узлов, т.е. порядок логических узлов — обратный физическому порядку объединения ядер в процессорных сокетах. Есть одно отличие от рекомендаций в указанной только что статье. В статье рекомендуется использовать для ключей реестра тип QWORD, однако, мне удавалось добиться правильной работы узлов Soft-NUMA только при типе ключа: DWORD. Использование именно такого типа подтверждается и той информацией, которая следует далее, а также представлена в статье: «Как настроить сервер SQL Server на использование программной архитектуры NUMA». Более подробный пример можно по настройке Soft-NUMA можно найти в статье: «Пример настройки Soft-NUMA».
В SQL Server 2008 R2 появились возможность работать с числом процессоров больше шестидесяти четырёх. Для этого в этой версии СУБД добавлено понятие группы soft-NUMA узлов. Вот как это выглядит в опубликованном 2 ноября 2009г. компанией UNISYS результате теста TPC-E, выдавшем с помощью сервера Unisys ES7000 Model 7600R Enterprise Server (16s) результат: 2012.77 tpsE. В этой конфигурации использовалось 16 шестиядерных процессоров Intel Hex-core Xeon X7460. 96 ядер были распределены по узлам и сгруппированы следующим образом:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\105\NodeConfiguration]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\105\NodeConfiguration\Node0]
«CPUMask»=hex:3f,00,00,00,00,00,00,00
«Group»=dword:00000000
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\105\NodeConfiguration\Node1]
«CPUMask»=hex:c0,0f,00,00,00,00,00,00
«Group»=dword:00000000
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\105\NodeConfiguration\Node2]
«CPUMask»=hex:00,f0,03,00,00,00,00,00
«Group»=dword:00000000
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\105\NodeConfiguration\Node3]
«CPUMask»=hex:00,00,fc,00,00,00,00,00
«Group»=dword:00000000
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\105\NodeConfiguration\Node4]
«CPUMask»=hex:00,00,00,3f,00,00,00,00
«Group»=dword:00000000
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\105\NodeConfiguration\Node5]
«CPUMask»=hex:00,00,00,c0,0f,00,00,00
«Group»=dword:00000000
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\105\NodeConfiguration\Node6]
«CPUMask»=hex:00,00,00,00,f0,03,00,00
«Group»=dword:00000000
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\105\NodeConfiguration\Node7]
«CPUMask»=hex:00,00,00,00,00,fc,00,00
«Group»=dword:00000000
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\105\NodeConfiguration\Node8]
«CPUMask»=hex:3f,00,00,00,00,00,00,00
«Group»=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\105\NodeConfiguration\Node9]
«CPUMask»=hex:c0,0f,00,00,00,00,00,00
«Group»=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\105\NodeConfiguration\Node10]
«CPUMask»=hex:00,f0,03,00,00,00,00,00
«Group»=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\105\NodeConfiguration\Node11]
«CPUMask»=hex:00,00,fc,00,00,00,00,00
«Group»=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\105\NodeConfiguration\Node12]
«CPUMask»=hex:00,00,00,3f,00,00,00,00
«Group»=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\105\NodeConfiguration\Node13]
«CPUMask»=hex:00,00,00,c0,0f,00,00,00
«Group»=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\105\NodeConfiguration\Node14]
«CPUMask»=hex:00,00,00,00,f0,03,00,00
«Group»=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\105\NodeConfiguration\Node15]
«CPUMask»=hex:00,00,00,00,00,fc,00,00
«Group»=dword:00000001
Тут мы видим две группы, в которых топология Soft-NUMA узлов повторяется.
Есть некоторые особенности привязки процессоров, если число ядер сервера больше 64-х. Для настройки SQL Server становятся неприменимы такие параметры глобальной конфигурации, как: affinity mask и affinity mask 64, поскольку с их помощью можно привязать не больше 64-х логических процессоров. Вместо них в SQL Server 2008 R2 появилась новая опция команды настройки сервера: ALTER SERVER CONFIGURATION SET PROCESS AFFINITY. Она даёт возможность привязать потоки процесса SQL Server к заданным NUMA-узлам или процессорам. Это позволяет управлять тем, какие процессорные группы будут доступны для обслуживания потоков процесса SQL Server 2008 R2. Например, вот так можно ограничить работу только первыми 64-мя процессорами:
ALTER SERVER CONFIGURATION SET PROCESS AFFINITY CPU=0 TO 63;В электронной документации к SQL Server рекомендуется включать автоматическую привязку, как это показано ниже:
ALTER SERVER CONFIGURATION SET PROCESS AFFINITY AUTOВместо логических процессоров можно привязывать сразу NUMA-узлы:
ALTER SERVER CONFIGURATION SET PROCESS AFFINITY NUMANODE=8, 12
Стоит отметить, что в SQL Server 2008 R2 Management Studio изменился интерфейс мастера свойств сервера. На закладке привязки процессоров и ввода-вывода процессоры теперь сгруппированы по NUMA-узлам. Причём, если сервер Non-NUMA, все процессоры группируются в одном NUMA-узле.
Более подробную информацию о привязке большого числа процессоров можно получить в статье: «Рекомендации по использованию SQL Server на компьютерах, которые имеют более 64 ЦП». О поддержке большого числа процессоров операционной системой написано в статье: «Supporting Systems That Have More Than 64 Processors».
Привязка портов сетевых интерфейсов к процессорам
Для обслуживания клиентских сетевых запросов в SQL Server 2000 существовала возможность использования нескольких портов сетевых протоколов TCP/IP или VIA. Эти порты могли открываться на одной или нескольких сетевых платах, а также, транслироваться для прослушивания на прокси-сервере. По умолчанию, использовались порт TCP 1433 и порт UDP 1434. Также, существовала возможность динамического выделения портов экземплярам SQL Server.
Начиная с SQL Server 2005, предлагается более гибкая система закрепления портов сетевых интерфейсов. Порты теперь можно закреплять за процессорами, выделенными для работы экземпляру SQL Server. Порты TCP/IP или VIA можно закрепить за Soft-NUMA узлами. Такая привязка процессорных узлов портам сетевых интерфейсов получила название NUMA affinity. Появление этой возможности позволяет административно балансировать сетевые запросы не только между процессорами разных экземпляров SQL Server, но и между процессорами одного экземпляра. Например, можно предоставить доступ к разным портам клиентам с разными типами запросов (отделить аналитические запросы от коротких транзакций). Этим можно снизить влияние продолжительных, тяжёлых запросов на запросы OLTP приложений.
Можно привязать один порт сетевого интерфейса ко всем узлам Soft-NUMA. Такая привязка используется по умолчанию и подразумевает, что SQL Server будет сам балансировать сетевые запросы между программными узлами. При этом, если запрос принят для обслуживания каким-либо узлом и для его исполнения достаточно процессоров одного узла, он будет обслуживаться на нём до своего завершения, а процессоры других узлов задействованы не будут.
Можно привязать каждому процессорному узлу свой, уникальный порт. Такая привязка позволяет обслуживать получаемые портом узла запросы рабочими потоками этого узла, что позволяет задействовать пары процессорный узел / порт для разных клиентских приложений. Это позволяет развести по разным узлам их рабочую нагрузку. В случае такой привязки портов к узлам, приложения получат возможность частично ограждать локальную память физических NUMA узлов и буферы доступа от использования другими приложениями, которые подключаются к серверу через другие порты. Кроме того, сбои в работе приложения или чрезмерная утилизация приложением процессоров не будет влиять на работу других приложений, которые работают с другими процессорами. Однако привязка портов подобным образом может породить перекосы в утилизации процессоров, входящих в разные Soft-NUMA узлы, а также, если какой-нибудь из узлов захватит большую часть физической памяти, другие узлы могут испытывать её нехватку. Это может привести к существенному падению производительности приложений, обслуживаемых через закреплённые за ним порты сетевых интерфейсов.
Можно комбинировать оба представленных выше способа привязки портов к процессорным узлам (один порт ко всем узлам и индивидуальные порты узлов), а также можно привязать к одному программному узлу несколько портов. Разработчик приложения, зная какие порты к каким программным узлам привязаны, теперь может осмысленно выбирать место подключения для решения разных задач. Важным в этом выборе является то, что программные узлы, привязанные к выбираемому для каждой задачи порту, будут иметь горячий кэш именно для нужной приложению задачи, что может способствовать повышению производительности приложений.
Для создания программной абстракции процессора или нескольких процессоров необходимо в системном реестре операционной системы создать специальный раздел, внутри которого определить ключи для каждой абстракции процессора или группы процессоров. Именно это было продемонстрировано в предыдущем разделе.
Давайте рассмотрим на примере образец использования привязки портов к процессорным узлам. Этот вариант настройки можно было увидеть в подробном описание теста TPC-C, опубликованного компанией Hewlett-Packard 22 мая 2006г. Тест выполнялся на сервере HP ProLiant ML370 G5 SAS 3.0 GHz Dual Core, использовались Microsoft SQL Server 2005 Enterprise x64 Edition SP1 и Windows Server 2003 Enterprise x64 Edition SP1. У сервера было всего два процессорных сокета, и в каждом был двуядерный процессор. Компания HP решила определить два NUMA-узла и привязать к каждому из них по одному порту сетевого интерфейса.
Давайте рассмотрим, как это выглядело в виде ключей системного реестра, подробное описание которого компания предоставила в отчёте. Первый, сокращённый пример ключа показывает, как к сетевому интерфейсу с адресом 130.168.211.101 привязывается порт 2000:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.1\MSSQLServer\SuperSocketNetLib\Tcp\IP1
…
Value 2
Name: TcpPort
Type: REG_SZ
Data: 2002
…
Value 5
Name: IpAddress
Type: REG_SZ
Data: 130.168.211.101
…
Ко второму интерфейсу с адресом 130.120.211.100 был привязан порт 2001:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.1\MSSQLServer\SuperSocketNetLib\Tcp\IP2
…
Value 2
Name: TcpPort
Type: REG_SZ
Data: 2001
…
Value 5
Name: IpAddress
Type: REG_SZ
Data: 130.120.211.100
…
Стандартный порт общения с SQL Server привязывался к адресу-заглушке 127.1:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.1\MSSQLServer\SuperSocketNetLib\Tcp\IP3
…
Value 2
Name: TcpPort
Type: REG_SZ
Data: 1433
…
Value 5
Name: IpAddress
Type: REG_SZ
Data: 127.0.0.1
…
Следующий ключ системного реестра указывает привязку портов к существующим NUMA-узлам:
…
Value 0
Name: TcpPort
Type: REG_SZ
Data: 2001[0x1],2002[0x2]
…
Такая привязка портов к процессорным узлам позволила очень простыми средствами балансировать нагрузку внешних клиентов между процессорами системы. Она позволяет более равномерно нагружать процессоры запросами от большого числа клиентов. В этом тесте, компания очень близко следовала рекомендациям из блога одного из разработчиков SQLOS Славы Окс, которые он изложил в статье: Тюнинг SQL Server 2005 для программной поддержки NUMA.
Ещё один интересный пример можно найти в описании теста TPC компании IBM, который был опубликован 12 июня 2006г., и для которого использовались сервера IBM System x3950. Для восьми узлов в системном реестре было определено девять разных портов, а один порт — 1433 был привязан ко всем NUMA-узлам:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.1\MSSQLServer\SuperSocketNetLib\Tcp\IPAll]
…
«TcpPort»=»1433,1434[4],1436[2],1438[1],1440[8],1442[16],1444[32],1446[64],1448[128],1450[256]«
…
29 августа 2008г. компаний INSPUR Group был опубликован результат теста TPC-E, в котором использовалась система с сервером INSPUR NF520D2, использовавшая Microsoft SQL Server 2008 Enterprise x64 Edition на платформе Microsoft Windows Server 2008 Enterprise x64 Edition. В описании конфигурации можно обнаружить использование для указанных выше ключей системного реестра следующей привязки портов к четырём NUMA-узлам: 1433,2001[0x1],2002[0x2],2003[0x4],2004[0x8].
И напоследок, давайте вернёмся к описанному в предыдущей главе результату UNISYS от 2 ноября 2009г. Вот какую привязку узлов к портам использовали они в TPC-E для SQL Server 2008 R2.
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQLServer\SuperSocketNetLib\Tcp\IPAll]
„TcpPort“=»1401[0x1],1402[0x2],1403[0x4],1404[0x8],1405[0x10],1406[0x20],1407[0x40],1408[0x80],1409[0x100],1410[0x200],1411[0x400],1412[0x800],1413[0x1000],1414[0x2000],1415[0x4000],1416[0x8000],1433″
«TcpDynamicPorts»=»«
„DisplayName“=»Any IP Address»
Чтобы убедиться, что порты сетевого интерфейса были успешно привязаны к процессорным узлам, можно открыть журнал ошибок SQL Server, в котором должны появиться строки, подобные этим:
2010-03-23 16:37:16.57 Server Server is listening on [ ‘any’ <ipv4> 1433].
2010-03-23 16:37:16.62 Server Server is listening on [ ‘any’ <ipv4> 2433].
2010-03-23 16:37:16.62 Server SQL Network Interfaces initialized listeners on node 0 of a multi-node (NUMA) server configuration with node affinity mask 0×0000000000000001.
This is an informational message only. No user action is required.
2010-03-23 16:37:16.59 Server Server is listening on [ ‘any’ <ipv4> 3433].
2010-03-23 16:37:16.59 Server SQL Network Interfaces initialized listeners on node 1of a multi-node (NUMA) server configuration with node affinity mask 0×0000000000000002.
This is an informational message only. No user action is required.
Привязка портов применима и для Non-NUMA серверов. При этом, правила, по которым нужно настраивать параметры глобальной конфигурации для SMP сервера с Soft-NUMA узлами фактически такие же, как в случае с неадаптированными к NUMA приложениями. Если целью является исключение передачи части рабочей нагрузки одного Soft-NUMA узла на другие узлы, то SQL Server должен иметь такую конфигурацию, которая не позволяла бы создавать больше потоков, чем количество процессоров, которое пределено для одного программного узла.
Одним из полезных свойств описанного способа управления планированием нагрузки является возможность разнести на разные процессоры одного экземпляра SQL Server запросы от разных клиентов в сети. Это может дать заметный выигрыш в производительности экземпляра, если из-за негативного влияния нагрузок клиентов друг на друга нежелательно обслуживать их на одних и тех же ресурсах. Негативное влияние может проявляться в виде очень долгого использования процессора одним из потоков или конкуренцией исполняемых на одном узле потоков за локальные ресурсы узла. SQL Server предоставляет в распоряжение администратора средства управления планированием потоков. С помощью этих средств администратор может существенно снизить подобное негативное влияние потоков друг на друга.
Кроме того, можно рекомендовать подобное управление планированием потоков для приложений, код которых недоступен для модификации собственными силами. Этот подход применим, если требуется балансировка порождаемой приложениями нагрузки в рамках одного экземпляра SQL Server, а возможности реализовать это на стороне клиента нет. Все изменения, которые потребуется внести администратору — это определить в системном реестре Soft-NUMA узлы. Потом нужно будет привязать к ним порты сетевых интерфейсов, создать необходимые псевдонимы, и прописать соответствующие строки подключения в конфигурации приложения. В итоге, используя новые возможности планирования потоков, можно выделить разные группы процессоров для разных клиентов. В разные группы попадут клиенты, которые посылают серверу «тяжёлые» аналитические запросы, и клиенты, которые посылают серверу короткие транзакции или выборки. Выполнив необходимые для этого настройки, можно минимизировать возможное негативное влияние таких разнотипных запросов к одной и той же базе данных.
Сама возможность балансировки нагрузки между процессорами одного экземпляра SQL Server позволяет экономить лицензии. Отпадает необходимость в приобретении дополнительных серверных лицензий только для того, чтобы балансировать нагрузку между процессорами одного сервера. Теперь, в рамках одного экземпляра, можно выделять и закреплять ресурсы за разными группами приложений. В предыдущих версиях, до SQL Server 2005, это достигалось только за счёт установки дополнительных именованных экземпляров сервера баз данных, а потом, процессоры распределялись между установленными экземплярами (что можно было делать динамически или можно было задать в глобальной конфигурации экземпляров жёсткую привязку процессоров экземплярам). Впрочем, с появлением в SQL Server регулятора ресурсов такую возможность стоит использовать только применительно к версии SQL Server 2005.
Дополнительную информацию о привязке портов сетевого интерфейса к узлам Soft-NUMA также можно получить в электронной документации Microsoft SQL Server Books Online: «Как сопоставить порты TCP/IP порт с узлами NUMA». Другие сценарии привязки портов к процессорным узлам можно найти в статье: «Сценарии NUMA».
Максимальный уровень параллелизма
Само по себе разделение ресурсов по узлам NUMA ещё не гарантирует, что каждый отдельный запрос будет ограничиваться ресурсами только одного узла. Вполне возможна ситуация, когда в силу хороших возможностей для распараллеливания запроса, он может исполняться на процессорах нескольких NUMA узлов. Т.е. если для сервера будет существовать возможность создания такого числа потоков, которое превышает число ядер выбранного для запроса узла, то нагрузка будет размещена и на процессоры, которые не входят в число процессоров выбранного процессорного узла. Механизмы планирования задач операционной системы и SQL Server устроены так, что планирование потоков не привязывается жёстко к схеме процессорных узлов. Если в системе есть свободные процессоры, и не наложено никаких ограничений на число обслуживающих запрос потоков, то нет препятствий задействовать столько процессоров, сколько доступно для экземпляра SQL Server. Это поведение одинаково относительно Soft-NUMA или NUMA-узлов.
Если запрос распараллеливается на число ядер, превышающие число ядер в одном узле NUMA, это может стать причиной обращений к ресурсам из домена близости соседних узлов. Чтобы исключить такие проявления, можно ограничить уровень параллелизма на уровне запроса (используя подсказку оптимизатору) или на уровне сервера, задав отличное от нуля значение параметру глобальной конфигурации сервера: max degree of parallelism.
Пример использования ограничений параллелизма для локализации запроса в рамках одного узла представлен в статье: «Пример настройки Soft-NUMA».
В большинстве случаев, особенности реализации архитектур NUMA-like заставляют искусственно ограничивать параллелизм до числа потоков, не превышающего числа ядер одного шасси, или даже одного сокета. Однако некоторые нагрузки, характерные для задач обслуживания SQL Server, потенциально получают большой выигрыш от распараллеливания. Очень часто, хорошо распараллеливаемые задачи обслуживаются сервером одновременно с задачами, которым выгодна меньшая степень параллелизма. Если максимальная степень параллелизма не ограничена, может оказаться, что такие задачи, как например построение индексов, могут исполняться на процессорах из нескольких шасси. В таком случае, за счёт потерь на межсоединениях, подобные задачи могут работать на большом числе процессоров хуже, чем, если бы они исполнялись на меньшем числе процессоров одного шасси.
Есть уловка, позволяющая временно ограничить число выделенных экземпляру SQL Server процессоров на время выполнения операций обслуживания данных. Для этого можно с помощью системной хранимой процедуры sp_configure изменить маску привязки процессоров (affinity mask), оставив привязку экземпляра только к процессорам одного шасси. Изменение привязки не требует перезапуска службы. После завершения операций обслуживания, можно вернуть исходное состояние привязки.
Высокие показатели производительности и масштабируемости достигаются не только путём использования предоставляемых NUMA возможностей. В приложении баз данных необходимо уделять внимание секционированию кэшей данных и управляющих структур, чтобы их было легче распределять из локальных ресурсов NUMA-узла. Кроме того, необходимо учитывать негативное влияние блокировок больших областей данных, т.к. эти запрашиваемые приложением данные могут обслуживаться несколькими потоками, исполнение которых возможно на разных узлах.
Выводы
В SQL Server 2005 был добавлен новый, усовершенствованный и более приспособленный для работы на современных серверных платформах механизм планирования потоков и распределения ресурсов. В последующих версиях SQL Server 2008 и SQL Server 2008 R2 эти новшества получили дальнейшее развитие. Также, наиболее выигрышны по уровню поддержки NUMA версии операционных систем: Windows 2008 и Windows 2008 R2 Datacenter Edition. Последние версии СУБД и ОС позволяют использовать до 256 процессорных ядер. Всё это делает выбор этих версий более предпочтительным, чем их предшественники. Сегодня, разработчикам и администраторам приложений SQL Server для многопроцессорных архитектур предоставляются следующие выгоды:
- Обеспечен учет аппаратных особенностей современных многопроцессорных архитектур. Внутренняя оптимизация SQL Server позволяет в большинстве случаев обойтись без дополнительных настроек сервера и операционной системы для работы на многопроцессорных системах.
- Обеспечена возможность перераспределения нагрузки и процессорных ресурсов для достижения более высоких показателей производительности или для изоляции ресурсов разных приложений. Для этого не требуется программирования.
- Разработчики баз данных и приложений баз данных могут использовать программные интерфейсы операционной системы и сервера баз данных для исполнения операций манипуляции данными или операций модификации данных на заданных процессорах или процессорных узлах. Это могут быть реальные Soft-NUMA или NUMA-узлы.
- Секционирование памяти по NUMA узлам позволяет управлять актуальностью данных в кэше, причём, приложение может выбирать такой NUMA узел, кэш которого наиболее оптимален для текущего запроса.
- Привязка к узлам Soft-NUMA портов сетевых интерфейсов позволяет балансировать сетевую нагрузку и трафик в сегментах сети. Увеличение числа потоков завершения ввода-вывода за счёт увеличения числа узлов Soft-NUMA для многих типов рабочей нагрузки также позволяет поднять производительность исполнения запросов.
- Богатая коллекция административных динамических представлений позволяет организовать оперативную диагностику работы планировщиков непривилегированного режима, менеджеров памяти и других внутренних сущностей и объектов ядра сервера баз данных. Результаты этой диагностики могут использоваться для выбора наиболее удачной схемы утилизации процессорных ресурсов, чтобы наиболее равномерно распределять нагрузку между процессорами и добиться максимально равномерного распределения памяти.
- Абстракции процессорных узлов или групп процессоров, позволяют оптимизировать распределение задач по процессорам и балансировать сетевые запросы не только на серверах со специализированной процессорной архитектурой, такой, как NUMA, но и на массовых, бюджетных серверах с SMP архитектурой.
Ваши отзывы, пожелания и замечания направляйте, пожалуйста автору на адрес mssqlhelp@rambler.ru
Благодарности
В первую очередь, хочу сказать спасибо Ирине Наумовой, критические замечания и рекомендации которой помогли сделать материал понятней, а текст более «читабельным». Хочу поблагодарить сотрудников Майкрософт, Славу Окс — за то что вдохновил меня и помог с написанием первых вариантов этой статьи в 2006 году. Алексея Халяко — за экспертизу и продуктивную критику, а также за мудрые советы при написании этого варианта статьи. Владислава Щербинина — за то что он как крот искал в тексте плагиат и непростительные ошибки.
We all know that a CPU contains multiple cores today. 2,4,6,8,12,16 etc. cores. So in terms of a physical CPU we tend to talk about a processor that fits in a socket and about cores for logical CPUs. When hyper threading is enabled you double the logical processors seen and used. It is said that Hyper-V can handle hyper threading so you can leave it on. The logic being that it will never hurt performance and can help to improve it. I suggest you test it Smile as there was a performance bug with it once. A processor today contains it own memory controller and access to memory from that processor is very fast. The NUMA node concept is older than the multi core processor technology but today you can state that a NUMA node translates to one processor/socket and all cores contained in that processor belong to the same NUMA node. Sometimes a processors contains two NUMA node like the AMD 12 core processors. In the future, with the ever increasing number of cores, we’ll perhaps see even more NUMA nodes per processor. You can state that all Intel processors since Nehalem with Quick Path Interconnect and AMD processors with Hyper-Transport are NUMA processors. But To be sure, check with your vendors before buying. Assumptions right?
Beyond NUMA nodes there is also a thing called processor groups which help Windows to use more than 64 logical processors (its former limit) by grouping logical processors into groups of which Windows handle 4 meaning in total Windows today can support 4*64=256 logical processors. Due to the fact that memory access within a NUMA node is a lot faster than between NUMA nodes you can see where a potential performance hit is waiting to happen. I tried to create a picture of this concept below. Now you know why I don’t make my living as a graphical artist Eye rolling smile
To make it very clear NUMA is great and helps us in a lot of ways. But under certain conditions and with certain applications it can cause us to take a (serious) performance hit. And if there is anything certain to ruin a system administrators day than it is a brand new server with a bunch of CPUs and loads of RAM that isn’t running any better (or worse?) than the one you’re replacing. Current hyper visors like Hyper-V are NUMA aware and the better servers like SQL Server are as well. That means that under the hood they are doing their best to optimize the CPU & memory usage for performance. They do an very good job actually and you might, depending on your environment never, ever know of any issue or even the existence of NUMA.
But even with a NUMA knowledgeable hyper visor and NUMA aware applications you run the risk of having to go to remote memory. The introduction of Dynamic Memory in Windows 2008 R2 SP1 evens increases this likelihood as there is a lot of memory reassigning going on. Dynamic Memory actually educated a lot of Hyper-V people on what NUMA is and what to look out for. Until Dynamic Memory came on the scene, and the evangelizing that came with it by Microsoft, it was «only» the people virtualizing SQL Server or Exchange & other big hungry application that were very aware of NUMA with its benefits and potential draw backs. If you’re lucky the application is NUMA aware, but not all of them are, even the big names.
As it bears on this discussion, what is interesting that leaked screenshots from Hyper-V 3.0 or vNext … have NUMA configuration options for both memory and CPU at the virtual machine level! See Numa Settings in Hyper-V 3.0 for a picture. So the times that you had to script WMI calls (see http://blogs.msdn.com/b/tvoellm/archive/2008/09/28/looking-for-that-last-once-of-performance_3f00_-then-try-affinitizing-your-vm-to-a-numa-node-.aspx) to assign a VM to a NUMA node might be over soon (speculation alert) and it seems like a natural progression from the ability to disable NUMA with W2K8R2SP1 Hyper-V in case you need it to avoid NUMA issues at the Hyper-V host level. Hyper-V today is already pretty NUMA aware and as such it will try to get all memory for a virtual machine from a single NUMA node and only when that can’t be done will it span across NUMA nodes. So as stated, Hyper-V with Windows Server 2008 R2 SP1 can prevent this form happening as we can disable NUMA for a Hyper-V host now. The downside is that you can’t get more memory even if it’s available on the host.
A working approach to reduce possible NUMA overhead is to limit the number of CPUs to 2 as this gives the largest amount of memory to the CPUs, in this case 50%. 4 CPUs only control 25%, etc.So with more CPU (and NUMA nodes) the risk of NUMA spanning is getting bigger very fast. For memory intensive applications scaling out is the way to go. Actually you could state that we do scale up the NUMA nodes per socket (lots of cores with the most amount of direct accessible memory possible) and as such do not scale up the server. If you can keep your virtual machines tied to a single CPU on a dual socket server to try and prevent any indirect memory access and thus a performance hit. But that won’t always work. If you ever wondered when an 8/12/16 core CPU comes in handy, well voila … here a perfect case: packing as many cores on a CPU becomes very handy when you want to limit sockets to prevent NUMA issues but still need plenty of CPU cycles. This should work as long as you can address large amounts of RAM per socket at fast speeds and the CPU internally isn’t cut up into to many multiple NUMA nodes, which would be scaling out NUMA node in the same CPU and we don’t want that or we’re back to a performance penalty.
First published on MSDN on Sep 27, 2010
Industry Standard Architecture (ISA) technologies have progressed extremely rapidly in the last 10 years. Both Intel and AMD based systems are dramatically different than even just 5-6 years ago. Ten years ago servers usually had either 2 or 4 physical processors plugged into sockets on the server motherboard. The typical memory installed in these systems was 1-2GB, with very few ISA based systems supporting 8 or more processors. The Windows operating system displayed each CPU as one bar in Windows Task Manager. The machine architecture also was very simple with each processor having the same access latency to memory and other resources.
Today ISA servers have increased exponentially in processing capacity to be on par with high cost proprietary UNIX system and complexity. These developments and the associated terminology tends sometimes to confuse people a little. The implications for software licensing of the Windows operating system and SQL database is sometimes unclear.
Today SAP on Win/SQL customers routinely run on servers with 8 processors, 128 logical processors and 512 GB of RAM is nothing unusual. Even on 4 processor commodity Intel servers such as the HP DL 580 G7 we have customers with 512GB RAM. Typical 2 CPU servers are now configured with 128GB of RAM and have 24 logical processors. Let’s go through some terms:
Processor
Sometimes referred to as «CPU» or «Socket». This is the packaged physical piece of silicon that contains all the cores and required shared components. The CPU is the package of components that needs to be put in the processor socket on the motherboard. Besides the multiple cores which are contained on each processor, the current generation of processors by AMD and Intel contains the Memory Controller and the bus to external memory which is administrated by this one processor. In the Windows and SQL Server space, we use the term socket or processor side by side also due to Microsoft’s per socket or per processor licensing.
Microsoft products are licensed per «CPU» meaning per physical processors plugged into sockets on a server motherboard.
Microsoft does not license per CPU core
in contrast to
Oracle
and
IBM
. This means the licensing is based on per socket base independent of the number of cores. The
maximum number of Processors Windows Server 2008 R2
can address depends on the edition. For Data Center Edition it is 64 Processors and 256 logical processors
SQL Server 2008 R2 Enterprise Edition allows a maximum of 8 sockets/processors and up to 256 Logical Processors. Customer with more than 8 processors/sockets and up to 256 Logical Processors
SQL Server 2008 R2 Datacenter Edition
is required. This link has
more information on SQL Server Editions
and features.
Core
Intel & AMD both observed that the physical limitations of CPU manufacturing processes and materials meant that increasing
Processor clock speed
too much over 3GHz resulted in several unwanted side effects. The most apparent side effect was heat. In order to continue to exponentially improve performance Intel and AMD added multiple CPU cores onto each CPU. Sometimes these CPU cores shared L3 caches and other components. All of these CPU cores were integrated onto one physical processor and plugged into one socket on the server motherboard. Today servers with 6-,8- and 12-core processors developed by AMD and Intel are commonly deployed in our SAP customer base we monitor. Today proprietary UNIX hardware has followed the Intel & AMD multicore approach after some years attempting to increase CPU speeds to 5GHz or higher.
Logical Processor
Windows operating system Threads are mapped 1:1 onto Logical Processors. When a server boots the BIOS reports the number of Logical Processors to the operating system at the very earliest stage of starting the operating system. Opening Task Manager and going to the Tab ‘Performance’ will show you the number of Logical Processors. The current supported limit with Windows 2008 R2 Datacenter Edition is 256 Logical Processors. SQL Server 2008 R2 also is supporting a maximum of 256 Logical Processors. Another common terminology used for this unit is ‘CPU thread’. In
SAP Benchmark publications
, the term ‘threads’ is used to describe this unit. All new Intel Nehalem Processors (such as Xeon 55xx, 56xx & 75xx) are
Hyperthreaded
meaning each physical core is presented as two logical processors. This results in twice the number of logical processors displayed in Windows Task Manager.
NUMA Node
Each node on a
Non-Uniform Memory Access
based system is a collection of processors which accessed the same memory. Usually a hardware architecture had more than one NUMA node which was connected via Bus or other topologies. Each NUMA node had its own memory. Applications running on one NUMA node, but accessing memory on the other NUMA node usually encountered longer latency, this in turn greatly reduces performance. Therefore Windows 2003 and SQL Server 2005 included a lot of optimizations to reduce ‘remote’ memory access to a minimum. Today the unit of a NUMA node is usually one processor or socket. Means in most of the cases there is a 1:1 relationship between a NUMA node and a socket/processor. Exception is
AMDs current 12-core processor
which represents 2 NUMA nodes due to the processor’s internal architecture. All new ISA servers are NUMA based after Intel stopped using
Front Side Bus
technology on Nehalem processors with
Quick Path Interconnect
. AMD have used
Hyper-Transport
for some years already
SAP Kernel is completely NUMA unaware, therefore we do not recommend running SAP application servers on large scale up NUMA systems.
Processor Group
In order to get beyond the former Windows limitation of supporting a maximum of 64 Logical processors, a new grouping system was designed. This Unit is a Processor Group or short ‘Group’ Each processor group can contain a maximum of 64 Logical Processors. In order to get to the current supported limit of 256 Logical processors, four processor groups are defined by Windows 2008 R2. More details can be found here:
http://msdn.microsoft.com/en-us/library/dd405503%28VS.85%29.aspx
This graphic displays the hierarchy:
The graphic below shows an
Intel Nehalem EX 8 core Processor
. Each of the 8 cores can be seen. Each of these cores is Hyperthreaded and displays as two bars in Windows Task Manager. A server such as an HP DL980 has 8 of these 8 core Processors. Total Logical Processors = 8 Processors x 8 cores x 2 for Hyperthreading = 128
Let’s look at a server which has 8 Intel Xeon 7560 CPUs. Let’s assume Hyperthreading is enabled. Then we look at:
- Logical Processors: 128 (this is what is displayed in Windows Task Manager)
- Cores: 64
- Sockets/Processors: 8
- NUMA nodes: 8
- Processor Groups: 2
Let’s compare that with a server having 2 brand new AMD Opteron 6174 where we look at:
- Logical Processors: 24 (this is what is displayed in Windows Task Manager)
- Cores: 24
- Sockets/Processors: 2
- NUMA nodes: 4
- Processor Groups: 1
Hope this explains the terms were using a bit. Oh yes, what about the term ‘CPU’? Good question. We are seeing it used all over the place. In the most common usage we still see it used for what we defined as the Logical Processors. However we also find it used quite a lot for what we defined as socket/processor. Therefore if somebody talks about a server with x number of CPUs, better ask what really is meant.
We no longer recommend «One SQL Server Datafile per CPU core» — see
this blog post for determining how many datafiles to configure
New NUMA Support with Windows Server 2008 R2 and Windows 7 Phil Pennington philpenn@microsoft.com Microsoft WSV317
What will you look for?Overall Solution Scalability
AgendaWindows Server 2008 R2 • New NUMA APIs • New User-Mode Scheduling APIs • New C++ Concurrency Runtime
Example NUMA Hardware Today A 256 Logical Processor System – HP SuperDomeA 64 Logical Processor System — Unisys ES7000 64 dual-core hyper-threaded “Montvale” 1.6 GHz Itanium2 32 dual-core hyper-threaded “Tulsa” 3.4 GHz Xeon
Expectsystemswith 128-256 logical processors NUMA Hardware Tommorrow2, 4, 8 Cores-per-Socket «Commodity» CPU Architectures Nehalem Nehalem I/O Hub I/O Hub Nehalem Nehalem PCI Express* PCI Express*
NUMA Node GroupsNew with Win7 and R2 GROUP NUMA NODE Socket Socket Core Core LP LP LP LP Core Core NUMA NODE
NUMA Node GroupsExample: 2 Groups, 4 Nodes, 8 Sockets, 32 Cores, 4 LPs/Core = 128 LPs Group Group NUMA Node NUMA Node Socket Socket Socket Socket NUMA Node NUMA Node Socket Socket Socket Socket Core Core Core Core Core Core Core Core Core Core Core Core Core Core Core Core Core Core Core Core Core Core Core Core Core Core Core Core Core Core Core Core LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP LP
Sample SQL Server Scaling64P To 128P 1.7X 1.3X 64P 128P • Windows Server Performance team sample test lab results
(3) Node Interconnect (1) (4) DiskA MemB Bad Case Disk Write Software and Hardware Locality NOT Optimal Locked out for I/O Initiation Locked out for I/O Initiation (6) (2) ISR DPC (7) I/O Initiator P1 P2 P3 P4 (0) Cache4 Cache2 Cache3 Cache1 (5) Cache(s) I/O Buffer Home DiskB MemA
Node Interconnect DiskA MemB (3) Windows Server 2008 R2Optimization for NUMA Topology I/O Initiator (3) ISR DPC ISR P1 P2 P3 P4 (2) Cache1 Cache2 Cache3 Cache4 (2) Cache(s) DiskB MemA
NUMA Aware ApplicationsNon-Uniform Memory Architecture • Minimize Contention, Maximize Locality • Apps scaling beyond even 8-16 logical processors should be NUMA aware • A process or thread can set a preferred NUMA node • Use the Node Group scheme for Task or Process partitioning • Performance-optimize within Node Groups
demo NUMA API’s “Minimize Contention and Maximize Locality”
AgendaWindows Server 2008 R2 • New NUMA APIs • New User-Mode Scheduling APIs • New C++ Concurrency Runtime
User Mode Scheduling (UMS)System Call Servicing Primary Threads UMS KT (Backing threads) Core 1 Core 2 KT(P1) KT(P2) KT(1) KT(2) KT(3) KT(4) Wake primary to regain core syscall Migrate request to appropriate KT Blocked Parked Parked Parked Parked Running Kernel Kernel UT(P1) UT(P2) User User UMS completion list UT(1) UT(2) UT(3) UT(4) USched ready list
User Mode Context Switch • Benefit • Lower context switch time means scheduling finer-grained items • UMS-based yield: 370 cycles • Signal-and-wait: 2600 cycles • Direct impact • synchronization-heavy fine-grained work speeds up • Indirect impact • finer grains means more workloads are candidates for parallelization
Getting the Processor Back • Benefit • The scheduler keeps control of the processor when work blocks in the kernel • Direct impact • More deterministic scheduling and better use of a thread’s quantum • Indirect impact • Better cache locality when algorithmic libraries take advantage of the determinism to manage available resources
AgendaWindows Server 2008 R2 • New NUMA APIs • New User-Mode Scheduling • New C++ Concurrency Runtime
Visual Studio 2010Tools, Programming Models, Runtimes Tools Programming models PLINQ Parallel Pattern library Agents library Parallel Debugger Task Parallel library Data structures Data structures Profiler and concurrency analyzer Concurrency runtime Task scheduler Thread pool Task scheduler Resource manager Resource manager Operating system Threads/UMS Key: Managedlibrary Nativelibrary Tools
Task Scheduling • Tasks are run by worker threads, which the scheduler controls Dead Zone WT0 WT1 WT2 WT3 Without UMS (signal-and-wait) WT0 WT1 WT2 WT3 With UMS (UMS yield)
demo User-Mode Scheduling API’s and the C++ Concurrency Runtime “Cooperative Thread-Scheduling”
SummaryCall-to-action • Consider how your solution will scale on NUMA systems • Utilize the NUMA API’s to Maximize Node Locality • Leverage UMS for custom user-mode thread scheduling • Use the C++ Concurrency Runtime for most native Parallel Computing scenarios and gain benefits of NUMA/UMS implicitly
Resources • MSDN Concurrency Dev-Center • http://msdn.microsoft.com/concurrency • MSDN Channel9 • http://channel9.msdn.com/tags/w2k8r2 • MSDN Code Gallery • http://code.msdn.microsoft.com/w2k8r2 • MSDN Server Dev Center • http://msdn.microsoft.com/en-us/windowsserver • 64+ LP and NUMA API Support • http://code.msdn.microsoft.com/64plusLP • http://www.microsoft.com/whdc/system/Sysinternals/MoreThan64proc.mspx • Dev-Team Blogs • http://blogs.msdn.com/pfxteam • http://blogs.technet.com/winserverperformance
Required Slide Speakers, TechEd 2009 is not producing a DVD. Please announce that attendees can access session recordings at TechEd Online. Resources • www.microsoft.com/teched Sessions On-Demand & Community • www.microsoft.com/learning • Microsoft Certification & Training Resources • http://microsoft.com/technet • Resources for IT Professionals • http://microsoft.com/msdn Resources for Developers www.microsoft.com/learning Microsoft Certification and Training Resources
Required Slide Speakers, please list the Breakout Sessions, TLC Interactive Theaters and Labs that are related to your session. Related Content DTL203 «The Manycore Shift: Making Parallel Computing Mainstream» Monday 5/11, 2:45-4:00, Room 404, Stephen Toub DTL310 Parallel Computing with Native C++ in Microsoft Visual Studio 2010 Friday 5/15, 2:45-4:00, Room 515A, Josh Phillips DTL403 «Microsoft Visual C++ Library, Language, and IDE : Now and Next» Thursday 5/14, 4:30-5:45, Room 408A, Kate Gregory DTL06-INT «Task-Based Parallel Programming with the Microsoft .NET Framework 4» Thursday 5/14, 1:00-2:15, Blue Thr 2, Stephen Toub
Required Slide Track PMs will supply the content for this slide, which will be inserted during the final scrub. Windows Server Resources Make sure you pick up your copy of Windows Server 2008 R2 RC from the Materials Distribution Counter Learn More about Windows Server 2008 R2: www.microsoft.com/WindowsServer2008R2 Technical Learning Center (Orange Section): Highlighting Windows Server 2008 and R2 technologies Over 15 booths and experts from Microsoft and our partners
Required Slide Complete an evaluation on CommNet and enter to win!
question & answer
Required Slide © 2009 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be registered trademarks and/or trademarks in the U.S. and/or other countries. The information herein is for informational purposes only and represents the current view of Microsoft Corporation as of the date of this presentation. Because Microsoft must respond to changing market conditions, it should not be interpreted to be a commitment on the part of Microsoft, and Microsoft cannot guarantee the accuracy of any information provided after the date of this presentation. MICROSOFT MAKES NO WARRANTIES, EXPRESS, IMPLIED OR STATUTORY, AS TO THE INFORMATION IN THIS PRESENTATION.
Notice: This website is an unofficial Microsoft Knowledge Base (hereinafter KB) archive and is intended to provide a
reliable access to deleted content from Microsoft KB. All KB articles are owned by Microsoft Corporation.
Read full disclaimer for more details.
- Home
- You cannot specify a NUMA node when you create a process by using the «start» command in Windows Server 2008 R2 or in Windows 7
You cannot specify a NUMA node when you create a process by using the «start» command in Windows Server 2008 R2 or in Windows 7
View products that this article applies to.
Consider the following scenario:
- You have a computer that is running Windows Server 2008 R2 or Windows 7.
- You want to use the start /affinity command to create some new processes for a specific preferred NUMA node or for a specific processor group.
Note The start /affinity command is part of the Cmd.exe utility.
In this scenario, the start /affinity command does not let you specify the preferred NUMA node or the processor group. Therefore, you cannot create an affinity between a specific processor and the process when the process is created.
Also, the processes cannot benefit from running on a specially configured set of processors to use the local memory or to distribute processor load when the processes are created.
Notes
- If the a computer has only one processor group, the start /affinity command can create a process that runs on any set of logical processors. However, the command cannot assign the preferred node.
- A computer that has more than 64 active logical processors has more than one processor group.
- The affinity is a tuple that consists of a processor mask and of a processor group number. The processor group number qualifies the processor mask and fully qualifies the processor mask when more than one processor group exists.
For example, the 0x3 processor mask and the 0 processor group represent a different set of processors from the 0x3 processor mask and the 1 processor group.
↑ Back to the top
This issue occurs because the start command for the Cmd.exe utility of Windows Server 2008 R2 and of Windows 7 does not let a user specify a processor group number.
Notes
- The concept of a processor group was introduced in Windows Server 2008 R2 and in Windows 7 to support more than 64 logical processors.
- A user can specify an affinity mask by using the start /affinity command. However, the operating system randomly assigns the preferred node that dictates the processor group. Therefore, the processor group is not deterministic. Additionally, multiple calls of the start /affinity maskcommand may create processes that are running on different processors even if the same affinity mask is assigned.
↑ Back to the top
After you install this hotfix on the computer that is running Windows Server 2008 R2 or Windows 7, you can use /node switch to specify a NUMA node in a start command.
The following are some examples of this new switch in a start command:
start /NODE 1 application1.exe
start /NODE 1 /AFFINITY 0x3 application1.exe
Hotfix information
A supported hotfix is available from Microsoft. However, this hotfix is intended to correct only the problem that is described in this article. Apply this hotfix only to systems that are experiencing the problem described in this article. This hotfix might receive additional testing. Therefore, if you are not severely affected by this problem, we recommend that you wait for the next software update that contains this hotfix.
If the hotfix is available for download, there is a «Hotfix download available» section at the top of this Knowledge Base article. If this section does not appear, contact Microsoft Customer Service and Support to obtain the hotfix.
Note If additional issues occur or if any troubleshooting is required, you might have to create a separate service request. The usual support costs will apply to additional support questions and issues that do not qualify for this specific hotfix. For a complete list of Microsoft Customer Service and Support telephone numbers or to create a separate service request, visit the following Microsoft Web site:
Note The «Hotfix download available» form displays the languages for which the hotfix is available. If you do not see your language, it is because a hotfix is not available for that language.
Prerequisites
To apply this hotfix, you must be running Windows 7 or Windows Server 2008 R2.
Registry information
To use the hotfix in this package, you do not have to make any changes to the registry.
Restart requirement
You do not have to restart the computer after you apply this hotfix.
Hotfix replacement information
This hotfix does not replace a previously released hotfix.
File information
The global version of this hotfix installs files that have the attributes that are listed in the following tables. The dates and the times for these files are listed in Coordinated Universal Time (UTC). The dates and the times for these files on your local computer are displayed in your local time together with your current daylight saving time (DST) bias. Additionally, the dates and the times may change when you perform certain operations on the files.
Windows 7 and Windows Server 2008 R2 file information notes
Important Windows 7 hotfixes and Windows Server 2008 R2 hotfixes are included in the same packages. However, hotfixes on the Hotfix Request page are listed under both operating systems. To request the hotfix package that applies to one or both operating systems, select the hotfix that is listed under «Windows 7/Windows Server 2008 R2» on the page. Always refer to the «Applies To» section in articles to determine the actual operating system that each hotfix applies to.
- The MANIFEST files (.manifest) and the MUM files (.mum) that are installed for each environment are listed separately in the «Additional file information for Windows Server 2008 R2 and for Windows 7» section. MUM and MANIFEST files, and the associated security catalog (.cat) files, are extremely important to maintaining the state of the updated component. The security catalog files, for which the attributes are not listed, are signed with a Microsoft digital signature.
For all supported x86-based versions of Windows 7
File name | File version | File size | Date | Time | Platform |
---|---|---|---|---|---|
Cmd.exe | 6.1.7600.20713 | 302,592 | 14-May-2010 | 02:23 | x86 |
For all supported x64-based versions of Windows 7 and of Windows Server 2008 R2
File name | File version | File size | Date | Time | Platform |
---|---|---|---|---|---|
Cmd.exe | 6.1.7600.20713 | 345,088 | 14-May-2010 | 01:50 | x64 |
Cmd.exe | 6.1.7600.20713 | 302,592 | 14-May-2010 | 02:23 | x86 |
For all supported IA-64-based versions of Windows Server 2008 R2
File name | File version | File size | Date | Time | Platform |
---|---|---|---|---|---|
Cmd.exe | 6.1.7600.20713 | 427,008 | 14-May-2010 | 01:12 | IA-64 |
Cmd.exe | 6.1.7600.20713 | 302,592 | 14-May-2010 | 02:23 | x86 |
↑ Back to the top
To work around this issue, start a process, then change the process affinity.
To change the process affinity, start the Taskmgr.exe utility, click the Processes tab, and then click Set Affinity. Or, use a program that calls the Win32 API.
↑ Back to the top
Microsoft has confirmed that this is a problem in the Microsoft products that are listed in the «Applies to» section.
↑ Back to the top
For the start /affinity command of the Cmd.exe utility, the affinity mask is interpreted differently if you use the /affinity and /node switches together. Specify the affinity mask as if the processor mask of the NUMA node is shifted toward the right side to begin at the bit zero. The process runs on only those processors that are both in the specified affinity mask and in the NUMA node. If no processors are in common, the process runs on only the specified NUMA node.
With the /node switch, you can create processes that use the local memory of the NUMA-based processors efficiently. For example, assume that you have two processes that communicate to one another frequently by using shared memory. In this scenario, memory latency can be reduced by using the /node switch to create processes that share the same preferred NUMA node.
To create two processes that try to allocate memory from the same NUMA node and that can run on the processors that are outside the specified node, run the following command:
start /NODE 1 application1.exe
start /NODE 1 application2.exe
Note The application1.exe and application2.exe placeholders are for the file name of the executable files for the processes.
To create two processes that are further constrained to run on only some specific processors that are in the same NUMA node, run the following command:
start /NODE 1 /AFFINITY 0x3 application1.exe
start /NODE 1 /AFFINITY 0xc application2.exe
Note In these commands, application1.exe runs on the two processors that are in the low-order of the node, while application2.exe runs on the next two processors of the node. Additionally, these commands assume that the specified node has at least four logical processors. When the node number is changed to any valid node number for that computer, the affinity mask does not have to be changed.
Together with start /node functionality, the new %HighestNumaNodeNumber% dynamic environment variable is added to the Cmd.exe utility. With this variable, you can check whether a computer has NUMA-based processors, and you can iterate over all the nodes. The following is a sample script that uses this new variable:
@echo off rem rem This sample script shows the two features that are added to Cmd.exe in Windows 7 rem Service Pack 1: rem rem %HighestNumaNodeNumber% rem This is a new dynamic environment variable. rem Run 'set /?' for more information. rem rem start /node <NUMA node number> rem /node is a new command-line option for the start command that rem can be used to specify the preferred NUMA node for the process rem that is being started. rem Run 'start /?' for more information. rem rem Start several new processes where each preferred NUMA node of a process is rem assigned in a round robin manner across all the NUMA nodes in the system. rem rem Example: Start 7 new processes where the preferred node is distributed rem across 4 NUMA nodes. rem rem start /node 0 process0 rem start /node 1 process1 rem start /node 2 process2 rem start /node 3 process3 rem start /node 0 process4 rem start /node 1 process5 rem start /node 2 process6 rem rem process0 might be process0.exe or process0.cmd. rem if defined verbose echo on setlocal enableextensions enabledelayedexpansion if "%1"=="" ( echo Usage: %0 ^<number of processes to distribute among NUMA nodes^> goto end ) else ( set ProcessCount=%1 ) rem rem %HighestNumaNodeNumber% is a dynamic environment variable that is available rem starting in Windows 7 Service Pack 1. Make sure that a real environment variable rem by this name is not already defined because that value would be used instead rem of the automatic system-generated value. rem set HighestNumaNodeNumber= if not defined HighestNumaNodeNumber set HighestNumaNodeNumber=3 set /a ProcessCountMinusOne=%ProcessCount% - 1 set /a NumberOfNumaNodes=%HighestNumaNodeNumber% + 1 set start=0 set step=1 set end=%ProcessCountMinusOne% rem rem Round robin the start of each process across the NUMA nodes. rem for /L %%p in (%start%, %step%, %end%) do ( rem rem Note the modulo operator (%) used on the command line must be doubled rem up (%%) when the operator is used in a cmd script. rem set /a node=%%p %% %NumberOfNumaNodes% rem rem Remove 'echo' below to actually start these processes. rem echo start /node !node! process%%p ) :end endlocal
For more information about NUMA support, view the following Microsoft website:
For more information about software update terminology, click the following article number to view the article in the Microsoft Knowledge Base:
824684 Description of the standard terminology that is used to describe Microsoft software updates
Additional file information
Additional file information for Windows 7 and for Windows Server 2008 R2
Additional files for all supported x86-based versions of Windows 7
File name | Update.mum |
File version | Not applicable |
File size | 1,680 |
Date (UTC) | 14-May-2010 |
Time (UTC) | 14:46 |
Platform | Not applicable |
File name | X86_8ff5c208de820a3f23ecb2172c25ec66_31bf3856ad364e35_6.1.7600.20713_none_6868ecf613b450e2.manifest |
File version | Not applicable |
File size | 701 |
Date (UTC) | 14-May-2010 |
Time (UTC) | 14:46 |
Platform | Not applicable |
File name | X86_microsoft-windows-commandprompt_31bf3856ad364e35_6.1.7600.20713_none_8bb66e3d9496bfda.manifest |
File version | Not applicable |
File size | 11,450 |
Date (UTC) | 14-May-2010 |
Time (UTC) | 09:21 |
Platform | Not applicable |
Additional files for all supported x64-based versions of Windows 7 and of Windows Server 2008 R2
File name | Amd64_da6e0170a834e89dcda995ffd3c2c09b_31bf3856ad364e35_6.1.7600.20713_none_8ae59c1512489303.manifest |
File version | Not applicable |
File size | 705 |
Date (UTC) | 14-May-2010 |
Time (UTC) | 14:46 |
Platform | Not applicable |
File name | Amd64_e4185a30c8a074969311bf740976f660_31bf3856ad364e35_6.1.7600.20713_none_2202ca9ba02fecde.manifest |
File version | Not applicable |
File size | 705 |
Date (UTC) | 14-May-2010 |
Time (UTC) | 14:46 |
Platform | Not applicable |
File name | Amd64_microsoft-windows-commandprompt_31bf3856ad364e35_6.1.7600.20713_none_e7d509c14cf43110.manifest |
File version | Not applicable |
File size | 11,458 |
Date (UTC) | 14-May-2010 |
Time (UTC) | 04:12 |
Platform | Not applicable |
File name | Update.mum |
File version | Not applicable |
File size | 2,334 |
Date (UTC) | 14-May-2010 |
Time (UTC) | 14:46 |
Platform | Not applicable |
File name | Wow64_microsoft-windows-commandprompt_31bf3856ad364e35_6.1.7600.20713_none_f229b4138154f30b.manifest |
File version | Not applicable |
File size | 10,360 |
Date (UTC) | 14-May-2010 |
Time (UTC) | 04:56 |
Platform | Not applicable |
Additional files for all supported IA-64-based versions of Windows Server 2008 R2
File name | Ia64_46df141649eef34c18ee74d713fdf969_31bf3856ad364e35_6.1.7600.20713_none_b3d0607a1020ba54.manifest |
File version | Not applicable |
File size | 703 |
Date (UTC) | 14-May-2010 |
Time (UTC) | 14:46 |
Platform | Not applicable |
File name | Ia64_e4185a30c8a074969311bf740976f660_31bf3856ad364e35_6.1.7600.20713_none_c5e5d30de7d084a4.manifest |
File version | Not applicable |
File size | 704 |
Date (UTC) | 14-May-2010 |
Time (UTC) | 14:46 |
Platform | Not applicable |
File name | Ia64_microsoft-windows-commandprompt_31bf3856ad364e35_6.1.7600.20713_none_8bb812339494c8d6.manifest |
File version | Not applicable |
File size | 11,454 |
Date (UTC) | 14-May-2010 |
Time (UTC) | 03:43 |
Platform | Not applicable |
File name | Update.mum |
File version | Not applicable |
File size | 1,690 |
Date (UTC) | 14-May-2010 |
Time (UTC) | 14:46 |
Platform | Not applicable |
File name | Wow64_microsoft-windows-commandprompt_31bf3856ad364e35_6.1.7600.20713_none_f229b4138154f30b.manifest |
File version | Not applicable |
File size | 10,360 |
Date (UTC) | 14-May-2010 |
Time (UTC) | 04:56 |
Platform | Not applicable |
↑ Back to the top
Keywords: kb, kbautohotfix, kbqfe, kbhotfixserver, kbfix, kbsurveynew, kbexpertiseadvanced
↑ Back to the top