Le contexte et le problème

Depuis quelques semaines, j’ai observé des pics de consommation mémoire sur le site d’un client. Ils avaient lieu de manière pseudo-aléatoire principalement pendant la même période de la journée, une grosse fenêtre de 12h.
Le site est codé en PHP/MySQL coté serveur, il comporte le site lui-même, une zone d’administration et un blog WordPress.

Voici ce que cela donnait en forme de graphique sur cPanel.
Graphique cPanel montrant les pics de consommation mémoire

Spoiler: Si vous ne souhaitez pas lire tout l’article, le problème venait de ModSecurity, une fois désactivé, tout était réglé.

La résolution, pas à pas

Au vu du spoiler ci-dessus, je vous conseille de commencer par la fin mais c’est peut-être le bon moment pour améliorer votre site en général.

Vérification des logs

Bien entendu on commence par là dans ce genre de situation, j’ai essayé de trouver ce qui pouvait causer ces pics en regardant les accès au site à ces moments précis afin de définir la page qui les cause. La seule certitude que j’ai eu est que tout augmentation du trafic, même relativement faible, causait un pic d’utilisation mémoire.

PHP code review

L’étape suivante a été de revisiter le code, de le mettre à jour pour suivre les recommandations plus récentes et également de mettre à jour certaines librairies qui ne l’étaient pas. Comme ce problème touche la consommation mémoire, je me suis assuré que toutes les variables de taille conséquente étaient vidées au cas où cela aurait été du à un problème au niveau du récupérateur de mémoire (Garbage Collector). En PHP, la meilleure façon de faire cela semble être d’affecter la valeur d’une variable ou d’une propriété à null:


$data = array(...);
// Faire quelque chose avec $data
$data = null;

Sécurité

Ensuite, je me suis penché sur la sécurité, j’ai optimisé le code à certains endroits et installé CIDRAM qui est parfait en première barrière contre les menaces potentielles.
Si vous le souhaitez, vous pouvez le coupler à Anti-Hammer contre les bots et les spammeurs qui martèlent votre site.
C’était une très bonne chose mais cela n’a toujours pas réglé notre problème et les pics de consommation mémoire aléatoires ont continué.

Blog

Vu que les pages du blog apparaissaient sourvent dans les logs autour des pics et bien que le blog ne semble pas être la source du bug, cela semblait quand-même bon de jeter un coups d’oeil.
J’ai installé Query Monitor, c’est un plugin WordPress très efficace pour voir ce qui ne va pas si votre site est lent, je le recommande fortement. J’ai aussi installé WP Super Cache pour réduire la charge en général et limiter le nombres de requêtes à la base de données, c’est bénéfique « généralement » mais n’a malheureusement pas résolu notre problème. J’ai donc désactivé toutes les extensions et activé le thème par défaut Twenty Seventeen … Toujours pareil. Afin de rayer le blog définitivement de notre liste, on l’a même fermé pendant 24h, toujours pareil. 🙁

Mise en cache

J’ai ensuite ajouté un nouveau niveau de cache, à l’ancienne, en utilisant le tampon de sortie, sauvegardant la page et en renvoyant seulement la copie statique pour les requêtes suivantes.
En complément ou alternativement, j’ai aussi utilisé une librairie plus évoluée, PhpFastCache qui est très utile. Toujours pas de changement… 🙁

MySQL

J’ai vérifié les requêtes et leur temps d’exécution, tout était normal, je suis donc passé de MySQLi à PDO au cas où… Et, vous l’avez deviné, toujours pareil.

Résolution

Finalement, de manière assez fébrile vu que je commençais à sérieusement manquer d’options, j’ai désactivé toutes les mises en cache et comme cela n’a pas fait grand chose, j’ai désactivé ModSecurity, et là miracle, plus aucun pic !

Comme vous pouvez le voir ci-dessous, on est retourné à une utilisation plus normale de la mémoire une fois le dernier pic passé, ce dernier s’est produit une heure à peine après avoir ré-activé ModSecurity.
Usage mémoire sur cPanel après le dernier pic

J’espère que cet article vous aidera si vous vous trouvez dans la même situstion, je suis content que ce soit en état de marche de notre coté, en espérant que l’hébergeur puisse paramétrer MondSecurity afin que l’on puisse l’activer de nouveau… Mon seul regret, j’aurais aimé commencer par là vu le temps que cela m’a pris. 🙂


Photo Credit

Sai Kiran Anagani