Como ver quantas alternâncias de contexto um processo faz?

25

Quero ver se meu processo faz muitas alternâncias de contexto. Também quero ver como a manipulação de grupos de tarefas afeta o número de alternâncias de contexto.

luntain
fonte
Qual SO? Qual versão? Qual kernel?
Mikel
GNU / Linux 2.6.18
luntain
5
Verifique/proc/[pid]/status
Kevin

Respostas:

30

Você pode visualizar informações sobre as mudanças de contexto do processo /proc/<pid>/status.

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

Para ver esses números atualizando continuamente, execute

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

Para obter apenas os números, execute

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

fonte
Eu tentei o comando watch acima, mas a saída é apenas 1 (para troca de contexto voluntária e involuntária). Minha versão do kernal do linux é 2.6.39-400.214.4.el6uek.x86_64. A saída depende da versão do Linux?
Andy Dufresne
Cole sua saída aqui, por favor.
É o mesmo que mencionado na resposta - "watch -n.5 grep ctxt / proc / 5647 / status"
Andy Dufresne
Eu tenho que usar procfs, mas em kernels antigos não existem valores dentro de /proc/.../status. alguma sugestão ?
Massimo
12

pidstat (1) - Relatar estatísticas para tarefas do Linux. De acordo com man pidstatisso é tão fácil quantopidstat -w …

poige
fonte
Eu executei o comando "watch -n0.5 pidstat -w -I -p 5876", mas a saída é 0 (para ambos os cswch / s nvcswch / s). Este comando funciona para a versão linux - 2.6.39-400.214.4.el6uek.x86_64?
Andy Dufresne
Este comando deve funcionar bem. Mas cuidado que você está usando errado, porque quando você não especifica intervalo do relatório “tarefas estatísticas devem ser relatados para o tempo decorrido desde a inicialização do sistema (boot).” Semelhante a vmstat, iostate outros. Portanto, se as estatísticas atuais forem necessárias, em vez de watchsimplesmente executá-las com um intervalo de um segundo.
poige
Se eu não assistir, como vejo os números sendo atualizados continuamente? Executando o comando "pidstat -w -I -p 5876 5", o comando aguarda 5 segundos e depois imprime a saída (novamente como 0). Ele não roda continuamente como eu esperava (sei que isso está em contradição com o que a página de manual do pidstat diz - linux.die.net/man/1/pidstat ). Meu sistema operacional é o Oracle Linux Server 6.4.
Andy Dufresne 21/03
O `pidstat -w -l -p SELF 1` funciona para você?
21415 poige
4

Para obter um registro de toda uma execução do processo, você pode usar o timeutilitário GNU (não confunda com o bashembutido) com a -vopção Aqui está um exemplo com linhas de saída não relacionadas removidas:

$ `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
fonte
3

Você pode usar sar -w. Por exemplo, sar -w 1 3relata o número total de alternâncias de contexto por segundo a cada 1 segundo, no total, 3 vezes.

Karen
fonte
1
Isso não funciona "pronto para uso" em muitos sistemas, mesmo que o comando esteja disponível. Você pode incluir na sua resposta como habilitar a coleta de dados sar?
Anthon
2

Escreva o seguinte script em file ( ctx.sh). com ctx.sh <core>você vai ver todos os processos em execução em um determinado núcleo e mudando interruptores nv ao contexto será destacado. Olhando para isso, você poderá identificar quais são os processos concorrentes para o núcleo.

#!/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
fonte
1

Veja man getrusage, que permitirá consultar o número de alternâncias de contexto voluntárias e involuntárias.

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 */
};

Você pode solicitar que ele relate informações por thread, como este:

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

Basta chamá-lo duas vezes, antes e depois da seção crítica e ver se o valor de use.ru_nivcsw aumentou ou não.

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