Comment voir combien de changements de contexte un processus fait?

25

Je veux voir si mon processus fait beaucoup de changements de contexte. Je veux également voir comment la manipulation des groupes de tâches affecte le nombre de changements de contexte.

luntain
la source
Quel OS? Quelle version? Quel noyau?
Mikel
GNU / Linux 2.6.18
luntain
5
Chèque/proc/[pid]/status
Kevin

Réponses:

30

Vous pouvez afficher des informations sur les changements de contexte de votre processus dans /proc/<pid>/status.

$ pid=307
$ grep ctxt /proc/$pid/status
voluntary_ctxt_switches:        41
nonvoluntary_ctxt_switches:     16

Pour voir ces chiffres se mettre à jour en continu, exécutez

$ # Update twice a second.
$ watch -n.5 grep ctxt /proc/$pid/status

Pour obtenir uniquement les chiffres, exécutez

$ grep ctxt /proc/$pid/status | awk '{ print $2 }'

la source
J'ai essayé la commande watch ci-dessus mais la sortie est juste 1 (pour le changement de contexte volontaire et involontaire). Ma version Linux noyau est 2.6.39-400.214.4.el6uek.x86_64. La sortie dépend-elle de la version linux?
Andy Dufresne
Collez votre sortie ici s'il vous plaît.
C'est le même que celui mentionné dans la réponse - "watch -n.5 grep ctxt / proc / 5647 / status"
Andy Dufresne
Je dois utiliser procfs mais sur les anciens noyaux, il n'y a pas de valeurs dans /proc/.../status. toute suggestion ?
Massimo
12

pidstat (1) - Rapporte les statistiques des tâches Linux. Selon man pidstatc'est si facile que justepidstat -w …

poige
la source
J'ai exécuté la commande "watch -n0.5 pidstat -w -I -p 5876" mais la sortie est 0 (pour les deux cswch / s nvcswch / s). Cette commande fonctionne-t-elle pour la version linux - 2.6.39-400.214.4.el6uek.x86_64?
Andy Dufresne
Cette commande devrait très bien fonctionner. Mais méfiez - vous que vous utilisez mal parce que quand vous ne spécifiez pas l' intervalle de rapport « statistiques des tâches doivent être rapportées pour le temps écoulé depuis le démarrage du système (démarrage). » Semblable à vmstat, iostatet d' autres. Donc, si des statistiques actuelles sont nécessaires au lieu de watchsimplement les exécuter avec un intervalle d'une seconde.
poige
Si je ne regarde pas, comment puis-je voir les numéros se mettre à jour en continu? En exécutant la commande "pidstat -w -I -p 5876 5", la commande attend juste 5 secondes, puis imprime la sortie (à nouveau sous la forme 0). Il ne fonctionne pas en continu comme je m'y attendais (je sais que cela contredit ce que dit la page de manuel de pidstat - linux.die.net/man/1/pidstat ). Mon système d'exploitation est Oracle Linux Server 6.4.
Andy Dufresne
`Pidstat -w -l -p SELF 1` fonctionne-t-il pour vous?
poige
4

Pour obtenir un enregistrement de l'exécution d'un processus entier, vous pouvez utiliser l' timeutilitaire GNU (ne le confondez pas avec le programme bashintégré) avec l' -voption. Voici un exemple avec des lignes de sortie non liées supprimées:

$ `which time` -v ls
a.out  exception_finder.cpp  log.txt
    Command being timed: "ls"
               ...
    Voluntary context switches: 1
    Involuntary context switches: 2
               ...
    Exit status: 0
rsaxvc
la source
3

Vous pouvez utiliser sar -w,. Par exemple, sar -w 1 3signale un nombre total de changements de contexte par seconde pour chaque 1 seconde au total 3 fois.

Karen
la source
1
Cela ne fonctionne pas "prêt à l'emploi" sur de nombreux systèmes, même si la commande est disponible. Pouvez-vous inclure dans votre réponse comment activer la collecte de données sar?
Anthon
2

Écrivez le script suivant dans file ( ctx.sh). avec ctx.sh <core>vous verrez tous les processus en cours d'exécution sur un noyau donné et la modification des commutateurs de contexte nv sera mise en évidence. En regardant cela, vous serez en mesure d'identifier quels sont les processus concurrents pour le noyau.

#!/bin/bash

if [[ $# -eq 0 ]]
then
   echo "Usage:"
   echo "$0 <core>"
   exit 1
fi

if [[ -z $2 ]]
then
   watch -d -n .2 $0 $1 nw
fi

ps -Leo lastcpu:1,tid,comm | grep "^$1 " | awk '{printf $3": ";system("cut -d\" \" -f3  /proc/"$2"/task/"$2"/schedstat 2>/dev/null")}' | sort -k 1 | column -t
Mahendra
la source
1

Voir man getrusage qui vous permettra d'interroger le nombre de changements de contexte volontaires et involontaires.

struct rusage {
           struct timeval ru_utime; /* user CPU time used */
           struct timeval ru_stime; /* system CPU time used */
           long   ru_maxrss;        /* maximum resident set size */
           long   ru_ixrss;         /* integral shared memory size */
           long   ru_idrss;         /* integral unshared data size */
           long   ru_isrss;         /* integral unshared stack size */
           long   ru_minflt;        /* page reclaims (soft page faults) */
           long   ru_majflt;        /* page faults (hard page faults) */
           long   ru_nswap;         /* swaps */
           long   ru_inblock;       /* block input operations */
           long   ru_oublock;       /* block output operations */
           long   ru_msgsnd;        /* IPC messages sent */
           long   ru_msgrcv;        /* IPC messages received */
           long   ru_nsignals;      /* signals received */
           long   ru_nvcsw;         /* voluntary context switches */
           long   ru_nivcsw;        /* involuntary context switches */
};

Vous pouvez lui indiquer de rapporter des informations par thread, comme ceci:

struct rusage usage;
getrusage( RUSAGE_THREAD, &usage );

Appelez-le simplement deux fois, avant et après votre section critique, et voyez si la valeur usage.ru_nivcsw a augmenté ou non.

Bram
la source
0
sudo perf stat -e context-switches -I 1000 PROCESS_NAME
Nadav B
la source