Opcache : test brutal

Soumis par drupal_admin le mar 26/03/2019 - 19:45

Le premier test consiste à utiliser le cache d'opcode de PHP (Opcache), je n'avais pas réussi à le faire fonctionner de manière stable en PHP <= 7.0, voyons comment PHP7.3 se comporte.
Opcache comporte énormément de paramètres (plus de 30 !), c'est presque une usine à gaz à lui tout seul. Le manuel (http://php.net/manual/en/book.opcache.php) est bien fait mais extrêmement volumineux, mais fournit un modèle "recommandé" :

opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.enable_cli=1             # inutile ici

Il est possible d'invalider la sauvegarde des commentaires "opcache.save_comments=0" et d'activer "opcache.enable_file_override" afin d'améliorer  (très peu) les performances mais si votre site utilise les "Annotations" de PHP il est impératif d'autoriser la sauvegarde des commentaires ("opcache_save_comments=1") car les annotations sont contenues dans les commentaires..... je suis tombé dans ce piège !
Il semble conseillé d'utiliser le chemin complet de la librairie, pour moi : "/usr/lib/php/20180731/opcache.so". Un répertoire "daté" me semble un truc à surveiller ?
Il semble par ailleurs intéressant (au moins au début des tests) de positionner :

"opcache.log_verbosity_level" au maximum (3 ou 4) pour les tests.
"opcache.file_update_protection" à 2 pour du développement et à 0 pour de la production.
"opcache.huge_code_pages" à 0 si vous n'avez pas de "huge pages", à 1 sinon cela est censé améliorer les performances.
"opcache.lockfile_path" peut être positionné dans /tmp.
"opcache.file_cache" permet d'installer un cache sur disque, il faut dans ce cas lui donner le nom d'un répertoire à écriture autorisée pour l'utilisateur Apache, mais je n'ai pas encore réussi à faire fonctionner cette fichue option !
"opcache.file_cache_only" permet d'utiliser (0) la mémoire partagée pour le cache,(1) n'utilise que le cache disque, cela peut être utile pour des machines avec peu de mémoire.
"opcache.preload" permet de charger un script au démarrage du serveur, si ce script "include" d'autres scripts ceuc-ci seront aussi compilés au départ.
Je vais donc essayer avec :

opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.save_comments=0
opcache.log_verbosity_level=3
opcache.file_update_protection=0
opcache.lockfile_path="/tmp"

On verra plus tard pour utiliser le cache disque.
Premier test : cache en mémoire partagée seul.
Ce test ne réalise que l'accès "brut" aux URL du site, il est effectué sur les 419 pages du site de test. Afin de limiter l'influence des Entrées/sorties les tests ont été effectués plusieurs fois et seuls le dernier résultat de chaque série a été pris en compte.
Deux séries de test ont été effectuées :
1) Délai entre accès de 500 millisecondes.
- Sans cache : on atteint une charge CPU d'environ <10%.
- Avec cache : on atteint une charge CPU d'environ <5%% (peu visible !).
2) Délai entre accès de 50 millisecondes
- Sans cache : charge CPU #40%
- Avec cache : charge CPU #20%
(somme des temps de réponse en secondes) :
        Sans           Avec          DELTA       Gain %       
1) 16,216021    7,682984    8,533037    52,62 %
2) 17,812893    9,082634    8,730259    49,01 %
Le gain de temps de #50% est très significatif. Le graphique suivant montre bien le temps de réponse avec cache (en rouge) et sans cache (en bleu), la surface en rouge est bien plus petite que celle en bleu.
Graphique "radar" des performances relatives

A suivre tests plus réalistes avec accès plus proche de la réalité (chargement javascripts, css, images) à l'aide de Selenium et Katalon.

taxonomie