Table des matières de l'article :
À 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.
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
- 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.
- 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.
- 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 tracing
le 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 :
- 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.
- 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.
- 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 ?
- 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.
- 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.
- 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 !