Русский
Русский
English
Статистика
Реклама

X86_64

Перевод arm64 vs x86_64 для php

14.04.2021 20:10:55 | Автор: admin

В связи со скорым стартом курса PHP-разработчик делимся с вами традиционным переводом материала. Приглашаем также посмотреть запись демо-урока Экосистема PHP.


Сегодня мы поговорим не про обычную аутентификацию электронной почты, дамы и господа. Мечта (веб-хостинга) 90-х все еще жива в Fraudmarc. Насладитесь скетчем Portlandia (с помощью VPN), а затем мы окунемся в истоки нашей серверной компании.

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

Этот сайт сделан на WordPress, и до недавнего времени мы с удовольствием полагались на самую лучшую и самую дорогую компанию провайдера WP. Но наш интерфейс wp-admin уже несколько месяцев страдает низкой производительностью, несмотря на все усилия их дружной команды технической поддержки. Если бы вы спросили меня, то я бы предположил, что они попали в классическую ловушку избыточной инфраструктуры, чтобы добиться более высокой прибыли во все более конкурентном пространстве хостинга WordPress. Я это понимаю, но, спасибо, не надо.

Не можем замедляться, не можем отвлекаться

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

Точно так же Fraudmarc отлично справляется с аутентификацией электронной почты (SPF, DKIM и DMARC), поэтому мы максимально сосредоточены на предоставлении этого сервиса нашим клиентам. Мы не можем отвлекаться на управление собственными серверами веб-хостинга. Мы используем множество других веб-инфраструктур, поэтому такой соблазн всегда присутствует, особенно когда наш старый провайдер WP хостинга начал сдавать позиции. И тут на сцену выходит SpinupWP, новая компания провайдер WP, которая позволяет нам предоставлять базовые сервера, пока они выполняют всю грязную работу с WP. Я с радостью продвигаю другие стартапы, которые делают сеть лучше, поэтому внизу этой статьи есть промо в размере 50 долларов для того, чтобы мотивировать вас попробовать их услуги.

В настоящее время нам полюбились ARM процессоры и мы используем их для многих инфраструктур API, БД и DNS в Fraudmarc, но вы должны быть осторожны, потому что они иногда намного медленнее, чем проверенные старые добрые x86 процессоры.

WordPress - единственное место, где Fraudmarc использует php, поэтому я решил поискать уже существующие бенчмарки php на arm64. PHP на Arm64 от Amazon AWS был хорошим началом, но упущен ряд важных моментов. Их пост был написан до релиза php 8 и ненарочно (?) пропустил однопоточные тесты, которые показывают, что arm64 на 50% медленнее, чем x86. В итоге вы читаете эту статью благодаря php на ARM, и я объясню вам почему.

Тестовая среда

Мы проведем бенчмарки с двумя официальными скриптами php: bench и micro bench. Наше тестирование будет проводиться на Ubuntu 20.04 на инстансах x86_64 c5.large и arm64 c6g.large. Каждый инстанс имеет два виртуальных ядра (vCPU) и 4 ГБ памяти. Php 7 устанавливается из репозитория Ubuntu по умолчанию, а php 8 из ondrej/php PPA. Вот конкретные версии, которые мы использовали:

PHP 7.4.3 (cli) (built: Oct 6 2020 15:47:56) ( NTS )

Copyright (c) The PHP Group

Zend Engine v3.4.0, Copyright (c) Zend Technologies

with Zend OPcache v7.4.3, Copyright (c), by Zend Technologies

PHP 8.0.3 (cli) (built: Mar 5 2021 07:54:13) ( NTS )

Copyright (c) The PHP Group

Zend Engine v4.0.3, Copyright (c) Zend Technologies

with Zend OPcache v8.0.3, Copyright (c), by Zend Technologies

Подобно сжатию SPF, этот WP-сайт интенсивно использует кэширование в сотнях периферийных точек сети. Это означает, что запросы обслуживаются очень быстро из мест, близких к посетителям (или серверов приема почты в случае сжатия SPF), и продолжают работать, даже если исходный сервер выходит из строя. Серверы, которые мы тестируем, имеют два виртуальных ядра, которых достаточно для наших нужд, поскольку подавляющее большинство запросов обрабатываются периферийными узлами без необходимости выполнения какого-либо php на исходном сервере.

Мы протестируем серверы с помощью 14 параллельных бенчмарков, так как это должно соответствовать нагрузкам запрашиваемого оборудования на уровне 50%200%. Очевидно, что мы не можем использовать более 100% оборудования (два виртуальных ядра), но из-за природы интернет-трафика, склонной к пиковой нагрузке, в очереди постоянно возникает больше работы, чем может обработать сервер. В приведенной выше публикации о AWS бенчмарки производились только при 100% нагрузки запрашиваемого оборудования, что вряд ли когда-либо произойдет в реальной жизни. Мне интереснее понаблюдать за недонагруженными и перегруженными случаями, когда количество задач не совпадает идеально с количеством виртуальных ядер. В частности, я хочу увидеть штраф за многозадачность, когда ОС выполняет больше задач, чем у нее есть виртуальных ядер.

Первоначальные результаты

Среднее время выполнения (в секундах) за несколько запусков. 2x, 3x и 4x представляют количество одновременно запущенных бенчмарков.

Зеленый столбец показывает, что AWS не показывал: однопоточный php на 50% медленнее на инстансах с arm64 Graviton2. Ну дела. Но это еще не все.

Белый столбец показывает, что произошло, когда мы выполнили два бенчмарка одновременно. При полной нагрузке на оба виртуальных ядра инстанса arm был на 20% быстрее. Arm продолжал лидировать по мере увеличения количества параллельных бенчмарков.

Micro_bench.php показал похожую историю:

Давайте визуализируем эти результаты с теми же цветами столбцов.

Анализ

Я полагаю, что то, что мы наблюдаем здесь, это разница при одновременной многопоточности и полной нагрузке на ядра процессора. Поставщики десктопных ПК и серверные компании склонны отождествлять потоки и ядра. Типичное облачное виртуальное ядро (vCPU) это только поток, а не целое физическое ядро. Для сравнения представьте, что два потока используют одно ядро процессора. Примерно так это работает в средах x86. Сервера arm в этом отличаются. C6g работает на процессоре AWS Graviton2 arm64 без SMT, поэтому виртуальное ядро представляет собой реальное ядро ЦП.

Php на arm64 был на 50% медленнее, чем php на x86, если сравнивать физические ядра. Я ожидаю, что со временем это улучшится, поскольку AWS и другие разработчики продолжают выпускать для php патчи, связанные с arm. Php на arm оказался уже достаточно быстрым, чтобы это имело значение. Если сравнивать виртуальные ядра, то arm64 был быстрее и значительно дешевле, чем x86. По сравнению с x86 AWS взимает примерно на 20% меньше за виртуальное ядро на arm64. Их виртуальное ядро arm64 представляет собой полноценное физическое ядро, тогда как виртуальные ядра x86 представляют собой только потоки, совместно использующие одно физическое ядро процессора. Позвольте мне представить это вам визуально:

x86 (зеленая стрелка) был быстрее, чем arm (красная стрелка) с точки зрения физических ядер. В каждом из наших тестовых инстансов было по два виртуальных ядра, что подразумевает только одно физическое ядро на x86 и два ядра на arm. На минимальном уровне параллелизма одно ядро x86 запускает php быстрее всех.

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

arm64 быстрее при сравнении виртуальных ядер

Помните, что произошло, когда мы запустили две и более задач на эти два vCPU инстанса?

Зеленые стрелки показывают, насколько фактические ядра процессора на arm превосходят совместно используемые (многопоточные) ядра на x86.

Заключение

В одно предложение: этот сайт теперь работает на arm

На заведомо дорогой AWS виртуальные ядра ARM оказались на 20% дешевле, чем виртуальные ядра x86, не говоря о том, что требуется избыточное двукратное выделение виртуальных ядер, чтобы соответствовать количеству физических ядер эквивалентного инстанса на базе ARM. Есть что-то очень естественное в том, чтобы отделить выбор сервера от управления WP, особенно после нескольких месяцев низкой производительности от дорогостоящей WP-платформы. Замечательный плагин Query Monitor показывает, насколько быстро загружаются наши админские страницы.

Наш исходный сервер теперь выполняет WordPress (php) на выбранном НАМИ arm процессоре, но управляется настоящими экспертами по WP, поэтому мы по-прежнему сосредоточены на инновациях в электронной почте, таких как универсальный SPF решении нового поколения, которое преодолевает ограничения поиска DNS и другие нюансы записей SPF. Добавляя универсальную строку SPF в начало любой записи SPF, вы можете легко и практически мгновенно увеличить скорость доставки электронной почты.

Если вы находитесь в ~40% сети, которая работает на WordPress, вам следует обдумать переход на arm, потому что не так часто можно улучшить производительность при одновременном снижении затрат. Мы не нашли провайдеров WP хостинга, предоставляющих такие решения, но это только вопрос времени. Будут ли они экономить на наших конечных пользователях - остается только догадываться. Похоже, мы были первым клиентом SpinupWP, который использовал arm86 вместо x86_64, но Ubuntu имеет отличную поддержку arm, поэтому наша единственная проблема заключалась только в том, что изначально не работали бэкапы. Надеюсь, кто-то из SpinupWP увидит это и обновит свой сценарий установки, чтобы установить подходящую для архитектуры версию rclone.

А вот и реферальная ссылка на 50 долларов на счет SpinupWP на случай, если вы захотите поддержать другой небольшой стартап, который занимается важными делами.


Узнать подробнее о курсе PHP-разработчик.

Смотреть вебинар Экосистема PHP.

Подробнее..

Сколько инструкций процессора использует компилятор?

16.06.2020 20:21:53 | Автор: admin
Месяц назад я попытался сосчитать, сколько разных инструкций поддерживается современными процессорами, и насчитал 945 в Ice Lake. Комментаторы затронули интересный вопрос: какая часть всего этого разнообразия реально используется компиляторами? Например, некто Pepijn de Vos в 2016 подсчитал, сколько разных инструкций задействовано в бинарниках у него в /usr/bin, и насчитал 411 т.е. примерно треть всех инструкций x86_64, существовавших на тот момент, не использовались ни в одной из стандартных программ в его ОС. Другая любопытная его находка что код для x86_64 на треть состоит из инструкций mov. (В общем-то известно, что одних инструкций mov достаточно, чтобы написать любую программу.)

Я решил развить исследование de Vos, взяв в качестве эталонного кода компилятор LLVM/Clang. У него сразу несколько преимуществ перед содержимым /usr/bin неназванной версии неназванной ОС:

  1. С ним удобно работать: это один огромный бинарник, по размеру сопоставимый со всем содержимым /usr/bin среднестатистического линукса;
  2. Он позволяет сравнить разные ISA: на releases.llvm.org/download.html доступны официальные бинарники для x86, ARM, SPARC, MIPS и PowerPC;
  3. Он позволяет отследить исторические тренды: официальные бинарники доступны для всех релизов начиная с 2003;
  4. Наконец, в исследовании компиляторов логично использовать компилятор и в качестве подопытного объекта :-)

Начну со статистики по мартовскому релизу LLVM 10.0:
ISA Размер бинарника Общее число инструкций Число разных инструкций
AArch64 97 МБ 13,814,975 195
ARMv7A 101 МБ 15,621,010 308
i386 106 МБ 20,138,657 122
PowerPC64LE 108 МБ 17,208,502 288
SPARCv9 129 МБ 19,993,362 122
x86_64 107 МБ 15,281,299 203
В прошлом топике комментаторы упомянули, что самый компактный код у них получается для SPARC. Здесь же видим, что бинарник для AArch64 оказывается на треть меньше что по размеру, что по общему числу инструкций.

А вот распределение по числу инструкций:


Неожиданно, что код для SPARC на 11% состоит из nop-ов, заполняющих branch delay slots. Для i386 среди самых частых инструкций видим и int3, заполняющую промежутки между функциями, и nop, используемую для выравнивания циклов на строки кэша. Наблюдение de Vos о том, что код на треть состоит из mov, подтверждается на обоих вариантах x86; но даже и на load-store-архитектурах mov оказывается если не самой частой инструкцией, то второй после load.

А как набор используемых инструкций менялся со временем?

Единственная ISA, для которой в каждом релизе есть официальный бинарник это i386:


Серая линия, отложенная на правой оси это число разных инструкций, использованных в компиляторе. Как мы видим, некоторое время назад компилятор компилировался гораздо разнообразнее. int3 стала использоваться для заполнения промежутков только с 2018; до этого использовались такие же nop, как и для выравнивания внутри функций. Здесь же видно, что выравнивание внутри функций стало использоваться с 2013; до этого nop-ов было гораздо меньше. Ещё интересно, что до 2016 mov-ы составляли почти половину компилятора.

Самые первые версии LLVM, до появления clang, выпускались ещё и с бинарниками для SPARC. Потом поддержка SPARC утратила актуальность, и вновь она появилась лишь через 14 лет с на порядок увеличившимся числом nop-ов:


Исторически следующая ISA, для которой выпускались бинарники LLVM это PowerPC: сначала для Mac OS X и затем, после десятилетнего перерыва, для RHEL. Как видно из графика, переход после этого перерыва к 64-битному варианту ISA сопровождался заменой большинства lwz на ld, и вдобавок удвоением разнообразия инструкций:


В бинарниках для x86_64 и ARM частота использования разных инструкций почти не изменялась:




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

Наконец, самая недавняя ISA, для которой публикуются официальные бинарники это AArch64. Здесь интересно то, что orr с прошлого года почти перестала использоваться:


PowerPC и AArch64 оказались единственными ISA, для которых число разных используемых инструкций всё растёт и растёт.
Подробнее..

ARM сервера более производительные и более дешёвые

31.12.2020 14:09:18 | Автор: admin

В этом году Apple потрясла рынок десктопных процессоров чипом Apple M1 и устройствами на нём. Похожее событие произошло в мире облачных вычислений в прошлом году. AWS выпустили новый тип сервера на собственных ARM процессорах Graviton2. По заявлениям Amazon, соотношение производительности к цене у новых процессоров на 40% выше, чем у аналогов на x86. Ещё одно недавнее обновление - сервера Amazon RDS (облачный сервис, предоставляющий сервера баз данных) на Graviton2. Я запустил несколько бенчмарков и нагрузочный тест реального бэкенд приложения, чтобы проверить настолько ли хороши сервера на ARM процессорах и узнать какие проблемы совместимости могут возникнуть.

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

Я сравнивал сервера типов t4g.small (ARM) и t3.small (x86) на AWS. На момент написания статьи цена за 1 час на ARM сервер составляет $0.0208, а на x86 сервер - $0.0168. Сервер на ARM на 20% дешевле.

Сперва я провёл нагрузочный тест при помощи wrk, запустив на серверах свежую установку recap.dev

Это шаблон docker-compose с 4 процессами. Веб-сервер, принимающий запросы и сохраняющий их в RabbitMQ и отдельный фоновый процесс, сохраняющий запросы группами по 1000 в PostgreSQL.

Я запускал wrk на сервере t3.2xlarge, находящемся в том же регионе, используя следующую команду:

wrk -t24 -c1000 -d300s -s ./post.lua <hostname>

Она непрерывно посылает запросы в течение 5 минут, используя 24 потока и 1000 HTTP соединений.

Результат для сервера t4g.small (ARM):

  24 threads and 1000 connections  Thread Stats   Avg      Stdev     Max   +/- Stdev    Latency   473.53ms   53.06ms   1.96s    81.33%    Req/Sec   115.83     96.65   494.00     71.32%  620751 requests in 5.00m, 85.84MB read  Socket errors: connect 0, read 0, write 0, timeout 225Requests/sec:   2068.48Transfer/sec:    292.90KB

Для сервера t3.small (x86):

 24 threads and 1000 connections  Thread Stats   Avg      Stdev     Max   +/- Stdev    Latency   600.28ms   70.23ms   2.00s    72.53%    Req/Sec    92.77     82.25   404.00     70.26%  488218 requests in 5.00m, 67.51MB read  Socket errors: connect 0, read 0, write 0, timeout 348Requests/sec:   1626.87Transfer/sec:    230.37KB

Сервер на ARM обслужил на 27% больше запросов в секунду в среднем на 26% быстрее.

Затем я запустил несколько бенчмарков из набора тестов Phoronix.

В тесте pts/compress-7zip-1.7.1t4g.small (ARM) выдал 6833 MIPS, а сервер t3.small (x86) - 5029 MIPS. ARM сервер был производительнее на 35%.

Сервер на ARM процессоре также завершил бенчмарк pts/c-ray быстрее более чем в 2 раза. 958 секунд ушло у сервера на x86 процессоре против 458 секунд у сервера с ARM процессором.

Я также запустил несколько тестов pts/ramspeed, измеряющих пропускную способность ОЗУ при выполнении различных операций.

Тип бенчмарка

t4g.small (ARM)

t3.small (x86)

Add/Integer

50000 МБ/c

13008 МБ/c

Copy/Integer

58650 МБ/c

11772 МБ/c

Scale/Integer

31753 МБ/c

11989 МБ/c

Triad/Integer

36869 МБ/c

12818 МБ/c

Average/Integer

44280 МБ/c

12314 МБ/c

Add/Floating Point

49775 МБ/c

12750 МБ/c

Copy/Floating Point

58749 МБ/c

11694 МБ/c

Scale/Floating Point

58721 МБ/c

11765 МБ/c

Triad/Floating Point

49667 МБ/c

12809 МБ/c

Average/Floating Point

54716 МБ/c

12260 МБ/c

Вкратце, ОЗУ на сервере t4g.small с процессором Graviton2 была быстрее от 3 до 5 раз.

Если смотреть только на производительность, переход на ARM сервера это одни преимущества. Больше производительности за меньшие деньги.

Совместимость

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

Некоторая часть ПО уже перекомпилирована для ARM процессоров. Например, Docker был доступен в форматах .rpm и .deb, как и большая часть образов (да, образы Docker требуют пересборки для разных архитектур). Однако, docker-compose не был скомпилирован для ARM процессоров, что вылилось в несколько часов сборки различных зависимостей из исходного кода. Скорее всего, ситуация улучшится в будущем, когда сервера на ARM станут более распространены. Сейчас, однако, в некоторых случаях, переход на ARM может принести больше затрат, чем преимуществ.

Зато сервера Amazon RDS на Graviton2 не требуют никакой настройки и позволяют получить все преимущества серверов на ARM процессорах без проблем с совместимостью.

Ввиду преимуществ ARM процессоров мы также собрали Docker образы recap.dev для архитектур arm/v7 и arm64.

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru