Comment accélérer PHP grâce à JIT (Just-in-Time compilation) sur un Hébergement PHP 8+ ?

La compilation Just-in-Time (JIT) est une nouvelle fonctionnalité importante de PHP 8, incluse dans le dispositif de mise en cache du code PHP via OPCode, le dénommé OPCache ! Cette amélioration de PHP offrira des gains de performance significatifs ↓ pour l’exécution de certains scripts codés pour PHP 8 et supérieurs.

Concrètement, JIT permet un traitement beaucoup plus rapide des contenus dynamiques générés « à la volée » par PHP, en compilant et en optimisant le code (juste) au moment de l’exécution. Ce processus élimine le besoin de précompilation du code et permet donc aux scripts d’être exécutés plus rapidement.

Activer JIT via les options PHP de votre Hébergement cPanel

Puisque vous avez compris l’intérêt d’activer JIT pour accélérer l’exécution de vos CMS et scripts PHP, passons à la pratique avec les instructions relatives à votre hébergement EasyHoster.

Tous les scripts, plugins et CMS ne sont pas compatibles JIT, donc, n’oubliez pas de tester vos sites !
En effet, JIT est un dispositif qui revoit grandement la manière dont est exécuté le code PHP. Donc, même si la plupart des sites WordPress récents compatibles PHP 8 sont aussi compatibles avec JIT, il conviendra malgré tout de tester rigoureusement toutes les zones importantes de votre site après activation (canal eCommerce, formulaires, etc).

Grâce à l’interface avancée de votre Hébergement cPanel, l’activation de JIT est simple et rapide à réaliser.

Si ce n’est pas déjà fait, assurez-vous d’abord de passer sur une version de PHP 8.0 ou supérieure.

Comment modifier sa version de PHP via son Hébergement cPanel ?
Version de PHP 7.4 ou PHP 8.1
Rendez votre dans votre compte cPanel > Sélectionner une version de PHP (PHP Selector)

Vérifiez plus bas que l’extension PHP OPCache est déjà bien activée.

Comment activer OPCache dans cPanel ?
Plus d’infos dans notre guide complet sur OPCache →

Cliquez ensuite sur l’onglet « Options » du PHP Selector pour vous rendre dans l’interface simplifiée de modification des paramètres php.ini.

Modifier les options / paramètres php.ini sur hébergement cPanel
Activer PHP OPcache JIT sur un Hébergement Web cPanel

Si vous ne deviez modifier que 2 paramètres, cela serait ceux-ci…

opcache.jit

opcache.jit ce paramètre défini comment JIT doit fonctionner.
Par défaut, et pour des raisons de compatibilité avec la plupart des scripts et CMS, JIT est désactivé sur notre infrastructure grâce au paramètre : « disable« .
Pour activer JIT, la valeur la plus courante est « tracing » (recommandée pour la plupart des utilisateurs). Dans ce mode, le compilateur JIT choisit des segments de code à l’intérieur d’une fonction à compiler par paquet, au lieu de compiler toute la fonction d’un coup.
Le dernier mode de JIT est « function« . Dans ce mode, le compilateur JIT essaie d’optimiser toute la fonction en une fois fois.

opcache.jit_buffer_size

opcache.jit_buffer_size est la quantité de Mémoire RAM maximum allouée au code Précompilé par JIT.

Activer PHP OPcache JIT sur un Hébergement Web cPanel : Zoom sur opcache.jit_buffer_size.

Une valeur nulle (0) désactive complètement JIT, et c’est le comportement par défaut sur nos solutions cPanel pour éviter les problèmes de compatibilité.

Pour tirer avantage des performances offertes par le Just-In-Time Compileur de PHP 8, la valeur recommandée est « environ 5% de la Mémoire RAM de votre plan d’hébergement ».
Par exemple, pour une offre Perso disposant de 2 Go RAM, définissez un maximum de 128 Mo alloué à JIT, ou 64 Mo de RAM pour laisser plus de mémoire aux autres processus : MySQL, Redis, GZip, etc.

Il s’agit d’ores et déjà de quotas très confortables pour du stockage de code en mémoire vive.

Vérifier que JIT est actif et fonctionne correctement

La manière la plus fiable de vérifier vos paramètres de PHP, OPCache et de JIT est de créer un fichier appelé « PHPinfo », qui reprendra l’ensemble des informations relatives à votre configuration de PHP, y compris JIT.

1. Créer un fichier PHP info

Pour créer ce fichier, découvrez notre guide dédié :

Comment créer un Fichier PHP phpinfo pour vérifier que JIT est actif ? →

Une fois votre fichier PHP info créé, vous allez pouvoir vérifier plusieurs informations, comme la version de PHP actuelle, l’activation (ou non) d’OPCache, votre consommation de mémoire actuelle, ainsi que le statut de JIT.

Les informations les plus importantes à vérifier pour vous ici sont sous l’onglet « Zend OPCache », « Opcode Caching : Up and Running », « JIT : On ».

Configuration de JIT OPcache dans fichier PHPinfo

2. Créer un fichier PHP avec un dump des paramètres de JIT

En complément, pour avoir une vue plus fine de la consommation réellement spécifique à JIT, vous pouvez créer un fichier PHP nommé « opcache.jit.phpinfo.php » dans lequel vous pourrez coller le bout de code suivant :

<pre>
    <?php var_dump(opcache_get_status()['jit']); ?>
</pre>

Lorsque vous visiterez ce fichier PHP, vous pourrez visualiser un tableau semblable à celui illustré ci-dessous, montrant très précisément la consommation de mémoire vive utilisée par JIT :

Comment voir la consommation de mémoire RAM de JIT via OPcache et PHP 8 ?

3. Installer WP OPCache sur WordPress

Enfin, si vous êtes un utilisateur de WordPress n’ayant pas d’expérience en développement Web, il existe un plugin qui peut vous séduire : WP OPCache !

Installer le plugin gratuit WP OPCache
Le plugin WP OPCache peut être installé librement et gratuitement, depuis votre Tableau de bord WordPress, comme n’importe quel autre plugin open source.
Plugin WordPress WP Opcache et JIT ?

Ce plugin vous permet de vider la mémoire d’OPCache, ainsi que de vérifier certains paramètres de JIT, mais ne permet pas encore de vérifier la consommation de mémoire propre à JIT. C’est la raison pour laquelle nous utilisons un fichier PHP faisant un dump du tableau de paramètres de opcache_get_status.

OPCache, le système de mise en cache PHP indispensable

Comme nous l’avons vu ci-dessus, pour pouvoir fonctionner, JIT dépend d’OPCache, puisqu’il s’agit d’une sous-fonctionnalité de celui-ci. D’ailleurs, OPCache est un dispositif qui est activé par défaut sur tous les hébergements EasyHoster et qui ne devrait être désactivé qu’au cas par cas, afin de bénéficier de bonnes performances.

Si ce n’est pas déjà fait, nous vous recommandons de consulter notre guide complet concernant OPCache…

Qu’est-ce que le cache PHP OPcode, pourquoi nous avons choisi OPCache et comment le configurer ? →

Redis, un système d’Object Cache complémentaire à OPCache

Redis est un système de cache des données issues de requêtes MySQL, contrairement à OPCache qui lui conserve en mémoire le code source des scripts PHP.

Redis est très évolué, moderne et performant. De plus, l’Object Cache est 100% complémentaire à OPCache, ainsi qu’à JIT.

La bonne nouvelle est que si vous êtes utilisateur de WordPress, il vous est possible de bénéficier très facilement de cette puissante optimisation complémentaire, et ce, grâce à un plugin gratuit et open source.

De nombreux hébergeurs web concurrents vous proposent Redis moyennant des frais supplémentaires. Cependant, chez EasyHoster, l’accès à Redis est 100% gratuit et inclus dans tous nos plans d’hébergement, avec tous les avantages que cela inclut. Notamment, encore plus de mémoire complémentaire allouée à vos sites !

Installer le plugin Redis Object Cache pour booster les performances MySQL de WordPress ? →

Grâce à OPCache, JIT, Redis et un bon plugin de cache, vous disposez de toute l’armada vous permettant d’améliorer les performances de vos sites, ainsi qu’économiser les ressources de votre compte d’hébergement web.

Comment fonctionne l’accélérateur des performances PHP via JIT ?

Pour en savoir plus, on vous en dit un peu plus sur le Just-in-Time Compiler avec ce qu’il contient sous le capot…

Présentation technique détaillée de JIT (Just-in Time Compilation) pour PHP OPCache

Le JIT OPCache ou Just-in-Time Compiler fait son entrée avec PHP 8, pour plus de performances !

En effet, la version 8 de PHP est la seule donnant accès la la nouvelle technologie de « Compiler » de Zend Technologies : « JIT ». Il s’agit d’un complément au système de Cache PHP : OPCache (plus d’infos). À l’heure où nous écrivons ces lignes, nous n’avons encore jamais rencontré d’hébergeur web français communiquant sur cette technologie PHP récente. D’ailleurs, nous n’avons vu aucun hébergeur (même US), proposant de l’assistance à ses clients pour la mise en œuvre de ce nouveau Compiler PHP Performant. Donc, si vous êtes utilisateur EasyHoster, profitez-en pour découvrir cette nouvelle technologie PHP !

 Donc, comme nous l’avons vu, OPcache permet d’éliminer le besoin de charger et d’analyser des scripts à chaque requête en stockant le bytecode de script précompilé dans la mémoire partagée. Cet avantage majeur est que le code source n’a toujours pas besoin d’être précompilé, mais avec un cache partagé de code machine compilé, le langage peut déclencher l’exécution du code avec du code machine compilé, compilé pour plus tard, ou exécuté sans JIT. Cependant, la mise en œuvre de JIT a ajouté un obstacle considérable au débogage, étant donné que certaines parties de l’application pourraient être mises en cache sous forme de « code machine CPU », avec lequel les débogueurs PHP standard ne peuvent pas fonctionner.

 Contrairement à OPCache, qui met en mémoire le bytecode entièrement compilé, JIT compile les instructions à la demande lorsqu’elles sont rencontrées dans un script. Cela signifie que les instructions n’ont pas besoin d’être précompilées et stockées en mémoire, ce qui permet d’économiser une quantité considérable de mémoire et d’améliorer la vitesse d’exécution.

Ce nouveau compilateur JIT propose également des techniques d’optimisation avancées, telles que le réarrangement du code pour améliorer les performances, l’analyse des valeurs de données pour optimiser leur utilisation et la spécialisation des instructions pour un meilleur débit. Tous ces éléments se combinent pour améliorer considérablement les performances par rapport à la seule mise en cache OPCache, qui était déjà l’un de nos indispensables chez EasyHoster !

Outre l’amélioration des performances, le compilateur Just-in-Time offre également un environnement plus sûr pour l’exécution des scripts en éliminant les vulnérabilités potentielles d’un code malveillant. En compilant le code au fur et à mesure de son exécution plutôt qu’en s’appuyant sur un bytecode précompilé, le JIT réduit considérablement les chances de réussite d’une attaque contre une application ou un script. Dans l’ensemble, la compilation Just-in-Time est sur le point de révolutionner la manière dont PHP est utilisé dans les applications web et apportera des améliorations de performance bienvenues qui rendront l’écriture de scripts plus facile et plus rapide que jamais. Avec ses mesures de sécurité accrues et son utilisation optimisée des ressources, l’implémentation de la compilation Just-in-Time de PHP 8 promet une plus grande efficacité dans tous les domaines.

Comprendre les bases de PHP JIT sous le capot (Buffer, Tracer…)

OPcache permet d’éliminer le besoin de charger et d’analyser des scripts à chaque requête en stockant le bytecode de script précompilé dans la mémoire partagée.

Cet avantage majeur est que le code source n’a toujours pas besoin d’être précompilé, mais avec un cache partagé de code machine compilé, le langage peut déclencher l’exécution du code avec du code machine compilé, compilé pour plus tard, ou exécuté sans JIT.

Cependant, la mise en œuvre de JIT a ajouté un obstacle considérable au débogage, étant donné que certaines parties de l’application pourraient être mises en cache sous forme de « code machine CPU », avec lequel les débogueurs PHP standard ne peuvent pas fonctionner.

Le JIT PHP est intégré en tant que partie d’Opcache. Cela permet de garder JIT séparé du moteur PHP. Le JIT se compose de trois composants : stocker, inspecter et exécuter le code avec la machine virtuelle ou directement à l’aide du code machine stocké dans le tampon.

Le tampon JIT (Buffer) est l’endroit où le code machine CPU compilé est stocké. PHP fourni des options de configuration pour contrôler la quantité de mémoire à allouer au tampon JIT. Les déclencheurs dans Opcache sont responsables de l’exécution du code machine compilé lorsqu’il rencontre une structure de code. Ces déclencheurs peuvent être une entrée d’appel de fonction, une boucle, etc.

La fonctionnalité de traçage JIT (Tracer) inspecte le code avant, après ou pendant son exécution, et détermine quel code est « chaud », c’est-à-dire quelles structures peuvent être compilées avec JIT. Le traçage peut compiler le code pendant qu’il est en cours d’exécution, lorsqu’une certaine structure de code atteint le seuil, qui est également configurable.

Configuration avancée de PHP JIT ?

La configuration de base de JIT est assez simple à mettre en place. Par défaut, le JIT est activé mais peut être désactivé en limitant la taille du tampon. Pour une configuration minimale, la taille du tampon pour JIT est définie, et JIT utilisera les valeurs par défaut sensibles.

Pour cela, vous pouvez utiliser les commandes suivantes :

opcache.enable=1
opcache.jit_buffer_size=256M

Ceci alloue 256 Mo pour le tampon JIT, et active également JIT sur les applications CLI. Il est recommandé de définir cette valeur au maximum à 10% de votre RAM actuelle. Par exemple, si vous avez 1G de mémoire RAM, une valeur de tampon JIT de 128M est une bonne valeur.

La directive opcache.jit permet de régler finement la fonctionnalité JIT.

opcache.jit=tracing

La valeur de configuration opcode.jit est quelque peu complexe. Elle accepte disable, on, off, tracing, function, et une valeur à 4 chiffres (pas un masque binaire) de 4 drapeaux différents dans l’ordre. Les options ‘disable’, ‘off’, ‘on’, ‘tracing’, et ‘function’ ont chacune leurs propres implications et configurations associées, détaillées dans la section précédente.

  • disable: Désactive complètement la fonction JIT au moment du démarrage, et ne peut pas être activée en cours d’exécution.
  • off: Désactivé, mais il est possible d’activer JIT en cours d’exécution.
  • on: Active le mode de traçage.
  • tracing: Un alias pour la configuration granulaire 1254.
  • function: Un alias pour la configuration granulaire 1205.

La configuration de PHP JIT accepte les options de traçage ou de fonction, ainsi qu’une valeur de configuration à 4 chiffres pour le paramètre opcache.jit. Ces chiffres, sous la forme CRTO, permettent d’ajuster le comportement du JIT. Par défaut, la configuration est opcache.jit=tracing. Les configurations JIT de fonction et de traçage utilisent les instructions et les allocations de registres de CPU pour maximiser les capacités du CPU.

La fonction opcache_get_configuration peut être utilisée pour déterminer le mode du JIT (traçage, fonction, etc.). La configuration de fonction compile le script entier dès que possible. C’est une approche plus audacieuse, semblable à la précharge des fichiers PHP dans Opcache avec la fonction de préchargement en PHP 7.4.

Avec le traçage activé, JIT peut être plus granulaire et choisir les segments de code à compiler dans une fonction. Les structures de bouclage et les fonctions qui sont fréquemment appelées sont des candidats idéaux.

Il existe également des directives pour déterminer après combien d’itérations une boucle, une fonction, un retour ou une sortie latérale sont considérés comme « chauds », puis compilés en JIT. Les valeurs par défaut sont probablement les plus adaptées pour la plupart des applications.

Configuration de JIT Idéale

Avoir plus de code compilé par JIT ne signifie pas nécessairement une application plus rapide (comme on peut le voir dans les benchmarks d’applications web ci-dessous). Le coût de la compilation, associé à un tampon plus petit, peut ralentir les applications en raison du temps passé sur les étapes de compilation JIT.

La valeur opcache.jit est préférable de rester inchangée (par défaut c’est le traçage) car elle offre déjà un bon équilibre entre l’utilisation du CPU, la mémoire et le suivi des structures de code qui sont compilées. Le JIT n’apportera pas d’avantages de performance significatifs pour les applications fortement liées à l’IO. La majorité des applications web d’aujourd’hui sont en fait lourdes en IO, où le JIT ne fera pas de différence, encore moins une positive. Il est important de calculer la taille du tamponPour la taille du tampon, faites attention à ne pas avoir une mémoire trop petite, ce qui peut gaspiller le code compilé par JIT et entraîner des recompilations fréquentes. Une mémoire trop grande peut aussi être exagérée. Une valeur de 50 à 100% de la mémoire partagée actuelle de l’Opcache pour Opcode pourrait être la valeur idéale pour opcache.jit_buffer_size.

Comparatif de performances avant/après JIT

Benchmark JIT et OPCache PHP 8 vs PHP 7

Comme vous pouvez le voir dans le Benchmark ci-dessous, l’apport en termes de performances, pour certaines applications PHP, est encore plus stupéfiant, lorsque PHP 8 est allié à OPCache, ainsi qu’à JIT… jusqu’à -55% de temps de chargement sur certaines applications après l’activation de JIT !

Benchmark PHP8 JIT OPCache

Ce benchmark PHP8, OPCache et JIT nous vient du site PHP.Watch.

2e benchmark de PHP JIT

benchmark de performances de php jit

Le script PHP comprend deux tests de performance, qui évaluent diverses fonctionnalités de PHP. Les fichiers micro_bench.php et bench.php ont été testés sur la branche PHP 8.0. Pour les tests, une fonction calculant le nième nombre dans la séquence de Fibonacci a été utilisée. Quatre cas ont été testés avec différentes configurations. Les résultats montrent que les meilleurs résultats sont obtenus avec le JIT de traçage.

Le JIT peut apporter un gain de performance significatif pour les applications effectuant des calculs intensifs en CPU. Cependant, son impact peut être minimal ou même négatif dans les applications où la base de données, le réseau ou l’I/O sont des goulets d’étranglement. Les deux modes JIT apportent des gains de performance substantiels, avec le mode de traçage légèrement en tête. Il est important de noter que ce test de performance ne représente guère une application PHP en temps réel.

Conclusion sur JIT

La JIT est une excellente étape pour accélérer les performances de PHP et exploiter les capacités du matériel sous-jacent. C’est le fruit de nombreuses années d’efforts, et elle montre déjà des améliorations substantielles dans les charges de travail intensivement computationnelles.

Il reste encore une marge d’amélioration pour le JIT de PHP, et il ne fera probablement que s’améliorer à partir de ce point.

Merci de votre lecture.

Sommaire de ce billet
Besoin d'aide ?

Le site WordPress speed.easyhoster.net ➚ permet de tester le potentiel des solutions d'Hébergement Web EasyHoster.