+7 495 008 8452 пн.-пт. 10:00 – 17:00
Загрузка...
Если у вас возникли какие либо вопросы которые вы не смогли решить по нашим публикациям самостоятельно,
то ждем ваше обращение в нашей службе тех поддержки.


Php8 JIT в bitrix – небольшие заметки и исследования

В новой версии PHP8+ реализована JIT-компиляция, которой не мог похвастаться PHP, но теперь и у "пыхарей" есть такая функция повышения производительности.

Напомним, что JIT-компиляция (англ. Just-in-Time, компиляция «точно в нужное время»), динамическая компиляция (англ. dynamic translation) — технология увеличения производительности программных систем, использующих байт-код, путём компиляции байт-кода в машинный код или в другой формат непосредственно во время работы программы.

Т.е. JIT - это некая динамическая способность ускорения в процессе выполнения на реальных данных.

Уже не новость, что новое ядро битрикса модуль main 23+ требует php8 и поддержка более низких версий прекращена, так что использование всех новых возможностей php8 звучит как не плохая идея.

Мы попробовали запустить JIT в битрикс окружении, на ряде проектов он работал стабильно, на других возникали ошибки двух видов: Segmentation fault и Fatal Error Insufficient shared memory. Все они требуют gdb-отладки, а так далеко сейчас мы идти не хотим ;) т.к. нам хочется получить профит малыми силами. В качестве экспериментов мы нашли более-менее стабильную конфигурацию, которая может подойти и вам.

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

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

photo_2023-07-07_19-36-39.jpg

Так что можете экспериментировать на свой «страх и риск» реализуя свои технические амбиции.

В битрикс окружении все включается редактированием конфигурации в файле /etc/php.d/z_bx_custom_settings.ini
(если файла нет – его нужно создать):

opcache.jit_buffer_size=16M  ; рекомендуем ставить не более 32мб
opcache.jit = tracing ; про эту настройку читайте ниже («Дополнительная информация»)
opcache.enable_cli=0 ; эту директиву рекомендуем держать выключенной, с ней с наибольшей вероятностью 
                                ; у нас возникали проблемы с запуском агентов на cron и других скриптов из командной строки

; дополнительно:
opcache.huge_code_pages = On    ; huge pages - отдельная сложная тема управления памятью,
                                                         ; но обычно это улучшает быстродействие
opcache.enable_file_override = 1    ; более быстрая работа с файловыми операциями
opcache.max_accelerated_files = 500000 ; побольше файлов в opcache, при этом следите за тем, чтобы памяти, 
                                                  ; выделенной под opcache директивой opcache.memory_consumption хватало 

; тоже не помешает:
realpath_cache_size = 14096k ; больше кеша открытых файлов
pcre.jit = 1 ; этот же jit в регулярных выражениях

После изменений файла z_bx_custom_settings.ini – нужно перезапустить апач. В битрикс окружении это делается командой:

# pkill -9 httpd && apachectl restart && systemctl restart httpd-scale.service

Дополнительная информация: Разница между режимами opcache.jit(function и tracing) заключается в том, что при параметре function JIT пытается оптимизировать код только в рамках одной функции, в то время как JIT tracing может просматривать всю трассировку стека, чтобы идентифицировать и оптимизировать горячий код. PHP Internals рекомендует использовать JIT-трассировку, потому что она почти всегда дает наилучшие результаты.

Получаемый прирост при использовании JIT

Теоретически это дает некий небольшой прирост, который мы сами еще не оценили, да и его трудно оценить объективно, т.к. результаты зависят от самого приложения (на то это и динамическая компиляция). Судя по сторонним исследованиям, прирост на реальных приложениях совсем не большой:

2023-07-07_18-56-53.png

2023-07-07_18-50-43.png

Но видимо для отдельных задач типа генерации pdf или excel-файлов, или математических операций – должен быть прирост больше.

Тем не менее, радует сама возможность использовать новые функции из окружения php, которые зачастую не доступны Битрикс-разработчикам (или доступны гораздо позже всех остальных из мира php ;).


Для дополнительного изучения вопроса:


PS А как на счет запуска PHP JIT под Windows с битриком?

Сперва у нас не удалось запустить из-за ошибки модуля mpm_winnt в апаче и его несовместимости с PHP JIT под windows. Но на момент написания статьи и с последними билдами Apache  все заработало и для проектов на битриксе:
Server Version: Apache/2.4.57 (Win64) PHP/8.0.28
Apache Lounge VS17 Server built: May 31 2023 10:48:22
System: Windows NT HIPOT3 10.0 build 19045 (Windows 10) AMD64
Если у вас есть вопросы – напишите нам - мы рады любой обратной связи.

Назад в раздел

Подписаться на новые материалы раздела:
Загрузка...