Pull to refresh

PHP New Generation

Reading time 3 min
Views 35K
Original author: Dmitry Stogov
Немного вольный перевод письма Дмитрия Стогова на internal рассылку PHP сообщества, написанного 5-го мая.

Для знающих меня людей не секрет, что улучшение производительности PHP является моей главной обязанностью и увлечением в Zend. Вообще, начиная с PHP 5.0 мы уже шестикратно ускорили PHP в синтетических тестах и примерно двукратно в реальных проектах. Мы не прекращали улучшать ядро PHP и OPCache. Но все же, с релизом PHP 5.5 у нас не получалось сильно продвинуться дальше и вместе с остальным мы начали экспериментировать с менеджерами памяти, технологией JIT и другими потенциальными решениями.

Я потратил очень много времени экспериментируя с JIT, и даже сделал прототип прозрачного, основанного на LLVM, JIT компилятора встроенного в OPCache. Результаты для bench.php были восхитительны (0,219 секунд против 2,175 — десятикратный прирост для PHP 5.5), но для реальных проектов мы получили всего-лишь пару процентов прироста производительности. Это заставило нас всмотреться глубже в характеристики исполняемой среды и в то, что было по-настоящему бутылочным горлышком. Ясно, что виртуальная машина уже была хорошо оптимизирована, но она работала со структурами данных, постоянно требующими выделение и освобождение памяти и подсчет ссылок на значения. Обычное реальное PHP приложение тратит примерно 20% процессорного времени в менеджере памяти, 10% при операциях с хэш-таблицами, 30% во встроенных функциях PHP и всего-лишь 30% в виртуальной машине. Конечно же мы пробовали JIT только для кода виртуальной машины и в большинстве случаев этот код все равно делал теже самые операции с памятью. Поэтому мы решили сменить фокус и работать над этим крупным бутылочным горлышком. Идея состояла в изменении типов данных для оптимизации выделения кусков памяти. Это было очень трудным решением, так как нам нужно было начать огромный рефакторинг и мы понятия не имели повлияет ли он на что-нибудь вообще.

Я с радостью представляю вам результат нашей работы за последние четыре месяца. Это  рефакторинг ядра PHP, который существенно повышает производительность и улучшает  использование памяти, и главное дает фундамент для крупных улучшений в будущем, включая JIT. Я упущу технические детали (подробности опубликованы тут wiki.php.net/phpng), но  если двумя словами, то мы изменили фундамент попытавшись сохранить бОльшую часть здания  без изменений. Уже сейчас новое ядро дает 10-30% прироста производительности  не только в тестах, но также и в реальных проектах!

Некоторые тесты производительности:
Wordpress 3.6 – 20.0% прирост (253 vs 211 req/sec)
Drupal 6.1 – 11.7% прирост (1770 vs 1585 req/sec
Qdig – 15.3% прирост (555 vs 482 req/sec)
ZF test app – 30.5% прирост (217 vs 166 req/sec)

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

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

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

Попробуйте отрефакторенный PHP и дайте ваш фидбек по производительности, использованию памяти и любым проблемам.
Ветку *phpng* можно найти на php.net. Есть также немного инструкций тут wiki.php.net/phpng. …

Я хотел бы отдельно поблагодарить Xinchen и Nikita за значительную часть проделанной работы!

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

Всем спасибо!


От себя хочу отметить, что на прошлогодней конференции devconf, Дмитрия спрашивали про JIT и он как раз рассказал про их не совсем удачный опыт с ним. Но это письмо дает нам понять, что PHP все еще торт.

Также хочу отметить, что упомянутые Никита Попов (переводы его статей по php не однократно появлялись на хабре) и Xinchen Hui (и его проекты тоже светились на хабре) совсем молодые парни, влившиеся в сообщество всего пару лет назад. На таких энтузиастах держится не одно сообщество.

*Все ошибки в переводе или опечатки, грамматику и орфографию присылайте в личку, спасибо!
Tags:
Hubs:
+69
Comments 73
Comments Comments 73

Articles