Привет, Хабр!

Мы в ECOMMPAY, помимо прочего, очень любим MySQL и «железные» серверы. MySQL используется как основная СУБД для нашего прода, и, кажется, мы умеем готовить её хорошо для высоких нагрузок. Так же хорошо (а может, и лучше) мы умеем работать с baremetal: они понятно масштабируются, управляются, имеют предсказуемую производительность и стоимость владения. Но кроме эксплуатации, где всё должно быть надёжно и стабильно, есть место и R&D: а как наша нагрузка будет работать в облачной среде, и сколько это будет стоить? А что насчёт альтернативных привычной для многих «Intel x86-64» платформ?

Много копий сломано в борьбе между сторонниками флагманских линеек процессоров компаний Intel и AMD — эта музыка будет вечной, а успехи семейства EPYC только добавляют масла в огонь. Но AMD и Intel выпускают процессоры на давно известной архитектуре x86, от которой больших сюрпризов ждать не приходится. Другое дело ARM — относительно новый игрок на серверном рынке. Тут как раз удачно вышел Graviton2 — второе поколение процессоров от Amazon, которое специально разработали и выпустили для использования в AWS, и мы не удержались.

Когда у AWS появились инстансы на ARM, они наделали много шума. Холодные, быстрые, дешёвые… выберите любые два три. В презентациях AWS и партнёров за последнее время появились результаты тестирования в синтетических бенчмарках и реальных приложениях, которые показывают новую платформу если не превосходной, то, как минимум, перспективной. Но ведь не всегда условия бывают идеальными? В продакшене работает очень разный код, написанный в разное время. И далеко не факт, что именно ваша нагрузка будет работать в новых условиях лучше, чем на привычным x86.

Вот и проверим.

От редактора: этот пост следовало писать astellar, как непосредственному автору текста и тестирования. Но тогда, вероятно, публикация никогда бы не была закончена, как это часто случается с увлекающимися натурами. Поэтому мне пришлось брать дело в свои руки: ставить дедлайны, вычитывать, править и готовить для читателей.

От редактора: astellar начал статью ещё полгода назад, а совсем недавно, на re:invent 2021 анонсировали процессоры Graviton3. Мы их обязательно протестируем и сравним с предшественниками. Следите за анонсами.

Disclaimer 1: Никакие цифры, выводы или идеи в этой статье не могут являться рекомендациями к действию по построению инфраструктуры вашего проекта и приведены как одно из возможных направлений для дальнейших исследований.

Disclaimer 2: Результаты нагрузочных и стресс-тестов приведены как пример и не могут считаться повторяемыми или быть использованными при расчете производительности вашего приложения и/или инфраструктуры.

Другими словами: в расчете производительности и запаса прочности столько переменных, что авторы не имеют никакого желания отвечать за благополучие вашего прода.

О чем это все?


Одной из ключевых задач при работе в облаке является правильный выбор типа инстанса, если мы говорим о EC2. Количество вариантов огромно, так что с непривычки теряешься. Например на страничке описания типов инстансов в облаке AWS перечислено больше 50(!) различных типов, не говоря уже о том, что внутри каждого типа инстанса спрятана целая линейка различных вариантов нод. Почему так много? Дело в том, что спектр задач, которые решаются сегодняшними приложениями настолько широк, а нагрузки на каждый сервис настолько разные, что не получится ограничиться одним-двумя — даже одним-двумя десятками — типов инстансов. Ограничение будет означать либо переизбыток ресурсов — и значит, бесцельный расход бюджета на эксплуатацию — либо их нехватку, что может негативно сказаться на работе приложения. Поэтому для каждого класса задач создается свой тип виртуальных машин.

Опытные пользователи облачных сервисов скажут, что EC2 — прошлый век, и надо пользоваться Managed services вроде RDS или Aurora DB, если мы говорим о базах данных. Однако, наш опыт использования Managed Services разных облачных провайдеров в суровом продакшене показывает, что на больших нагрузках возникает настолько много подводных камней, неочевидных нюансов и “непредвиденного поведения”, что сравнение “в лоб” будет совершенно бесполезно, а попытка собрать сравнимые тестовые окружения потребует кучу времени, сил, и денег. В общем, мы рады, но как-нибудь в следующий раз, и с доброжелательным спонсором.

Типы инстансов


Типы облачных инстансов сильно различаются: тип процессора, количество и скорость памяти, тип, подключение и пропускная способность дисковой подсистемы и сети, наличие GPU и других аппаратных дополнений. Вопрос о тонкостях применения каждого занял бы по объему, как минимум, половину “Войны и Мира”, а поскольку между написанием статей нужно ещё и успевать работать, различия между каждым из пятидесяти типов мы пока отложим в сторону и начнем с базы, на которой строится любой вычислительный комплекс — с процессора.

От редактора: дальше были примерно пять стадий: энтузиазм, разочарование, тушение пожаров на растущем, как не в себя, продакшене, депрессия и, наконец, текст, который вы сейчас читаете

Что и как тестировать?


Это был первый вопрос на который нужно было ответить, но он же оказался самым простым. Интересно было получить и сравнить производительность чего-то понятного и вещественного. Последние много лет я решаю проблемы производительности БД MySQL, поэтому его и будем тестировать. Выбор версии тоже не составил труда. Официальный дистрибутив MySQL Community Version поддерживает ARM только для восьмой версии и для Red Hat Enterprise Linux и MacOS, поэтому выбор очевиден — тесты гоняли на RHEL8.

Какой бенчмарк использовать? Стандартом считаются TPC-C и TPC-H, тем не менее иногда известность этих инструментов не идет им на пользу, и появляются непроверенные слухи, что некоторые производители могут ориентироваться на их результаты при проектировании чипов. Мы таким слухам не верим и вам не советуем, но, на всякий случай, выбрали не очень известную утилиту sysbench, которая помимо SQL-бенчмарков умеет также тестировать процессор — что для для нас было очень кстати — а так же память и дисковую подсистему. 

Какие параметры системы тестировать?


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

Самое простое, в случае баз данных, это график пропускной способности БД. Он очень хорошо отражает предельную нагрузку на систему и четко показывает пик пропускной способности системы и ее деградацию при дальнейшем росте нагрузки.

Для тестов взяли два типа инстансов: один из “средних” в линейке виртуалок “для повседневного использования”, и самые дорогие и мощные baremetal машины — фактически, выделенные серверы — для определения максимально возможной производительности платформы. Вдобавок, выделенный сервер исключает факторы “шумных соседей”, которые могут сильно влиять на результаты тестов.

Все скрипты тестирования находятся в открытом доступе и доступны по ссылке.

Тестирование


Скорость процессора (синтетический тест)




Тесты процессора показывают скорость ARM в два раза выше при меньшем количестве ядер.

Достаточно неожиданно, согласитесь. Что вообще тут происходит? Sysbench в качестве синтетической нагрузки использует алгоритм нахождения простых чисел. В тесте используются циклы, расчет корней, сравнения и деления по модулю. Очевидно здесь мы измеряем чистую производительность процессора без учета обращения к памяти, поскольку все переменные будут локальными.
 
Причиной таких результатов могут быть оптимизированные инструкции в ARM-процессорах — когда вместо “честного” деления используется битовый сдвиг. С одной стороны — «срезание углов» и читерство. С другой — x86 всю свою историю не чурается различных «оптимизаций», и что мешало добавить ещё одну — непонятно.
 
При анализе результатов также стоит учитывать, что не смотря на высокую производительность, которую показала RISC-архитектура, это все же синтетическая нагрузка, поэтому будем считать этот результат комплиментом, но не более.

Global Memory: рандомное чтение




Самое важное, что показывает этот график — это относительная консистентность скорости памяти. Все три платформы (Intel, AMD и ARM) обладают схожими характеристиками по скорости работы памяти на чтение, однако на запись картина совершенно иная.

Global Memory: рандомная запись




Как видим, скорость записи для ARM платформы на порядки выше, с пиковой производительностью в районе 6 одновременных потоков. “Провал” CISC-систем очевиден, но у авторов статьи не хватает технической экспертизы, чтобы найти причину. Оставим пока этот вопрос открытым — обязательно напишите в комментариях, если у вас есть мысли на этот счёт.

Local Memory: рандомное чтение



Local Memory: рандомная запись



Здесь никаких неожиданностей, локальная память консистентна на запись.

Производительность дисковой подсистемы






Как и ожидалось, производительность дисков не зависит от типа процессора, что подтверждается графиками. Девиации при низком количестве потоков связаны с особенностями работы лимитеров EBS. Данные пишутся и читаются блоками по 16k — особенности работы БД MySQL — страница данных InnoDB занимает ровно 16 килобайт и обмен с диском идет блоками кратными 16k.



Единственное существенное отличие мы наблюдаем на записи с форсированием фиксации данных вызовом fsync. ARM платформа начинает деградировать при количестве потоков выше количества ядер (64 для r6g.metal), что в целом ожидаемо — система заходит в красную зону по нагрузке.

Производительность MySQL


Посмотрим, как ведет себя софт, требовательный к производительности системы. Возьмем MySQL 8 (эта версия доступна как для x86, так и для ARM процессоров), и запустим его на инстансах типа 8xlarge (32vCPU, 256Gb RAM). Выполним тестирование на чтение, как наиболее чувствительное к производительности CPU. Данные при этом с запасом помещаются в память, чтобы минимизировать влияние дисковой подсистемы.



Инстансы типа 8xlarge ведут себя вполне адекватно — показывают сходную производительность как на ARM, так и на Intel. При этом стоимость транзакции на ARM-платформе r6g.8xlarge будет ниже — мы об этом ещё поговорим. Отдельно хочется прокомментировать более низкую производительность системы R5a, для которой используются процессоры AMD серии EPYC 7000. У меня нет разумного объяснения такой деградации, поэтому, чтобы сберечь нервы фанатов AMD, дальнейшее тестирование на платформе R5a не проводилось.

Остальные платформы показали больше полумиллиона запросов в секунду. Результат достойный, а можно больше? Как насчет действительно высоких нагрузок?

Производительность Baremetal


Действительно высокие нагрузки подразумевают, что мы не можем позволить себе роскоши “шумных соседей”, поэтому закрываем глаза на ценник и выбираем инстансы с приставкой .metal.

В отличии от обычных виртуалок, baremetal-инстансы дают возможность использовать все ресурсы железа — т.е. фактически это выделенный сервер, управляемый облаком. Запуск такого инстанса требует больше времени, чем обычно, поэтому не волнуйтесь, если придется подождать пару минут.

MySQL Read-Only 100 секунд



MySQL Read-Only 300 секунд



MySQL read/write




На последнем графике видим жесточайшую деградацию производительности MySQL при переходе нагрузки в красную зону — количество одновременно исполняемых запросов больше, чем ядер в системе.

Особенность работы MySQL заключается в том, что каждый запрос обрабатывается одним потоком, и занимает всё ядро, когда не ждет диск или сеть. Поэтому, когда количество активных клиентов превышает количество ядер, на каждое ядро приходится больше одного выполняемого запроса. В этом случае задачи по обслуживанию запросов и блокировок ложатся на ОС. 

Почему так происходит?


Изначально MySQL написан для процессоров x86 и стоковая поставка не учитывает особенности работы ARM-процессоров и другого набора инструкций. Для небольших нагрузок деградация несущественна, но при очень высоких внутренняя система блокировок MySQL, которая успешно работает на x86, доставляет серьезные проблемы на ARM. Хотя патчи для MySQL под ARM процессоры существуют, публично доступны и успешно работают на известных авторам инсталляциях, но много ли найдётся желающих держать в продакшене собранный руками MySQL с кастомными патчами на сверхвысоких нагрузках? А если таковые и найдутся — наверняка, с выделенной под это командой — то зачем им идти в публичные облака?

Более простой вариант избежать деградации без пересборки MySQL — выставить параметр innodb_thread_concurrency равным количеству ядер, но это можно рассматривать только как временный вариант, поскольку он препятствует полноценному использованию ресурсов системы.

Повторим, что данная ситуация актуальна только для больших, и очень больших нагрузок, и бОльшая часть пользователей вряд ли столкнётся с такими особенностями, поэтому определяющим фактором для них будет стоимость владения.

Стоимость владения


В AWS есть несколько вариантов аренды вычислительных ресурсов EC2: самый простой — он же и самый дорогой — “On Demand”, или использование по запросу. Вы нажимаете кнопку, и через пару секунд виртуальная машина доступна для работы. Такой способ идеально подходит для краткосрочных проектов — поднял, запустил, прогнал задачу, выключил и забыл — именно так мы и проводили наше тестирование.



Для сравнения возьмем стоимость ноды типа 8xlarge и выделенных серверов (metal).
При сравнимых параметрах 8xlarge разница все же есть. Заключается она в полосе пропускания EBS: 4,750 Mpbs у R5a с процессором AMD; 6,800Mpbs у R5 на Intel; 9000Mpbs у R6g на ARM, и самая большая у самой дорогой R5b на том же самом Intel: целых 20,000Mbps, что логично.

Reserved instances




Очень часто инфраструктура раскатывается не на пару часов и даже не на день-два. В этом случае хочется сэкономить, и AWS здесь один из самых гибких провайдеров. Если вы определились с типом инстансов (в нашем случае R5 или R6G) вы можете сделать так называемый “резерв”: оплатить нужный инстанс на три года вперед и получить его на 60% дешевле чем On Demand. Можно оплатить не сразу, а частями или не на три года, а на год, но и скидка будет поскромнее. Вообще, AWS предоставляет несколько вполне рабочих вариантов по сокращению расходов, но это тема для отдельной статьи (или для беседы с вашим аккаунт-менеджером в AWS — прим. ред.).

Стоимость транзакции




Поскольку для сравнения мы выбрали разные платформы, то и максимальные инстансы у них тоже разные. В этом случае сравнивать эффективность лучше всего по стоимости условной транзакции. Диски мы выбрали одинаковые, поэтому можем позволить себе это сделать. Начнем с вычисления простых чисел (или других задач типа «числодробилка»).

Здесь ARM будет безусловным лидером, предлагая стоимость в 4 раза ниже, чем у старого доброго x86. Выглядит слишком хорошо, чтобы быть правдой. Возьмем стоимость запроса на чтение из таблицы.



А вот тут картина совсем другая. Не сильно оптимизированный под ARM код MySQL показывает средний результат между выделенным сервером типа R5 на Intel Xeon® Platinum 8000 и более дорогим R5b на Intel Xeon Scalable.

Выводы


Как и ожидалось, на реальной нагрузке результаты не столь радужные, и об однозначном лидерстве ARM-платформы говорить не приходится, как и о том, что новая платформа “не взлетела”.
 
Новый тип инстансов на основе ARM процессора Graviton2 показывает огромный потенциал для CPU-bound нагрузки — бекенды, кроны и любые задачи с математикой, не требующей для расчетов GPU. В этом случае стоимость серверов, обрабатывающих тот же самый объем данных, может быть, как показывают бенчмарки, до четырех раз ниже. Звучит настолько здорово, что хочется задать вопрос: “А где подвох?!”
 
Подвох в том, что чудес не бывает и законы физики не победить, поэтому в реальной жизни добиться такого результата можно, как мы сами убедились, далеко не во всех случаях. Здесь первый и главный вывод такой: тестируйте свое приложение и инфраструктуру перед тем, как принимать решение о переходе на ARM.
 
Просто так пересобрать софт под другую платформу (внезапно!) недостаточно, особенно если этот сервис, как например СУБД, использует множество оптимизаций на низком уровне, которые делают код зависимым от платформы. Поэтому, кроме функциональных тестов ваших сервисов на новой платформе, нужно проверять все его компоненты под нагрузкой. Это касается и баз данных и систем управления очередями — там, где процессы и потоки под высокой нагрузкой обмениваются друг с другом данными, причём тестировать лучше всего систему целиком, а не отдельные компоненты. Ну и разумеется, доверять синтетическим тестам, пусть и от уважаемых источников, стоит лишь с очень большими оговорками.
 
Второй вывод касается дистрибуции MySQL для ARM. Да, платформа относительно новая, тем не менее очень странно видеть, что пакеты MySQL 8й версии (5.7 для ARM отсутствует) не в полной мере реализуют возможности платформы, особенно с учетом наличия необходимых патчей. С чем это связано, авторы гадать не возьмутся, но то, что Oracle активно развивает собственное облако, как бы намекает, что упрощать жизнь конкурентам они явно не собираются.
 
Вывод третий, обобщающий. Безусловно, не смотря на большое количество оптимизаций в архитектуре x86 и огромное количество разработанного под платформу кода, легаси в несколько десятков лет дает о себе знать, и появление новых процессоров на ARM архитектуре в серверном и десктопном сегменте обозначает границы нового периода в развитии IT-инфраструктуры в целом.
 
Есть ощущение, что в течение следующих нескольких лет количественное перейдет в качественное, и мы увидим повальную миграцию серверных систем в сторону более дешевых, и при этом более производительных ARM-процессоров, и у разработчиков популярного opensource-софта просто не останется опции не оптимизировать их продукты под “новую” архитектуру. А следом подтянутся и inhouse-разрабы, ну а на долю DBA и системных администраторов останется только поддержка всего этого зоопарка в стабильном состоянии.

Appendix



Код синтетического теста CPU

Комментарии (17)


  1. Shaz
    19.12.2021 14:15
    +2

    С чем это связано, авторы гадать не возьмутся, но то, что Oracle активно развивает собственное облако, как бы намекает, что упрощать жизнь конкурентам они явно не собираются.

    При этом у оракла в облаке тоже есть серверы на ARM.


    1. vgogolin
      19.12.2021 21:24

      Да и их сервервная версия 8.0.23 самый простой способ завести неработающий mysql-контейнер на m1 для локальной разработки (сменить на неё часто встречаемый в темплейтах 8.0.24 - и m1 оживает).


  1. Grikdotnet
    19.12.2021 17:14
    +4

    Cкорость деления - чисто синтетический тест, в жизни и в СУБД это не нужно. В реальной вычислительной нагрузке - например, майнинг monero, ARM в разы медленнее x86. Вспомним, что >90% web middleware в мире написано на скриптовых языках, которые на уровне железа оптимизировать невозможно.

    В другом тесте пишут, что PHP на AWS ARM бегает на 50% медленнее при сравнении ядро к ядру, потому что для x86 ядро с hyperthreading в AWS идет за два vCPU, а для ARM дают два полноценных. Причем, два реальных ядра ARM в AWS стоят дешевле одного реального x86. Таким нехитрым демпингом маркетологи AWS привязывают клиентов к собственным процам. Специфика AWS очень сильно влияет на результат тестирования. Получается, сравнили хрен с пальцем.

    Думаю, сравнивать ARM стоит уже с Intel 12 поколения. Пишут, что оно на 20% быстрее, чем 11е. Может быть тот самый "большой сюрприз".


    1. astellar
      19.12.2021 18:37
      +1

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

      Смысл появляется, когда один процент выигрыша производительности экономит сотни тысяч долларов в годовом бюджете. В этот момент начинается гораздо более внимательный выбор платформы и технологий. Код тут же становится компилируемым, а для майнинга из Китая заказывается спец. железки.


      1. Grikdotnet
        19.12.2021 21:44

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


        1. astellar
          19.12.2021 22:57

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


          1. vebeer
            20.12.2021 10:55
            +4

            А я бы с удовольствием почитал вашу дискуссию:)


            1. astellar
              20.12.2021 12:32
              +1

              Выглядит как идея онлайн митапа :) Обдумаем :)


    1. vlanko
      20.12.2021 21:20

      12му поколению пока очень далеко до серверов. AWS только недавно представила инстансы m6i IceLake — соoтветствует 10 поколению (i7 10xxG7).
      Хотя в следующем году должны выйти.


      1. Grikdotnet
        20.12.2021 22:36

        Да, Xeon на 12м ядре еще нет, а на 11-м rocket lake в магазинах в продаже. Я не знаю что в EC2, просто подумал, а не сравниваем ли мы новенький ARM с 5-летним xeon?


  1. Jack_Rabbit
    19.12.2021 18:19
    +1

    В реальных задачах AMD Epyc 7742 (64 ядра Zen2) в среднем на 50% быстрее чем Amazon Graviton2 (64 ядра). Вот ссылка на подробное тестирование: https://www.phoronix.com/scan.php?page=article&item=epyc-vs-graviton2&num=1

    В теории Graviton3 мог бы сократить этот разрыв, но у AMD уже есть решения на Zen3 и в следующем году будут на Zen4.


    1. astellar
      19.12.2021 18:45

      Понятно, что новая технология какое-то время будет работать хуже, чем десятилетиями обкатанная архитектура x86, особенно на коде написанном для x86, что мы и видим в том числе на графиках выше.

      Но есть один момент. ARM сейчас появляется везде , просто потому, что сделать и выпустить свой ARM процессор становится гораздо дешевле, чем закупать их у Intel или AMD. Apple со своим M1 - яркий пример.

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


      1. Jack_Rabbit
        19.12.2021 20:50
        +3

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

        Да, есть исключения в виде Apple, которой удалось создать ядро, которое по производительности сопоставимо с предыдущим поколением Intel Willow Cove и Zen3, но нужно понимать, что компания разработывала и обкатывала его уже десятилетие на iPhone.

        Что касается остальных производителей, которые лицензируют ядра у ARM, то тут все как-то грустно. По предварительным тестам Snapdragon 8 Gen 1 примерно на 20-25% быстрее старичка Snapdragon 865 вышедшего два года назад. Да, по меркам Intel 2016 года это отличный прирост, но сейчас и AMD, и Intel показывают рост производительности в среднем на 20% в год (Zen1 -> Zen2 -> Zen3, Sunny Cove -> Willow Cove -> Golden Cove)

        Собственно, по причине низкой производительности мобильные платформы Qualcomm для ноутбуков особой популярностью не пользуются. Нюансы с совместимостью софта здесь тоже играют свою роль.

        На серверном рынке все тоже печальненько. Есть Amazon с процессорами Graviton, но они используются для собственных сервисов. Есть Ampere с Altra, решения на которых хоть и можно приобрести отдельно, но их очень мало (Gigabyte и ещё полтора вендора поменьше).

        Естественно, что ARM не может позволить себе вкладывать столько же ресурсов как Intel и AMD в оптимизацию компиляторов под всякие прикладные приложения вроде баз данных и прочие PHP с Python.

        Apple, к слову, это тоже не особо надо. Она сфокусирована в первую очередь на задачах обработки фото и видео. По этой причине нативный интерпретатор PHP на M1 работает в два раза медленнее чем на Tiger Lake по данным теста PHPBench. С Python, к слову, та же ситуация. Ну хоть Node.js работает примерно с такой же скоростью и на том спасибо.

        В общем, как-то так.


        1. astellar
          19.12.2021 23:03

          Абсолютно согласен. Примерно такие же мысли мы и пытались донести статьей: платформа ARM "выстрелит", когда под нее будет соптимизировано достаточное количество приложений, а это ресурсы и время.


  1. anonymous
    00.00.0000 00:00


  1. kovserg
    20.12.2021 04:07
    +1

    Global Memory: рандомное чтение
    Самое важное, что показывает этот график — это относительная консистентность скорости памяти.

    Самое главное что не показывает на каком объёме памяти эти результаты.
    Не могли бы вы запустить этот тест для рандомного чтения (на 1Гб или хотя бы на cache_size*8)
    Интересно как далеко от 100Mb/s будут результаты?


  1. emashev
    20.12.2021 16:35
    +1

    Просто так пересобрать софт под другую платформу (внезапно!) недостаточно, особенно если этот сервис, как например СУБД, использует множество оптимизаций на низком уровне, которые делают код зависимым от платформы.

    Осталось объяснить это ребятам из PRO Hi-Tech, которые думают, что Сбер просто не захотел оптимизировать ПО под VLIW, отказываясь от серверов на Эльбрусах.