AMD EPYC Naples vs Rome и обновление планировщика CPU vSphere

Grigory Pryalukhin
Oct 20 · 9 min read

Это перевод статьи Frank Denneman AMD EPYC Naples vs Rome and vSphere CPU Scheduler Updates. Публикуется с разрешения автора.

Недавно AMD анонсировала второе поколение архитектуры процессоров AMD EPYC, EPYC 7002 серии. Большинство, говоря о новой архитектуре процессоров, используют внутренне кодовое имя — Rome. Когда AMD представила первое поколение процессоров EPYC (Naples), ей удалось установить новый рекорд по количеству ядер и объему оперативной памяти на физический сокет. Однако, из-за процессорной архитектуры Multi-Chip-Module (MCM) процессоров AMD их очень сложно напрямую сравнивать с процессорами, построенными по архитектуре Intel Xeon. Поскольку каждый чип содержит выделенный контроллер памяти, он представляет автономный NUMA узел. Это влияет на работу планировщика ОС и, соответственно, на сайзинг виртуальных машин. Подробнее прочитать про это можно здесь и на русском здесь. Процессоры Rome отличаются, новые процессорная архитектура больше соответствует парадигме единого NUMA узла на физический сокет и это позволяет получить более стабильную производительность рабочих нагрузок. Но все равно, есть некоторые различия между Xeon и Rome. Кроме того, мы внесли некоторые изменения в работу планировщика CPU для адаптации его работы к новой архитектуре. Давайте подробнее рассмотрим различия между архитектурами Naples и Rome.

7 нанометровая литография создала новую архитектуру

Архитектура Rome использует новую 7 нанометровую Zen 2 микроархитектуру. Измененный технологический процесс (7нм против 14нм) позволяет производителям процессоров вместить больше процессорных ядер в один процессор. Однако, внутри процессора присутствуют не только процессорные ядра, но такие элементы как контроллеры памяти и ввода-вывода. Масштабируемость интерфейсов ввода-вывода ограничена и поэтому AMD решила использовать отдельный, использующий 14нм процесс кристалл, который содержит контроллеры памяти и ввода-вывода. Этот кристалл обычно называется серверным кристаллом ввода-вывода — Server I/O Die (sIOD). На картинке ниже сравнение процессоров без радиатора Naples (слева) и Rome (справа) — демонстрирует чиплеты с ядрами и sIOD.

AMD EPYC Naples vs. EPYC Rome

Naples Zeppelin vs. Rome Chiplet

На фотографии выше представлена структура процессора. Naples процессор содержит четыре Zeppelin кристалла (черные прямоугольники). Каждый Zeppelin кристалл содержит максимум восемь Zen ядер. Ядра разделены на два Compute Complex (CCX). Каждый Zeppelin 32-ядерного EPYC содержит по 4 ядра в каждом CCX. Когда включен Simultaneous Multi-Threading (SMT) каждый CCX предоставляет восемь потоков. Каждый CCX подключен к Scalable Data Fabric (SDF) через Cache-Coherent Master (CCM), который отвечает за доставку данных между разными CCX. SDF содержит два Unified Memory Controllers (UMC), подключенные к DRAM модулям памяти. Каждый UMC предоставляет канал памяти для двух модулей DIMM, обеспечивая подключение четырех модулей DIMM в сумме. Из-за наличия ядер, кеша и контроллера памяти каждый Zeppelin является NUMA узлом. Для доступа к удаленному, но в рамках одного процессора, контроллеру памяти используется Infinity Fabric On Package Controller (IFOP).

Naples Zeppelin

Rome процессор содержит, произведенный по 14нм технологии, I/O кристалл (центральный черный прямоугольник) и 8 чиплетов (остальные черные прямоугольники). Rome чиплет содержит два CCX, каждый из которых содержит ядра и L3 кеш, но не содержит компонентов ввода-вывода (I/O) и контроллеров памяти. Каждый CCX содержит маленький Infinity Fabric “контроллер”, который соединяет CCX с SIOD. В результате, каждое чтение из памяти за пределами локального L3 кеша CCX проходит через sIOD. Даже для данных из кеша, хранящихся в L3 кеше второго CCX в том же Rome чиплете. Чиплет является частью NUMA узла.

Rome Chiplet

NUMA узел на физический сокет

Как упоминалось раньше, комбинация ядер, кеша и объема памяти, подключенного к локальному контроллеру памяти, является NUMA узлом. В архитектуре Intel каждый физический сокет является NUMA узлом, NUMA Domain per Socket (NPS), AMD Naples содержит четыре NUMA узла на каждый физический сокет, а AMD Rome вернулась к одному NUMA узлу на каждый физический сокет. Один NUMA узел на физический сокет упрощает сайзинг ВМ и приложений, обеспечивая наилучшую и предсказуемую производительность.

NUMA per Socket Overview

Пропускная способность к локальной памяти изменяется в зависимости от архитектуры процессора. Семейство Intel Xeon Scalable поддерживает максимум шесть каналов памяти для DDR4–2933 модулей. Naples поддерживает два канала памяти для DDR4–2666 модулей. Rome поддерживает восемь каналов памяти для DDR4–3200 модулей. Обратите внимание, что контроллеры памяти в архитектуре Rome расположены на центральном кристалле, обслуживающем весь трафик ввода-вывода и трафик обращения к памяти, в Intel архитектуре контроллеры памяти изолированы от любого другого трафика. Для определения влияния архитектуры на производительность полосы пропускания памяти нужно использовать тестирование настоящими приложениями, не синтетическими тестами.

┌─────────────────────┬────────────────┬───────────┬───────────────┐
│ CPU Architecture │ Local Channels │ Mem Types │ Peak transfer │
├─────────────────────┼────────────────┼───────────┼───────────────┤
│ Intel Xeon Scalable │ 6 │ DDR4-2666 │ 127.8 GB/s │
│ AMD EPYC v1 (Naples)│ 2 │ DDR4-2933 │ 46.92 GB/s │
│ AMD EPYC v2 (Rome) │ 8 │ DDR4-3200 │ 204.8 GB/s │
└─────────────────────┴────────────────┴───────────┴───────────────┘

В двухсокетных система обычно существует два разных способа доступа к памяти. Доступ к памяти, подключенной к локальному контроллеру памяти и доступ к памяти, подключенной к контроллеру памяти, расположенному на другом физическом сокете. Для Naples существует три разных способа доступа к памяти. IFOP используется для доступа внутри сокета, Infinity Fabric Inter Socket (IFIS) контроллер обеспечивает маршрутизацию трафика между сокетами. Поскольку в двухсокетной системе имеется восемь Zeppelin и не каждый из Zeppelin подключен к другому напрямую, иногда доступ к памяти осуществляется сначала через IFIS, потом через IFOP и только потом достигает соответствующего Zeppelin.

┌──────────────────────────────────────────────┬──────┐
│ Naples Memory Access │ Hops │
├──────────────────────────────────────────────┼──────┤
│ Local memory access within a Zeppelin │ 0 │
│ Intra-socket memory access between Zeppelins │ 1 │
│ Inter-socket memory access between Zeppelins │ │
│ with direct IFIS connection │ 1 │
│ Inter-socket memory access between Zeppelins │ │
│ with indirect connection (IFIS+Remote IFOP) │ 2 │
└──────────────────────────────────────────────┴──────┘

AMD Rome обеспечивает равноудаленный доступ к памяти внутри процессора и соединение в один хоп при доступе к памяти второго сокета. Доступ к памяти внутри сокета, доступ к кешу внутри сокета всегда происходит через I/O кристалл. Доступ к удаленной памяти и кешу происходит через Infinity Fabric, расположенной между сокетами. Это несколько напоминает архитектуру Intel, с которой мы знакомы начиная с Nehalem, запущенной в 2008г. Различия существуют в дизайне кеша.

Важность кеша в работе планировщика CPU

Увеличение объема памяти, расположенной очень близко к CPU, значительно увеличивает производительность. Поэтому каждый процессор содержит несколько уровней кеша. Каждое ядро имеет небольшую, но чрезвычайно быструю кеш память для команд и данных (L1), немного больший, но относительно медленный (L2) кеш. И третий (L3), больший по объему кеш, разделенный между всеми ядрами внутри сокета (парадигма Intel). Каждый раз, когда ядро запрашивает данные для загрузки, имеет смысл извлечь их из ближайшего возможного источника, обычно это кеш. Чтобы получить представление о том, насколько быстрый кеш относительно локальной и удаленной памяти, посмотрите следующую таблицу:

┌────────────────────────────┬───────────────┬─────────────────────┐
│ System Event │ Actual Latency│ Human Scaled Latency│
├────────────────────────────┼───────────────┼─────────────────────┤
│ One CPU cycle (2.3 GHz) │ 0.4 ns │ 1 second │
│ Level 1 cache access │ 1.6 ns │ 4 seconds │
│ Level 2 cache access │ 4.8 ns │ 12 seconds │
│ Level 3 cache access │ 15.2 ns │ 38 seconds │
│ Remote level 3 cache access│ 63 ns │ 157 seconds │
│ Local memory access │ 75 ns │ 188 seconds (3min) │
│ Remote memory access │ 130 ns │ 325 seconds (5min) │
│ Optane PMEM Access │ 350 ns │ 875 seconds (15min) │
│ Optane SSD I/O │ 10 us │ 7 hours │
│ NVMe SSD I/O │ 25 us │ 17 hours │
└────────────────────────────┴───────────────┴─────────────────────┘

В те времена, когда можно было отключить кеш процессора, кто-то проверял влияние кеша на загрузку Windows 95. С кешем это заняло около пять минут, без использования кеша это заняло более часа. Производительность кеша имеет решающее значение для получения максимальной производительности системы. Поэтому планировщик vSphere NUMA и планировщик CPU работают совместно, чтобы оптимизировать производительность рабочих нагрузок, которые часто обмениваются данными друг с другом. Поскольку они общаются, они обычно используют одни и те же данные. Следовательно, если vSphere сможет выполнять эти рабочие нагрузки на одних и тех же ядрах, совместно использующих кеш, это может чрезвычайно повысить производительность. Проблема в том, что AMD использует другой дизайн кеша, чем Intel.

Last Level Cache Domains

Как показано на диаграмме выше, Intel использует модель отношений 1:1:1. Один сокет соответствует одному NUMA узлу и содержит один домен кеша последнего уровня. Поскольку Intel используется в более чем 98% систем с двумя сокетами (информация основана на внутренних отчетах телеметрии), наша команда разработчиков планировщика, очевидно, сосредоточила большую часть своих усилий именно на таких системах. EPYC Naples представил модель отношений 1:4:2, один сокет, который содержит четыре NUMA узла, и каждый NUMA узел содержит два домена LLC (Last Level Cache). В Rome представлена модель NUMA, аналогичная Xeon, с одним сокетом соответствующим одному NUMA узлу. Однако каждый чиплет содержит два отдельных домена LLC. Rome процессор содержит восемь чиплетов, и поэтому в одном сокете, равном NUMA узлу, содержится 16 различных доменов LLC.

Relational Scheduling

vSphere использует этот домен LLC в качестве цели для своей Relational Scheduling. Relational Scheduling более известный как Action-Affinity. Его действия заставили большинство клиентов думать, что планировщик NUMA был сломан. Поскольку планировщик оптимизирован для совместного использования кеша, может случиться так, что большая часть vCPU работает на одном сокете, тогда как ядра других сокетов не работают. При просмотре ESXTOP вы можете увидеть несбалансированное количество виртуальных машин, работающих на одном узле NUMA (NUMA Host Node (NHN)). В результате виртуальные машины, работающие в этом NUMA узле (или в терминологии ESX NHN), могут конкурировать за ресурсы CPU и, таким образом, увеличивать %Ready time.

Примечание: я считаю, что нужно проверить влияние Relational Scheduling на производительность приложений. Не проверяйте это с помощью синтетических тестов. Хотя %Ready time нужно избегать, некоторые приложения выигрывают больше от низкой задержки при доступе к памяти, чем проигрывают от увеличения задержек в работе планировщика CPU.

Action-Affinity может привести к снижению %Ready time в Intel архитектуре CPU, где более восьми ядер совместно используют один и тот же домен кеша, представьте, как это может повлиять на системы AMD EPYC, где максимальное число ядер на домен кеша равно четырем. В системах AMD EPYC с меньшим количеством ядер, ядра отключены для каждой CCX, что еще больше сокращает число ядер на кеш.

Поскольку большинство центров обработки данных работают на Intel, vSphere оптимизирована для топологии CPU, где NUMA узел и LLC домен имеют одинаковый размер. У AMD их размеры отличаются, и, следовательно, текущий планировщик CPU может принимать “неоптимальные” решения, влияющие на производительность. Это происходит, когда планировщик NUMA определяет client size, количество vCPU, которые должны работать на одном NUMA узле, но еще и CPU планировщик решает какие vCPU на каких физических ядрах будут работать. Поскольку в NUMA клиенте имеется несколько доменов кеша, может так случиться, что между доменами кеша в NUMA будет происходить огромное количество миграций vCPU. А это означает “холодный” доступ к кешу.

Поэтому команда разработчиков планировщика CPU очень усердно работала над оптимизацией для архитектуры AMD, и эти изменения учтены в обновлениях ESXi 6.5 Update 3 и ESXi 6.7 Update 2.

Это обновление сообщает планировщику CPU о наличии нескольких доменов кеша в NUMA узле, что позволяет ему более разумно располагать vCPU. В этом обновлении также представлен автоматический virtual NUMA client sizer. По умолчанию виртуальная архитектура NUMA презентуется гостевой ОС, только когда количество vCPU превышает количество физических ядер физического NUMA узла и если количество vCPU не меньше, чем параметр numa.vcpu.min, который по умолчанию равен 9. Физический NUMA узел в Naples насчитывает восемь ядер, поэтому виртуальная NUMA топология не презентуется. С обновление это решено. Важно отметить, что по умолчанию виртуальная топология NUMA определяется при первой загрузке. Поэтому для использования этой новой функциональности существующие виртуальные машины должны сбросить свою виртуальную топологию NUMA. Это потребует отключения питания виртуальной машины для удаления настроек NUMA из VMX файла.

При внедрении систем на базе Naples/Rome настоятельно рекомендуется установить последнее обновление предпочитаемой версии платформы vSphere. Это позволит достичь максимальную производительность.

Grigory Pryalukhin

Written by

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

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade