[Перевод] Бенчмарки PHP 8.0 и 7.4 на Symfony: повышение производительности JIT до +9% вместе с предварительной загрузкой OPCache

Будущих студентов курса “Symfony Framework” и всех желающих приглашаем записаться на открытый вебинар по теме “Микрофреймворки: сравнение производительности Symfony и Symlex”.

Также делимся переводом полезной статьи.


PHP 8.0 должен увидеть свет 26 ноября 2020 года, а вскоре за ним и последняя версия фреймворка Symfony 5.2. Здесь представлена серия бенчмарков, выполненных на последних версиях обоих проектов. Это чистый hello world сценарий, и его следует воспринимать как таковой. Имеет значение только относительная производительность. В реальном мире YMMV (ваши результаты могут отличаться от приведенных).

АПДЕЙТ 1: в этой статье изначально отсутствовали показатели для JIT PHP 8.0, поскольку он не был включен по умолчанию. Спасибо Андре Ремке, указавшему на это!

АПДЕЙТ 2: PHP 8.0.0 и Symfony 5.2.0 уже зарелизили. Я провел бенчмарки снова, и результаты оказались практически такими же, поэтому исходные значения все еще актуальны.

Бенчмарки проводились на PHP 8.0-RC5 и Symfony 5.2-RC2. Обе версии не являются окончательными, но это самые последние кандидаты на релиз, которые могут быть очень близки к финальным версиям. Средой выполнения послужил датацентр Hetzner Helsinki с виртуальным сервером CCX11 (2 выделенных виртуальных процессора, 8 ГБ ОЗУ), выполняющим работу, и еще одним для выполнения бенчмарков. В качестве ОС использовалась Ubuntu 20.20 с PHP, установленным из пакетов от Ондржея Сури.

Целью бенчмарка было простое приложение Symfony 5.2 с экшеном контроллера генерации счастливого числа в корне. Экшн выводит фрагмент HTML со случайным числом от 100 до 999. Я провел нагрузочный тест с пятью параллельными задачами (1, 10, 25, 50, 100) три раза для каждой конфигурации и использовал в отчете среднее значение.

В общей сложности были протестированы пять конфигураций с использованием PHP-FPM и сетапом Nginx:

  • PHP 7.4 без предварительной загрузки OPCache

  • PHP 7.4 с предварительной загрузкой OPCache

  • PHP 8.0 без предварительной загрузки OPCache

  • PHP 8.0 с предварительной загрузкой OPCache

  • PHP 8.0 с предварительной загрузкой OPCache и включенным JIT 

Такой же конфиг OPCache используется для пост-бенчмаркинга предварительной загрузки OPCache:

opcache.preload_user=www-data
opcache.memory_consumption=1024
opcache.interned_strings_buffer=256
opcache.max_accelerated_files=30000
opcache.validate_timestamps=0

# only when OPCache Preloading was enabled
opcache.preload=/var/www/php80/var/cache/prod/App_KernelProdContainer.preload.php

# only when JIT was enabled
opcache.jit_buffer_size=512mb
opcache.jit=1225

Результаты и заключение

Балансировка нагрузки осуществлялась с помощью hey, и я дополнительно привожу показатели пропускной способности (req/s) и время отклика (мс). Приложение не подключается к удаленным службам, таким как базы данных.

Что касается пропускной способности, как PHP 7.4, так и 8.0 значительно выигрывают от включения предварительной загрузки OPCache. В среднем PHP 7.4 немного более производительный, но ненамного. Что касается пропускной способности, похоже, изменений при параллелизме от 10 до 100 нет, но PHP 8.0 с JIT, как ни странно, менее эффективен на небольшом параллелизме, но оживает и превосходит 7.4 с предварительной загрузкой OPCache, начиная с 25+ параллелизма и далее.

Что касается времени отклика, то здесь история аналогична производительности. Включение предварительной загрузки OPCache дает лучшие результаты, чем обновление с PHP 7.4 до 8.0. По времени отклика (чем меньше, тем лучше) PHP 8.0 немного лучше, чем 7.4, но незначительно. Время отклика выше при низком параллелизме, но остается постоянным от 10 до 100. 8.0 с JIT похожа: хуже при низком параллелизме, но лучше при высокой нагрузке.

В целом улучшения базовой производительности для такого приложения, как Symfony, очень похожи между PHP 8.0 и 7.4. Это неудивительно, поскольку известно, что JIT в PHP 8.0, который уже существовал в ранней форме для PHP 7.0, более полезен для вычислений и других задач обработки данных, завязанных на процессоре.

Что касается производительности, JIT здесь выглядит неоднозначно, замедляясь при низком уровне параллелизма и обеспечивая значительное улучшение пропускной способности только с предварительной загрузкой OPCache. Требуется дополнительные исследования, но здесь дело обстоит неясно, так как это может снизить производительность. Кажется, что JIT следует рассматривать в индивидуальном порядке для PHP.

Так что пока можно с уверенностью сказать, что торопиться обновляться с 7.4 до 8.0 из соображений производительности не следует. Будет лучше, если вы обновите PHP 7.3 до 7.4 и включите предварительную загрузку OPCache. Это не значит, что PHP 8.0 в разочаровал нс. Он укомплектован новыми языковыми фичами и важными депрекейшенами. Самое главное, приятно видеть, что не было никаких падений в производительности (как это было при переходе с 4.4 на PHP 5.0 еще в 2004 году). Это отличное начало для 8.x.

Ваши комментарии и отзывы приветствуются на Discourse: бенчмарки PHP 8.0 и 7.4


Узнать подробнее о курсе “Symfony Framework”.

Записаться на открытый вебинар по теме “Микрофреймворки: сравнение производительности Symfony и Symlex”.

Прямо сейчас в OTUS действуют максимальные новогодние скидки на все курсы. Ознакомиться с полным списком курсов вы можете по ссылке ниже. Также у всех желающих есть уникальная возможность отправить адресату подарочный сертификат на обучение в OTUS.

Кстати, о “красивой упаковке” онлайн-сертификатов мы рассказываем в этой статье.

ЗАБРАТЬ СКИДКУ

Let’s block ads! (Why?)

Read More

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *