Почему сервер не просто «большой макбук»

dbc6a51e2b57ea334dc985dfbdc11012

Топология памяти

Очень часто вижу подход к серверам и вычислительной инфраструктуре на кухонном уровне даже от вроде бы профессиональных людей с высочайшими ЗП в полмиллиона и выше.
Сервер — это просто большой макбук, а СХД просто большой диск.

Итак, давайте разбираться. И начнем со страшной темы — топология памяти.

Объяснять буду реально на желудях и шишках, поэтому сразу просьба к крутым суперпрофи — не надо пытаться меня уличить, это не для вас написано.

Есть процессор, который исполняет команды, и канал доступа к памяти, которая требуется для этих команд. Канал характеризуется двумя показателями: задержка доступа (через сколько наносекунд придет ответ), ширина канала (сколько гигабайт в секунду).

Задержка. UMA / NUMA

UMA — Uniform Memory Access, архитектура с равномерным доступом к памяти. В многопроцессорной (многоядерной) системе расстояние (задержка) от любого процессора (ядра) до любого блока памяти постоянна и одинакова.

NUMA — NonUniform Memory Access, архитектура с НЕравномерным доступом к памяти. В многопроцессорной (многоядерной) системе расстояние (задержка) от процессора (ядра) блока памяти различна.

В чем разница для программиста / архитектора-проектировщика? В случае с NUMA системой нужно продумывать особенности развертывания системы (модулей) и конфигурации, чтобы работать на полной скорости, избегая (минимизируя) дальние обращения. Если вы не понимаете как с этим работать, то легко получите до минус 30% производительности.

Напомню любителям AMD, что недавние поколения серверных AMD имели NUMA архитектуру даже внутри сокета. Т.е. по сути это был хак — два кристалла упаковали в один корпус.

Топология процессоров (при >2)

В случае с 2 процессорами все понятно, есть CPU1 <-> CPU2. А вот уже при 4 процессорах становится интереснее. Есть варианты с полносвязной системой и с промежуточными узлами.
Полносвязная система — когда есть прямой канал от каждого процессора к каждому, и соответственно задержка при обращении к чужой памяти одинаковая.
Система с промежуточными узлами имеет меньшее количество линков. Т.е. всего по два линка на каждый процессор.

  • CPU1 <-> CPU2 <-> CPU4

  • CPU1 <-> CPU3 <-> CPU4 И в этом случае CPU3 при обращении к памяти CPU2 получает двойную задержку, что еще сильнее роняет производительность.

Ширина памяти

Ширина (ПСП — пропускная способность памяти) обеспечивается целой кучей параметров, из которых остановимся на двух: количество каналов памяти на контроллере памяти, скорость модуля.

И начнем со скорости. Все, кто выбирал (собирал) компьютер, видел такую вещь как DDR4–2933 (цифры могут меняться). Совсем на пальцах — DDR3, DDR4, DDR5 — это условно формат гнезда памяти, т.е. модуль DDR5 не вставишь в сервер с DDR3 слотами. А 2933 (иногда PC2933) — это собственно скорость этого модуля. Причем измеряется она не в MHz, как иногда ошибочно пишут, а в MT/s.
DDR — Double Data Rate — способ передачи информации с удвоенной скоростью, когда информация передается не самим 0/1, а крутизной фронта сигнала (а фронтов два). Поэтому настоящая частота в два раза ниже. Т.е. PC3200 — это 3200 MT/s (mega transfers / sec), которая работает на частоте 1600 MHz.

И вот в какой то момент мы начинаем выедать полную ширину и ограничиваемся в производительности скоростью памяти.

Поэтому придумали многоканальные контроллеры памяти — можно одновременно и независимо друг от друга обращаться сразу к нескольким модулям памяти. Что в конечном итоге увеличивает теоретическую ПСП в N раз (N — количество каналов). А для двухпроцессорной системы в 2 N раз соответственно. Теоретическую — потому что в реальности еще все зависит от того, как данные размазались по физическим модулям памяти, конечно же.

И вот тут следует вопрос: так продаются же крутые модули памяти, 6000, давай ими и набьем сервер.

Здесь есть два момента:

  • крутые модули типа 6000 — это НЕрегистровая память для энтузиастов игроманов-оверклокеров. Если вдруг чо, то ну перегрузишься, ничего страшного.

  • серверная память — регистровая, т.е. там стоит дополнительная микросхема для повышения стабильности работы.

Короче, в зависимости от класса сервера такую память либо нельзя / либо не надо ставить (как рекомендация).

Почему такая принципиальная разница в десктопном / северном мире?

Десктопные процессоры — это процессоры для однопроцессорных машин, причем максимум с двумя каналами памяти. Когда ты исчерпал два канала, остается только повышать частоту.

Серверные процессоры решают проблему ширины памяти путем многопроцессорных конфигурация с много (более 2) канальной памятью. Например Xeon Scalable v2 имеет 6-канальную память (и этим обуславливается объем памяти кратный 6 модулям — 192, 384, 768).

Десктоп 1×2 * DD5 5600 = 11 200 (Core i9)
Сервер 2×6 * DDR4 3200 = 38 400 (Xeon Scalable v2)
Сервер 2×8 * DDR5 4000 = 64 000 (Xeon Scalable v4)

Вы можете возразить, а как же AMD Ryzen ThreadRipper? Там 8 каналов памяти.
Да, вы совершенно правы. Только посмотрите на его стоимость, он подороже иных Xeon будет, и именно это обуславливает его крайне нишевое применение, где он борется за место уже с рабочими станциями на серверных процессорах.

* по маркировке. Может применяться DDR4 3200 = PC4 25600 (MB/s)

Выбор процессора.

Встал тут в чатике вопрос — какой процессор взять, Xeon 5317 или 6330? Давайте разберем на этом примере на что смотреть и что имеет значение.

Для простоты задачи сразу примем как данность, что сервер у нас большой, минимум 2U и нет проблем ни с питанием, ни с охлаждением. Не вдаваясь в размышления почему именно эта пара, давайте ее рассмотрим.

Оба процессора относятся к одному поколению, Xeon Scalable v3

5317 — 12 ядер по 3 GHz, 3.6 турбо, 18 MB L3
6330 — 28 ядер по 2 GHz, 3.1 турбо, 42 MB L3

Самый простой способ сравнить в лоб — база * ядра. Итого 36 против 56 (все коэффициенты гипертрединга считаем одинаковыми и просто выбрасываем из рассмотрения). Казалось бы, что тут еще сравнивать?

А вот здесь кроется проблема в наличии понимания как работает процессор, ядро ОС, планировщик гипервизора и прикладное ПО.
Чисто теоретически 6330 превосходит 5317 в 56 / 36 в 1.56 раза, но для реализации этого превосходства необходимо подать на него соответствующую нагрузку. А именно — множество слабосвязанных потоков, способных загрузить то самое превосходящее количество ядер. Причем именно слабосвязанных, посколько по мере роста связности и зависимости потоков начнется фрагментация времени продуктивной работы и накладные расходы на синхронизацию. Т.е. это процессор для массы VDI машин с 2–4 vCPU или кучи каких то контейнеров, причем реально кучи, с коэффициентом vCPU / pCore от 5 и выше.
Если же двинуться от множества маленьких машин к некоторому количеству машин большего размера при общем снижении vCPU / pCore, то рано или поздно начинает играть фактор низкой частоты на ядро.
Максимальная производительность ВМ с 6 vCPU на 5317 = 18 GHz. Для 6330 чисто гипотетически можно дать 9 vCPU, но как мы понимаем, ситуация с равномерной загрузкой ядер практически невозможна, если это не расчетная ферма. И в реальной ситуации часто есть нагрузка на 1–2 ядра. Т.е. фактически это не 18 GHz, а 6 против 4. Или при учете турбо — 7.2 против 6.2. И что интересно, словить турбо на 28 ядерном процессоре значительно сложнее, т.е. 7.2 против 4–5.

6330 имеет почти в 3 раза больший L3 кэш, спору нет, крайне полезное приобретение при прочих равных.

А теперь давайте попробуем узнать — есть ли какая то текущая статистика по нагрузке, чтобы прогнозировать потребности.
Автор вопроса дал такую статистику: сервер с 2 * Xeon 4210 (10×2.0, 3.2 Turbo) и 768 памяти загружен на 22% и 45% по процессору и памяти соответственно. Или грубо мы получаем 1 GHz / 32 GB.
Имея такую загрузку можно спрогнозировать сбалансированные конфигурации на 5317 / 6330. И это соответственно 2.3 и 3.5 TB RAM.

Т.е. фактически даже при установке 2 TB RAM в сервер 6330 никак не может показать свою потенциальную мощь и превосходство над 5317. А вот 5317 не просто превосходит текущие 1 / 32, но и дает бОльшую производительность тем же машинам в силу большей частоты на ядро.

© Habrahabr.ru