Aller au contenu
Retour au blog
DevOps
7 janvier 202615 min

Strace et PHP

Quand un script PHP est lent, on pense souvent direct au code applicatif, à MySQL, au cache, etc. Mais parfois, le souci est plus bas niveau : DNS qui traîne, disque qui mouline, appels réseau bloquants, ou un sleep oublié.

strace est l'outil parfait pour ça : il te montre les appels système (syscalls) que ton process fait au noyau Linux.

Pré-requis

Article réservé aux curieux ayant déjà l'habitude de gérer des stacks LAMP.

Notions à connaître

C'est quoi un syscall ?

Un syscall (appel système), c'est quand ton programme demande au noyau de faire un truc qu'il ne peut pas faire tout seul. Exemples : ouvrir un fichier (openat()), lire/écrire (read(), write()), parler au réseau (connect(), sendto()), attendre (nanosleep()).

Unix : "everything is a file"

Sur Unix, plein de choses se manipulent comme des fichiers : fichiers disque, sockets réseau, pipes, stdout/stderr. Un file descriptor (FD) est juste un petit entier qui représente un truc ouvert.

Strace : c'est quoi exactement ?

strace colle un micro sur un process et log chaque syscall, ses arguments, sa valeur de retour et le temps passé dedans.

Déterminer les lenteurs d'un script PHP

Options principales : -f (suit les forks), -ff (un fichier par PID), -tt (timestamp précis), -T (durée du syscall), -yyy (infos humaines sur les FDs).

Sur une prod comment je fais ?

Technique 1 : pool FPM dédié "trace" + routage par IP

Créer un pool FPM identique sur un autre socket, forcer vos requêtes depuis votre IP à passer dessus, et stracer uniquement ce pool.

Technique 2 : simuler avec php-cgi

Exécuter le code comme si Apache le lançait, en contrôlant les variables d'environnement (HTTP_HOST, REQUEST_URI, HTTP_COOKIE, etc.).

Technique 3 : simuler avec le CLI via auto_prepend_file

Prepend un fichier qui construit $_SERVER, $_COOKIE, etc. pour simuler un environnement web.

Mini checklist : que chercher dans les logs ?

Réseau : connect() lent, sendto()/recvfrom() vers port 53 (DNS). Disque : openat(), read(), write() qui prennent du temps. Process externes : execve(). Mémoire : mmap()/munmap() en rafale.

Besoin d'un accompagnement cloud ?

Nos experts sont à votre disposition pour vous aider à choisir la meilleure solution.

Nous contacter