Переосмысление использования многопроцессорных систем
Уже стал почти общепринятым тот факт, что сервер является многопроцессорной системой. Для этого еще давно были достаточно веские причины. Со временем они изменились, но продолжали быть вескими. Когда контроллер памяти стал интегрироваться в процессор, очень низкая латентность памяти в одной процессорной системе была занятной штукой, но не поддающейся обработке. Тогда на первый план выходило вычисление и память мультипроцессора. В последние годы высокая емкость ядра и объем памяти одного современного процессора стали весьма способными в отношении обслуживания большинства рабочих нагрузок обработки транзакций. Более низкая латентность памяти системы с одним сокетом имеет производительность на одно ядро или поток на 40-50% выше, чем многопроцессорная система. Настало время переосмыслить наше представление о том, что такое серверная система. Несмотря на то, что это также привлекательно, как облачные вычисления по ряду причин, ни один из основных поставщиков облачных вычислений не предлагает однопроцессорные системы, отказываясь от преимуществ системы 1S в отношении цены и производительности.
Вступление
Огромное несоответствие между двусторонним доступом к памяти DRAM и часовым циклом процессора оставалось серьезной проблемой уже более десяти лет. Несложно продемонстрировать, что даже небольшое количество кода считывания значений указателя, в котором доступное значение памяти определяет следующую память для доступа, приводит к тому, что производительность почти полностью закрывается латентностью памяти. Наиболее важным приложением с этим признаком является обработка транзакций базы данных. Характер навигации по индексу B-tree в основном представляет собой упражнение в считывании значений указателя.
Большая часть латентности памяти приходится на чип DRAM, но кэш L3, контроллер памяти и время передачи сигнала также содержат значимые элементы. Любопытно, что есть специальные продукты памяти для настольных систем без ECC с «экранированными вручную» микросхемами и сложным механизмом охлаждения, который имеет тайм-аут задержки около 10 нс в каждом из RCD, CL и RP. Для серверных систем зарегистрированные модули ECC DIMM доступны только со стандартными таймингами около 14 нс для каждого из трех.
Одиночные и многопроцессорные системы
Существует механизм, с помощью которого мы можем существенно влиять на латентность памяти в многопроцессорной (сокетной) серверной системе, являющейся областью памяти. Но в этом отношении несколько приложений фактически используют API NUMA. Некоторые гипервизоры, такие как VMware, позволяют создавать виртуальные машины с ядрами и памятью с одного и того же узла. Что, однако, может быть не принято во внимание, это что даже локальная память узла в многопроцессорной системе имеет значительно более высокую задержку, чем доступ к памяти в однопроцессорной (физической) системе.
То, что однопроцессорная система имеет низкую задержку памяти, было привлекательным, но не получившим распространение фактом. Широко распространенная в ИТ-мире практика заключалась в том, чтобы иметь двухполосную систему в качестве базового стандарта. Односокетные системы (1S) использовались малыми предприятиями и решениями «под ключ». Издавна, до недавних пор, это было обоснованно, хоть причины и менялись с годами. Когда начали появляться многоядерные процессоры, двухсокетные (2S) системы стали намного мощнее, чем требуется большинству вторичных приложений. Но в это же время стала популярна виртуализация что дало новые основания для продолжения этой использования этой практики в качестве базовой.
Intel Xeon E5 v2, Ivy Bridge для Xeon SP, Skylake
До 2012 года стратегия продукта Intel была направлена на выпуск процессоров для для двухсокетных систем и больших процессоров для многополосных систем. Они варьировались по разным причинам в зависимости от поколения процессора
В 2012 году большой процессор был приведен к двух-и четырехсокетным системам в линейке Xeon E5. В следующем году Intel использовала 3 кристалла для заполнения своей линейки Xeon E5 v2, с 6-ядерным LCC, 10-ядерным MCC и 15-ядерным HCC.
Для Intel было возможно и практично производить до 15-ядерных систем на одном 22-нанометровом кристалле в топовой линейке. Но существовал также значительный спрос на продукцию с низкой и средней ценой. Они лучше соответствовали структуре затрат 6-ядерного и 10-ядерного кристалла соответственно. E5 v2 был общедоступен только с 12 ядрами. Полностью 15 ядер были общедоступными в E7 v2 (и в E5 для особых клиентов).
В современных процессорах Xeon SP трехкристаллическая архитектура реализована в 10-ядерных процессорах LCC,18-ядерных HCC и 28-ядерных XCC.
Врожденная природа структуры затрат на полупроводники заключается в том, что крупная матрица непропорционально дороже, чем маленькая. Часть площади такой матрицы является непригодной из-за размера кристалла, расположенного на пластине. В очень крупной матрице в стоимости преобладает снижение выработки при заданной плотности дефектов. Структура затрат процессоров Intel Xeon E5 и Xeon SP в значительной степени соответствует этой схеме с некоторым рыночным регулированием.
В приведенной ниже таблице показаны затраты на ядро против ядер для диапазона моделей Xeon SP (за исключением некоторых специализированных SKU).
Основная тенденция такова, что стоимость на ядро увеличивается по мере увеличения количества ядер. Как и ожидалось, два небольших процессора для матриц стоят меньше одного крупного процессора с одинаковым общим количеством ядер, чем два небольших. Примером может служить 14-ядерный Xeon 6132 на уровне $ 2,111 против 28-ядерного Xeon 8180 на уровне $ 10,009.
На системном уровне нет большой разницы между стоимостью материнских плат, которые могут вместить один или два процессора. Казалось бы, существует логика продолжения двухсокетной системы в качестве стандартной практики, теперь имеющей 2 или 3-ядерные вычислительные устройства и частотные параметры для соответствия широкому спектру требований к центрам обработки данных. Эта концепция имеет силу, предполагая, что ядра равны между одиночными и многопроцессорными системами.
Задержка памяти, 1S против 2S
Кроме того, что ядра не равны между однопроцессорными и многопроцессорными системами, есть и важные различия в задержке памяти. И латентность памяти является ключевым фактором производительности для наиболее важного класса приложений.
На следующем рисунке показана схема системы Xeon E5 v4 с одним разъемом.
На односокетном 10-ядерном процессоре Xeon E5-2630 v4 латентность L3 составляла 17 нс, а латентность памяти была L3 + 58ns = 75 нс, измеренная с помощью теста 7z. Intel определяет латентность L3 для 22-ядерного процессора E5-2699 v4 как 18 нс. Следовательно, предполагается, что латентность памяти с одним гнездом составляет 76 нс для матрицы HCC.
В матрице LCC имеется одно кольцо, соединяющее ядра и другие подкомпоненты. Матрица HCC имеет два соединительных кольца, которые, в свою очередь, соединены с двумя переключателями. Можно подумать, что разница между 10-ядерным LCC и 22/24-ядерным HCC будет более 1 нс, и было бы неплохо, если бы Intel предоставила объяснение.
На следующем рисунке показана схема двухсокетной системы с процессорами Xeon E5 v4.
На веб-сайте 7-cpu показано L3 на 18 нс для E5-2699 v4, совместимого с Intel. Локальная задержка памяти узла - L3 + 75ns = 93ns.
7z-Benchmark не тестирует задержку памяти удаленного узла. Intel редко упоминает латентность памяти в поколениях Xeon E5 / 7 v1-4. Один источник ссылается на память удаленного узла на локальном узле 1.7X. Другой ссылается на удаленный узел на 50-60 нс выше локального узла. Значение 148 нс является заполнителем, используемым в последующих вычислениях.
Разница между задержкой памяти с одним гнездом и задержкой памяти в двухсокетном локальном узле связана с проверкой удаленного узла L3 для обеспечения согласованности кеша. Разница между 76 и 93 нс составляет 22%. Поскольку латентность памяти является основным детерминантом производительности обработки транзакций базы данных, 22% - это очень много.
Задержка локального узла применяется для приложений, которые могут достичь локальности в памяти в системе NUMA. Механизм базы данных имеет возможности NUMA. Но если полная среда приложений и баз данных не была создана для работы с функциями NUMA, локальность памяти не будет достигнута.
Xeon SP
В 2017 году Intel сочла важным сравнить латентность памяти Xeon SP и AMD EPYC, разместив все результаты в своих презентациях. На приведенном ниже рисунке показано, что задержка для локального узла составила 89 нс, а для удаленного узла - 139 нс на 28-ядерном процессоре Xeon SP 8180.
В Xeon SP латентность кэша L2 увеличилась с 12 до 14 циклов из-за увеличения размера от 256 КБ до 1 МБ. Латентность L3 увеличилась с 18 до 19,5 нс в моделях больших матриц, как измерено в Intel Memory Latency Checker. Похоже, что Skylake Xeon SP имеет меньшую задержку памяти, чем Broadwell Xeon E5 v4. Может так оно и есть, а может использовались разные методы измерения.
На рисунке ниже приведена таблица computerbase.de. Имейте в виду, что различные значения продиктованы разными источниками.
Важным моментом этого раздела является то, что латентность памяти в системе с одним сокетом значительно меньше, чем память локального узла в многопроцессорной системе. Это связано с когерентностью кэша удаленных узлов. Разница между 76 нс для одного сокета и 93 нс для двухсокетной памяти локального узла составляет 22 процента. Такое расхождение значительно. Для виртуальной машины, созданной с ядрами и памятью из одного и того же узла в системе с 2 сокетами, потребуется 24 ядра для соответствия 20 ядрам в системе с одним сокетом.
Эквивалентная производительность протоколов 1S и 2S
Ожидается, что в полной двухсокетной системе база данных, не созданная для NUMA, будет иметь доступ к локальным удаленным узлам 50/50. Тогда средняя латентность памяти составляет 114 нс (среднее между 89 и 139) для Xeon SP и 120,5 нс (среднее между 93 и 148) для Xeon E5 v4.
Средняя латентность памяти 2-сокетной системы на 50-59% выше, чем у односокетной системы. Ожидается, что производительность на ядро на 2S на 0,63-0,67 раза выше, чем у 1S. Пропускная способность 2S, с вдвое большим количеством ядер, выше в 1,26 - 1,34 раза.
Основываясь на масштабировании 1,35X от 1S до 2S, двухсокетная система с 14-ядерными процессорами приблизительно равна производительности пропускной способности для односокетной системы с 19 ядрами (фактические параметры продукта - 18 или 20 ядер).
Система с одним сокетом также имеет лучшую производительность на уровне потока пропорционально разнице в задержке памяти, 50-59%. Это имеет значительную ценность. В системе с одним сокетом не должно быть аномалий NUMA, которые могут возникать в многопроцессорных системах. Одним из примеров является конкуренция между потоками, выполняемыми на ядрах в разных сокетах.
Разница в стоимости процессоров может быть большой или не очень. Однако программное обеспечение обычно лицензируется на основе ядра. Плата за лицензирование может составлять порядка тысячи долларов на ядро в сравнении с стоимостью процессора порядка сотен долларов на ядро. Эффективность производительности на ядро теперь становится более важной.
Резюме
Аргумент для единственного сокета в качестве базовой стандартной системы является убедительным. В прошлом были веские причины как для большей вычислительной способности, так и для памяти многопроцессорных систем. В последние годы с хранением на SSD массивный избыток памяти больше не нужен, хотя это может быть непроизвольное мышечно-рефлекторное действие для администраторов баз данных.
Реальность такова, что при правильном дизайне большинство транзакционных нагрузок могут обрабатываться 16-28 ядрами, доступными в одном процессоре с Hyper-Threading, удваивая логические процессоры (потоки). Масштабирование до многопроцессорной системы обеспечивает лишь умеренное увеличение производительности пропускной способности и может создать новые проблемы, некоторые с серьезными негативными последствиями. VM, поддерживающая NUMA, восстанавливает примерно половину разницы в эффективности между многосокетной и односокетной системой. Это полезно, но составляет дополнительно 22% собственных накладных расходов на весь потенциал.
Приложение
Для тех, кто помнит, что масштабирование от одного до нескольких процессоров было лучше в старые времена, так оно и было.В период XION от Pentium II до III это было чем-то вроде следующего.
Масштабирование с 4S до 8S, возможно, составляло 1,5X. Причина, по которой масштабирование от 1 до 2 процессоров была лучше тогда, заключалась в том, что при переходе от 1S к 2S было мало изменений в латентности памяти и аналогично от 2S до 4S. Однако это сравнение должно производиться на основе того же процессора и контроллера памяти. У обычных Pentium II и III был более медленный кэш L2, но более простой контроллер памяти. У версий Xeon был более быстрый и больший кэш L2, но более сложный контроллер памяти для большей емкости, что также влечет за собой более высокую задержку.