Como ver quantas mudanças de contexto um processo faz?

21

Eu quero ver se o meu processo faz muitos switches de contexto. Também quero ver como a manipulação de grupos de tarefas afeta o número de opções de contexto.

    
por luntain 25.05.2012 / 17:58

7 respostas

26

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

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

Para ver esses números sendo atualizados 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 }'
    
por 25.07.2013 / 03:34
9

pidstat (1) - Relatório de estatísticas para tarefas do Linux. De acordo com man pidstat , é tão fácil quanto apenas pidstat -w …

    
por 26.05.2012 / 09:10
4

Para obter um registro de todo o processo, você pode usar o utilitário GNU time (não confunda com o bash builtin) com a opção -v . Veja 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
    
por 22.06.2014 / 06:04
3

Você pode usar sar -w . Por exemplo, sar -w 1 3 , relata o total de trocas de contexto por segundo para cada 1 segundo num total de 3 vezes.

    
por 02.05.2016 / 06:16
2

Escreva o seguinte script no arquivo ( ctx.sh ). com ctx.sh <core> , você verá todos os processos em execução em um determinado núcleo e as mudanças dos comutadores nv-context serão destacadas. Olhando para isso, você será capaz de 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
    
por 05.12.2014 / 03:53
1

Veja man getrusage , que permite consultar o número de interruptores de contexto voluntários e involuntários.

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 informar para relatar informações por thread, assim:

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

Basta ligar duas vezes, antes e depois da seção crítica, e ver se o valor usage.ru_nivcsw aumentou ou não.

    
por 28.10.2017 / 05:47
0
sudo perf stat -e context-switches -I 1000 PROCESS_NAME
    
por 27.08.2018 / 12:21