Le puissant strace
m'a laissé tomber. Comment est-ce possible?
time foo
montre que l' foo
exé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, foo
est 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 foo
affiche 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.
foo
est 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
la source
journalctl
exécute un seul processus. J'ai le sentiment d'journalctl
utiliser 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.time
examine le processus dans son ensemble et a montré que le processus dans son ensemble est plutôt somnolent (bloquant quelque chose).strace
n'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 letime
résultat.Réponses:
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/time
programme au lieu dutime
shell intégré, vous avez peut-être également remarqué:major
les défauts de page sont ceux qui nécessitent des E / S de système de fichiers.minor
les défauts de page sont beaucoup moins significatifs (probablement seulement un "échec TLB").Je suppose que
inputs
c'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érifiergetconf 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.
strace
ne 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 quistrace
ne s'affichent pas du tout. Donc, cela inclutla source