Pourquoi «strace» ne montre-t-il pas que ce processus attend quelque chose?

11

Le puissant stracem'a laissé tomber. Comment est-ce possible?


time foomontre que l' fooexécution prend plusieurs secondes ("réel"), mais utilise un temps processeur négligeable, à la fois dans l'espace utilisateur ("utilisateur") et dans le noyau ("sys"). Pour les curieux, fooest défini ci-dessous.

Il passe donc la plupart de son temps à attendre autre chose, à ne pas exécuter d'instructions CPU. Normalement, je peux voir comment il attend strace- c'est- à -dire quel appel système bloque pendant une longue période. Malheureusement, cette approche n'a pas fonctionné.

strace -ttt -T -C -w fooaffiche les appels système, horodatés et un résumé du temps (réel) passé dans les appels système. Mais ce processus particulier s'est révélé comme un temps global (réel) négligeable à l'intérieur des appels système.


fooest en fait journalctl -b -u dev-hugepages.mount. Sauf que j'ai dû changer le dernier argument en une unité systemd différente à chaque fois afin de reproduire cela. En d'autres termes, le délai sur lequel j'étudie s'est produit la première fois que j'essaie d'obtenir les journaux d'une unité systemd. EDIT : après avoir répondu à la question principale, j'ai également réalisé la raison pour laquelle j'avais ce problème pour reproduire le retard .

Le temps passé par ce processus est un problème spécifique, apparemment il ne se produit pas sur tous les systèmes. https://github.com/systemd/systemd/issues/7963

sourcejedi
la source
Hmm ... puisque votre programme "foo" n'est pas seulement un processus simple à processus unique et à thread unique, vous seriez mieux servi en disant à strace de suivre et d'attacher aux fourches. '-ff' est votre ami! :) Vous voudrez également, ensuite, utiliser "-o / dev / shm / strace-foo" pour regrouper tous ces fichiers de sortie de processus en un seul endroit. Juste une suggestion.
Jesse Adelman
@JesseAdelman Je pense qu'il journalctlexécute un seul processus. J'ai le sentiment d' journalctlutiliser un thread supplémentaire pour une raison quelconque - iirc il y a eu un appel clone (). Je pense que cela signifie que vous êtes techniquement correct, mais cela n'a pas non plus de pertinence technique pour la question. timeexamine le processus dans son ensemble et a montré que le processus dans son ensemble est plutôt somnolent (bloquant quelque chose). stracen'a pas montré suffisamment de sommeil. Peu importe si un deuxième thread est en sommeil, le thread principal doit également être très endormi pour expliquer le timerésultat.
sourcejedi

Réponses:

18

La raison habituelle de ce problème est que le processus bloque les erreurs de page. Ce sont des lectures ou éventuellement des écritures effectuées sur des fichiers via un mappage de mémoire aka mmap(). Vous en avez peut-être remarqué mmap()dans la trace des appels système.

Si vous aviez utilisé le /usr/bin/timeprogramme au lieu du timeshell intégré, vous avez peut-être également remarqué:

0.04user 0.10system 0:02.29elapsed 6%CPU (0avgtext+0avgdata 40464maxresident)k
73632inputs+0outputs (376major+1081minor)pagefaults 0swaps

majorles défauts de page sont ceux qui nécessitent des E / S de système de fichiers. minorles défauts de page sont beaucoup moins significatifs (probablement seulement un "échec TLB").

Je suppose que inputsc'est le nombre total de pages lues. Actuellement, je pense que les pages mappées sont toujours de la même taille. 4096 octets dans la plupart des cas, mais vous pouvez vérifier getconf PAGESIZE.

Cela représente donc ~ 290 mégaoctets, lus à plus de 100 mégaoctets par seconde, une vitesse standard pour un disque dur comme le mien. Mystère résolu!


Notez également que vous supposez que vous disposez d'un processeur entièrement libre pour ce processus. Sinon, le processus pourrait simplement être bloqué en attendant que d'autres processus produisent le CPU.

stracene s'affiche que lorsque le processus entre (puis quitte) le noyau en raison d'un appel système. Ou lorsqu'un signal Unix est délivré. Cependant, il existe d'autres types d'interruptions qui stracene s'affichent pas du tout. Donc, cela inclut

  • Défauts de page.
  • La minuterie s'interrompt. Ceci est utilisé pour basculer vers un processus différent, lorsque celui en cours a épuisé sa tranche de temps allouée sur le CPU.
sourcejedi
la source
1
Bonne réponse, félicitations! Il est en effet important de comprendre les limites des outils que l'on utilise. +1; J'aime aussi ces sujets: unix.stackexchange.com/questions/418354/… et unix.stackexchange.com/questions/419697/…
Rui F Ribeiro