J'ai quelques processus qui consomment beaucoup de temps CPU système (comme déterminé en regardant vmstat). Existe-t-il un moyen simple de savoir quel type d'appels système sont effectués?
Je sais qu'il y a du strace, mais existe-t-il un moyen plus rapide et plus facile? Existe-t-il quelque chose comme un "top" pour les appels système?
linux
performance
monitoring
central-processing-unit
strace
bajafresh4life
la source
la source
Réponses:
Je pense que la confrontation avec le
-c
drapeau est probablement la plus proche que je connaisse. Si vous n'avez pas utilisé le-c
drapeau, essayez ceci:Où 12345 est l'ID de processus (PID) du processus en question. Notez que le stracing d'un processus ajoute une surcharge supplémentaire, donc pendant que vous le tracez, le processus s'exécutera plus lentement.
Après avoir exécuté cela pendant aussi longtemps que vous souhaitez collecter des données, appuyez sur
Ctrl-C
pour arrêter votre collecte de données et produire les résultats. Cela produira quelque chose comme ceci:Comme vous pouvez le voir, il s'agit d'une ventilation de tous les appels système effectués par l'application, triée par durée totale et comprenant la durée moyenne par appel et le nombre d'appels pour chaque appel système. Si vous souhaitez les trier différemment, consultez la page de manuel pour strace, car il existe deux options.
la source
Essayez peut-être l'un des profileurs d'échantillonnage, comme oprofile, ou pour les noyaux plus récents, perf. Si vous avez de la chance, "perf top" pourrait vous dire précisément ce que vous voulez. Voir ici pour quelques exemples
la source
Le type de commutateurs strace que j'ai tendance à utiliser est le suivant.
strace -ffttT -p pid -o /tmp/strace.out
Un exemple de cela ressemblerait,
Vous voyez le décalage horaire sur le côté droit de l'appel système indiquant le temps qu'il a fallu pour passer d'un appel système à un autre.
Il vous rattrapera le décalage horaire entre les appels système. Ainsi, lorsque vous voyez qu'un appel système a un écart de quelques secondes avec le prochain appel système, il fait du bruit.
Une autre méthode consiste à le coredump avec gcore. Cependant, cela nécessite un peu d'expérience pour naviguer dans gdb.
Mais, si le thread est un thread du noyau, vous ne pouvez pas l'étirer ou le vider. Dans ce cas, nous devons utiliser quelque chose de plus complexe. Dans le noyau RHEL5, nous utilisons oprofile. Dans RHEL6, nous utilisons perf. Je préfère la perf à l'oprofile. Les données Perf peuvent être collectées avec un format de type graphique montrant l'appel système où le pourcentage maximum de CPU est utilisé.
Avec un test de perf, je vois ça.
Il montre la fonction du noyau où 38% du temps CPU est dépensé. Maintenant, nous pouvons vérifier la fonction et voir ce qu'elle fait et ce qu'elle est censée faire.
Avec quelques exemples, ce n'est pas si difficile.
la source