Топология памяти
Очень часто вижу подход к серверам и вычислительной инфраструктуре на кухонном уровне даже от вроде бы профессиональных людей с высочайшими ЗП в полмиллиона и выше.
Сервер - это просто большой макбук, а СХД просто большой диск.
Итак, давайте разбираться. И начнем со страшной темы - топология памяти.
Объяснять буду реально на желудях и шишках, поэтому сразу просьба к крутым суперпрофи - не надо пытаться меня уличить, это не для вас написано.
Есть процессор, который исполняет команды, и канал доступа к памяти, которая требуется для этих команд. Канал характеризуется двумя показателями: задержка доступа (через сколько наносекунд придет ответ), ширина канала (сколько гигабайт в секунду).
Задержка. 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 каналов памяти. (У Intel существовала серия Core X с 4 каналами).
Да, вы совершенно правы. Только посмотрите на его стоимость, он подороже иных 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, но и дает бОльшую производительность тем же машинам в силу большей частоты на ядро.
Автор: Anton Zhbankov