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

Это перевод статьи 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 нанометровая литография создала новую архитектуру

AMD EPYC Naples vs. EPYC Rome

Naples Zeppelin vs. Rome Chiplet

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 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

┌────────────────────────────┬───────────────┬─────────────────────┐
│ 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

Примечание: я считаю, что нужно проверить влияние 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. Это позволит достичь максимальную производительность.

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

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