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