24 août 2023

Compilation PHP et JIT pour de meilleures performances

Avec l'introduction de PHP 8, les développeurs peuvent s'attendre à un certain nombre d'innovations révolutionnaires – de la compilation JIT, qui promet d'améliorer les performances, aux nouvelles extensions et optimisations qui redéfiniront l'efficacité du code.

À l’ère numérique où la vitesse et l’efficacité sont primordiales, les performances d’un site Web peuvent faire la différence entre le succès et l’échec d’une entreprise. Dans le contexte de l’hébergement et de l’ingénierie système, la recherche de solutions pour optimiser les performances est incessante. L'une des technologies qui a suscité un grand intérêt parmi les développeurs PHP est la compilation JIT (Just-In-Time). Mais qu’est-ce que cela implique exactement ? Et comment peut-il influencer positivement les performances de votre site Web hébergé sur un serveur Linux ? Découvrons ensemble.

Qu’est-ce que la compilation JIT ?

La compilation JIT, ou Just-In-Time, est une méthode de compilation dans laquelle le code source est traduit en code machine au moment de l'exécution, plutôt qu'à l'avance. Fondamentalement, au lieu de compiler le code source dans un format exécutable avant de l'exécuter, le code est compilé « à la volée » lors de son exécution.

Cette approche offre plusieurs avantages. Par exemple, il permet au compilateur d'optimiser le code en fonction de conditions d'exécution spécifiques, telles que la plate-forme matérielle ou le système d'exploitation. Cela peut également réduire le temps nécessaire au lancement d'une application, puisque vous n'avez pas besoin d'attendre que tout le code soit compilé avant de l'exécuter.

PHP et JIT

PHP est traditionnellement connu comme un langage de script interprété. Cela signifie que le code PHP est exécuté par un interpréteur qui lit et traite le code source étape par étape. Cette approche a ses avantages, tels que la facilité de développement et la portabilité, mais elle peut aussi être moins efficace que la compilation.

Avec l'avènement de PHP 8, une fonctionnalité révolutionnaire a été introduite : la compilation JIT. Cette fonctionnalité permet à PHP de compiler des parties du code source en code machine pendant l'exécution, améliorant potentiellement les performances.

Comment fonctionne la compilation JIT en PHP ?

Les langages de programmation purement interprétés n'ont pas de temps de compilation et exécutent directement le code dans une machine virtuelle. La plupart des langages interprétés, dont PHP, ont en fait un temps de compilation léger pour améliorer ses performances.

Les langages de programmation avec compilation Ahead-Of-Time (AOT), en revanche, nécessitent que le code soit d'abord compilé puis exécuté.

La compilation Just-In-Time est un modèle hybride entre l'interpréteur et la compilation Ahead-Of-Time, dans lequel tout ou partie du code est compilé, souvent au moment de l'exécution, sans que le développeur ait à le compiler manuellement.

Historiquement, PHP était un langage interprété, où tout le code était interprété par une machine virtuelle (Zend VM). Cela a changé avec l'introduction d'Opcache et d'Opcodes, qui étaient générés à partir du code PHP et pouvaient être mis en cache en mémoire. PHP 7.0 a introduit le concept d'AST (Abstract Syntax Tree), qui séparait davantage l'analyseur du compilateur.

Diagramme PHP JIT

Le JIT de PHP utilise en interne DynASM de LuaJIT et est implémenté dans le cadre d'Opcache.

Opcache peut inspecter le code utilisé, communément appelé code « chaud », et en stocker les versions compilées dans la mémoire partagée d'Opcache. Quand et quel code doit être compilé est configurable.

Avantages de la compilation JIT en PHP

  1. Performance améliorée: La compilation JIT peut conduire à des améliorations spectaculaires des performances, en particulier pour le code qui s'exécute de manière répétée. Cela peut se traduire par des temps de chargement plus rapides et une meilleure expérience utilisateur.
  2. Optimisation à la volée: Étant donné que la compilation a lieu pendant l'exécution, le compilateur peut optimiser le code en fonction de conditions d'exécution spécifiques.
  3. Plus de flexibilité: Avec la compilation JIT, les développeurs peuvent profiter pleinement des caractéristiques de la plateforme sur laquelle le code s'exécute, sans avoir à réécrire ou recompiler le code.

JIT VS Zend OpCache : quelle est la différence ?

Dans l'écosystème PHP, la performance est une priorité. Au fur et à mesure de l’évolution du langage et de ses extensions, diverses solutions ont vu le jour pour optimiser l’exécution des scripts. Deux des plus influents dans ce contexte sont JIT (Just-In-Time Compilation) et Zend OpCache. Mais quelles sont leurs différences et comment affectent-elles les performances de PHP ?

Zend OpCache : mise en cache du bytecode

Zend OpCache est une extension PHP intégrée qui agit comme un système de mise en cache de bytecode. Lorsqu'un script PHP s'exécute, il passe par plusieurs étapes : analyse, compilation et enfin exécution. Lors de la phase de compilation, le script est transformé en bytecode, qui est une représentation intermédiaire du code source, optimisée pour l'exécution.

Zend OpCache intervient dans ce processus en stockant le bytecode généré dans la mémoire partagée. Cela signifie que, pour les exécutions ultérieures du même script, PHP peut ignorer les étapes d'analyse et de compilation et passer directement à l'exécution du bytecode stocké. Cela réduit considérablement la surcharge et accélère l’exécution du script.

Si vous souhaitez mieux comprendre le fonctionnement de Zend OpCache, nous avons dédié un article spécifique : Zend OpCache. Comment accélérer PHP ?

JIT : Compiler au bon moment

D’un autre côté, JIT (Just-In-Time Compilation) est une approche d’optimisation complètement différente. Au lieu de se concentrer sur la mise en cache du bytecode, JIT compile le code PHP directement en code machine au moment de l'exécution. Ce code machine est spécifiquement optimisé pour la plate-forme sur laquelle il s'exécute, ce qui lui permet de s'exécuter beaucoup plus rapidement que le bytecode interprété.

La magie du JIT réside dans le fait qu'il ne compile pas tout le code source, mais uniquement les parties « chaudes », c'est-à-dire les sections du code qui sont fréquemment exécutées. Cela rend l’optimisation JIT extrêmement efficace en termes de ressources et de temps.

Comparaison et coexistence

La principale différence entre Zend OpCache et JIT réside dans leur approche de l'optimisation :

  • Zend OpCache: se concentre sur le stockage du bytecode, réduisant ainsi la surcharge associée à l'analyse et à la compilation des scripts PHP.
  • JIT: Se concentre sur la transformation du code PHP en code machine optimisé, en contournant complètement l'interprétation du bytecode.

Même si ces deux approches peuvent paraître opposées, elles peuvent en réalité coexister et se compléter. Une application PHP peut bénéficier à la fois de la vitesse d'exécution offerte par JIT et de la réduction des frais généraux offerte par Zend OpCache. En fait, de nombreuses configurations PHP modernes utilisent les deux extensions pour obtenir les meilleures performances possibles.

Prise en charge des plates-formes

Actuellement, JIT est activé sur les systèmes Linux et Windows fonctionnant sur des jeux d'instructions de processeur x86 et x64. Les processeurs Apple M1 et ARM ne sont actuellement pas pris en charge.

DynASM, qui est l'assembleur sous-jacent utilisé dans PHP JIT, prend également en charge les instructions ARM, mais il n'est pas clair si PHP JIT peut fonctionner sur des processeurs ARM.

JIT profite également d'AVX s'il est pris en charge par le processeur. La plupart des processeurs et serveurs grand public à partir de 2011 prennent en charge les instructions AVX.

En cours d'exécution cat /proc/cpuinfo | grep avx sur la plupart des systèmes POSIX, vous pouvez vérifier si le processeur le prend en charge.

Compte tenu de la qualité de la solution et de la technologie JIT, il est facile de comprendre que le support sera probablement étendu à de nombreuses plateformes au cours des prochains mois et années, mais il est toujours préférable de se renseigner auprès de votre hébergeur.

Tests PHP JIT

Tous les tests suivants ont été effectués sur un système x86-64 à 8 cœurs et 16 threads. Cependant, les tests n'utilisent jamais d'entiers qui nécessitent des registres 64 bits, afin que le test reste plus pertinent pour les processeurs x86.

Le premier test a été effectué avec Opcache complètement désactivé et le second avec JIT désactivé, mais opcache activé.

Les deux modes JIT apportent des améliorations substantielles des performances, avec tracingle mode légèrement plus puissant.

Ce benchmark ne représente guère une véritable application PHP. Les appels répétitifs à la même fonction et la nature plus simple et sans effets secondaires du code testé profitent au JIT.

Une fonction simple de Fibonacci pour calculer le 42ème nombre de la séquence de Fibonacci.

Benchmark des applications Web avec JIT activé

L'évaluation de l'effet du JIT peut être complexe, car son impact varie en fonction du type de charge de travail auquel il est soumis. La plupart des exemples suivants concernent des frameworks Web concrets, mais ceux-ci ne reflètent pas toujours l'utilisation typique dans le contexte réel, principalement en raison de l'intervention de divers plugins et mécanismes de mise en cache.

Pour les applications qui se connectent à une base de données, le plus gros problème sera probablement la performance des requêtes de la base de données. Dans une simulation de serveur Web où vous évaluez les requêtes traitées chaque seconde, les frais généraux associés à TLS, HTTP et FPM pourraient avoir un impact bien plus important que les améliorations offertes par JIT.

Des tests ont été réalisés sur Laravel (8.4.4) et Symfony (démo 1.6.3, avec composants 5.1.8) en utilisant leurs configurations de base. Ces tests ont été réalisés sur le même matériel et dans les mêmes conditions que les benchmarks précédents. Les deux frameworks ont été exécutés via le serveur Web intégré de PHP et leurs performances ont été évaluées à l'aide d'Apache Bench (ab), avec des tests effectués avec une concurrence de 5 et 100 requêtes, et les résultats ont été obtenus à partir d'une moyenne de 5 tentatives.

Les deux applications n'ont reçu aucun avantage notable et dans Laravel, les performances étaient environ 2 % moins bonnes avec JIT, probablement en raison de la surcharge de compilation qui ne compensait pas les efforts.

Analyser et comparer chaque application

Pour identifier les avantages réels en termes de performances, il est essentiel d'effectuer un benchmark spécifique pour chaque application, afin de déterminer si l'adoption du JIT peut offrir une augmentation significative des performances.

En particulier, les applications CLI, en particulier celles qui nécessitent une utilisation élevée du processeur, peuvent connaître une amélioration considérable des performances grâce au JIT.

En revanche, pour les applications orientées réseau ou gourmandes en fichiers, telles que Composer et PHPUnit, il y aura probablement peu ou pas d'avantages en termes de performances.

En effet, ces applications ne bénéficient pas beaucoup des optimisations au niveau du code machine proposées par JIT. Pour obtenir des améliorations dans ces contextes, il peut être plus efficace d’investir dans des SSD de plus grande capacité, plus de RAM ou une bande passante plus élevée.

Hébergement PHP avec prise en charge JIT

Managed Server Srl, toujours attentif aux dernières innovations technologiques, a reconnu le potentiel de la compilation JIT dès son annonce. Depuis le second semestre 2020, nous prenons en charge JIT pour toutes les versions de PHP égales ou supérieures à 8. Cet engagement reflète notre engagement à fournir à nos clients les solutions les plus avancées et les plus performantes disponibles sur le marché.

Considérations sur l'hébergement

Si vous envisagez d'utiliser JIT PHP pour votre site Web, vous devez garder à l'esprit quelques considérations :

  1. Compatibilité: Assurez-vous que votre fournisseur d'hébergement, tel que Managed Server Srl, prend en charge PHP 8 ou version ultérieure. Ceci est essentiel pour profiter de la compilation JIT.
  2. Configuration: La compilation JIT peut être configurée de plusieurs manières, selon vos besoins. Consultez la documentation et configurez le JIT de manière optimale pour votre site et votre serveur, en vous assurant que votre hébergement de confiance a activé JIT.
  3. Suivi de la performance: Comme pour tout changement, il est essentiel de surveiller les performances de votre site après avoir activé la compilation JIT. Cela vous permettra d’identifier tout problème et d’optimiser davantage les performances.

Une nouvelle ère pour PHP

Avec l’arrivée de la compilation JIT, PHP ne se limite plus au seul environnement web. Cette évolution représente un changement radical pour la langue. Mais quelles sont les véritables implications de cette révolution ?

  1. Environnements d'application étendus: La possibilité d'exploiter la compilation JIT ouvre la porte à de nouveaux horizons pour PHP. On ne parle plus seulement de pages web dynamiques, mais aussi d’applications bureautiques, de systèmes embarqués, et même d’applications d’intelligence artificielle ou d’analyse de données. PHP pourrait trouver sa place dans des contextes où, jusqu'à présent, cela était impensable.
  2. Optimisation des ressources: La compilation JIT tire pleinement parti des ressources fournies par les processeurs modernes. Cela signifie que les applications PHP seront capables d'effectuer des opérations complexes beaucoup plus efficacement, en tirant le meilleur parti de la puissance de calcul disponible.
  3. Haute performance: Dans les scénarios où la vitesse et l'efficacité sont critiques, comme les applications d'analyse en temps réel ou les systèmes informatiques hautes performances, PHP avec JIT peut offrir des performances comparables à celles des langages traditionnellement plus rapides.

La compilation JIT représente une évolution significative pour PHP, offrant le potentiel d'améliorer considérablement les performances des applications Web. Pour les sociétés d'hébergement et d'ingénierie système Linux, comme Managed Server Srl, qui proposent des solutions d'hébergement performantes, il est essentiel de rester à jour sur les dernières technologies et d'offrir aux clients les meilleures solutions possibles. La compilation JIT en PHP n'est qu'un des outils disponibles pour y parvenir. Assurez-vous d'en tirer le meilleur parti !

Vous avez des doutes ? Vous ne savez pas par où commencer ? Contactez-nous !

Nous avons toutes les réponses à vos questions pour vous aider à faire le bon choix.

Discute avec nous

Discutez directement avec notre support avant-vente.

0256569681

Contactez-nous par téléphone pendant les heures de bureau 9h30 - 19h30

Contactez-nous en ligne

Ouvrez une demande directement dans l'espace contact.

INFORMATIONS

Managed Server Srl est un acteur italien leader dans la fourniture de solutions système GNU/Linux avancées orientées vers la haute performance. Avec un modèle d'abonnement peu coûteux et prévisible, nous garantissons que nos clients ont accès à des technologies avancées en matière d'hébergement, de serveurs dédiés et de services cloud. En plus de cela, nous proposons des conseils système sur les systèmes Linux et une maintenance spécialisée en SGBD, sécurité informatique, Cloud et bien plus encore. Nous nous distinguons par notre expertise dans l'hébergement de CMS Open Source de premier plan tels que WordPress, WooCommerce, Drupal, Prestashop, Joomla, OpenCart et Magento, soutenus par un service d'assistance et de conseil de haut niveau adapté aux administrations publiques, aux PME et à toutes tailles.

Red Hat, Inc. détient les droits de Red Hat®, RHEL®, RedHat Linux® et CentOS® ; AlmaLinux™ est une marque commerciale d'AlmaLinux OS Foundation ; Rocky Linux® est une marque déposée de la Rocky Linux Foundation ; SUSE® est une marque déposée de SUSE LLC ; Canonical Ltd. détient les droits sur Ubuntu® ; Software in the Public Interest, Inc. détient les droits sur Debian® ; Linus Torvalds détient les droits sur Linux® ; FreeBSD® est une marque déposée de The FreeBSD Foundation ; NetBSD® est une marque déposée de la Fondation NetBSD ; OpenBSD® est une marque déposée de Theo de Raadt. Oracle Corporation détient les droits sur Oracle®, MySQL® et MyRocks® ; Percona® est une marque déposée de Percona LLC ; MariaDB® est une marque déposée de MariaDB Corporation Ab ; REDIS® est une marque déposée de Redis Labs Ltd. F5 Networks, Inc. détient les droits sur NGINX® et NGINX Plus® ; Varnish® est une marque déposée de Varnish Software AB. Adobe Inc. détient les droits sur Magento® ; PrestaShop® est une marque déposée de PrestaShop SA ; OpenCart® est une marque déposée d'OpenCart Limited. Automattic Inc. détient les droits sur WordPress®, WooCommerce® et JetPack® ; Open Source Matters, Inc. détient les droits sur Joomla® ; Dries Buytaert détient les droits sur Drupal®. Amazon Web Services, Inc. détient les droits sur AWS® ; Google LLC détient les droits sur Google Cloud™ et Chrome™ ; Microsoft Corporation détient les droits sur Microsoft®, Azure® et Internet Explorer® ; La Fondation Mozilla détient les droits sur Firefox®. Apache® est une marque déposée de The Apache Software Foundation ; PHP® est une marque déposée du groupe PHP. CloudFlare® est une marque déposée de Cloudflare, Inc. ; NETSCOUT® est une marque déposée de NETSCOUT Systems Inc. ; ElasticSearch®, LogStash® et Kibana® sont des marques déposées d'Elastic NV. Hetzner Online GmbH détient les droits sur Hetzner® ; OVHcloud est une marque déposée d'OVH Groupe SAS ; cPanel®, LLC détient les droits sur cPanel® ; Plesk® est une marque déposée de Plesk International GmbH ; Facebook, Inc. détient les droits sur Facebook®. Ce site n'est affilié, sponsorisé ou autrement associé à aucune des entités mentionnées ci-dessus et ne représente en aucune manière aucune de ces entités. Tous les droits sur les marques et noms de produits mentionnés sont la propriété de leurs titulaires respectifs des droits d'auteur. Toutes les autres marques mentionnées appartiennent à leurs titulaires. MANAGED SERVER® est une marque déposée au niveau européen par MANAGED SERVER SRL, Via Enzo Ferrari, 9, 62012 Civitanova Marche (MC), Italie.

JUSTE UN MOMENT !

Souhaitez-vous voir comment votre WooCommerce fonctionne sur nos systèmes sans avoir à migrer quoi que ce soit ? 

Entrez l'adresse de votre site WooCommerce et vous obtiendrez une démonstration navigable, sans avoir à faire absolument quoi que ce soit et entièrement gratuite.

Non merci, mes clients préfèrent le site lent.
Retour en haut de page