4 votes

Décrire la sortie de la commande `strace`

J'ai un processus PHP qui ne parvient pas à se terminer depuis plus de 2 jours.

root     26511  0.0  1.6 407788 27684 ?        Ss   Jul09   0:08 /usr/bin/php action.php

Voici la sortie de la commande strace :

poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 1000) = 0 (Timeout)
poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 0 (Timeout)
clock_gettime(CLOCK_MONOTONIC, {5533745, 664851437}) = 0
clock_gettime(CLOCK_MONOTONIC, {5533745, 664940247}) = 0
clock_gettime(CLOCK_MONOTONIC, {5533745, 665211013}) = 0
poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 1000) = 0 (Timeout)
poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 0 (Timeout)
clock_gettime(CLOCK_MONOTONIC, {5533746, 666594416}) = 0
clock_gettime(CLOCK_MONOTONIC, {5533746, 666684149}) = 0
clock_gettime(CLOCK_MONOTONIC, {5533746, 666772214}) = 0
poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 1000) = 0 (Timeout)
poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 0 (Timeout)
clock_gettime(CLOCK_MONOTONIC, {5533747, 668356163}) = 0
clock_gettime(CLOCK_MONOTONIC, {5533747, 668447565}) = 0
clock_gettime(CLOCK_MONOTONIC, {5533747, 668538577}) = 0

Pouvez-vous m'expliquer la signification de cette sortie ? Ou peut-être puis-je obtenir plus d'informations sur le processus en cours en utilisant une autre commande.

Version de PHP: PHP 5.4.30 CentOS version 6.5

0 votes

Vous pourriez trouver ltrace plus utile - il trace les bibliothèques plutôt que les appels système, vous donnant un aperçu de plus haut niveau de ce qui se passe.

0 votes

@Flup Il y a une sortie vide de ltrace, y a-t-il une utilisation spécifique ? Je n'utilise que ltrace -p 12345

0 votes

@thanasisk oui, en exécutant ltrace en tant que root

11voto

snowdude Points 2790

La commande strace liste les appels système que l'application effectue pendant son exécution.

Si vous n'êtes pas développeur : La Section 2 du manuel système documente les appels système pour vous aider à comprendre ce qui se passe.

man 2 poll

DESCRIPTION
   poll()  effectue une tâche similaire à select(2) : il attend qu'un des descripteurs de fichier d'un ensemble
   devienne prêt à effectuer une entrée/sortie.

Les événements demandés dans l'appel système poll sont tous liés à la lecture sur le descripteur de fichier 7, encore une fois d'après la page de manuel les événements demandés par votre application sont:

POLLIN     Des données sont disponibles à lire.
POLLPRI    Des données urgentes sont disponibles à lire. 
POLLRDNORM Équivalent à POLLIN.
POLLRDBAND Des données de bande de priorité peuvent être lues (généralement non utilisé sous Linux).

Les lignes de strace montrent que l'action poll prend du temps, le descripteur de fichier (#7) ne devient pas prêt pour une entrée/sortie en lecture.

L'appel système clock_gettime() - fonctions d'horloge et de temps indique qu'il faut attendre un peu puis réessayer.

Pour savoir quel fichier provoque le délai, il devrait y avoir un lien symbolique avec le numéro 7, l'entier représentant le fichier dans /proc//fd/7

0 votes

Il y a une prise comme un lien symbolique sur fd/4 -> socket:[6249981] (lien symbolique cassé). Comment puis-je continuer le débogage? @HBruijn

1 votes

Sans une compréhension approfondie du comportement attendu (dans ce cas : la lecture du script PHP), ce ne serait que du travail de devinettes.

0 votes

Essayez 'lsof -p | grep 6249981'. Vous trouverez probablement qu'il s'agit d'une connexion tcp ou similaire.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X