Pergunta

Existe uma maneira de ver quantas mudanças de contexto cada thread gera? (Tanto dentro como fora, se possível) Ou em X / s, ou para deixá-lo correr e dar dados agregados depois de algum tempo. (Seja em Linux ou Windows)

Eu encontrei apenas ferramentas que dão agregados número de comutação de contexto para OS inteiros ou por processo.

O meu programa faz muitas trocas de contexto (50k / s), provavelmente um monte não é necessário, mas não tenho certeza por onde começar a otimizar, onde é que a maioria daqueles acontecer.

Foi útil?

Solução

Em sistemas recentes GNU / Linux, você pode usar o SystemTap para coletar os dados que você quer em cada chamada para sched_switch (). O exemplo schedtimes.stp é provavelmente um bom começo: http://sourceware.org /systemtap/examples/keyword-index.html#SCHEDULER

Outras dicas

Linux

Eu escrevi um pequeno script para ver os detalhes de um segmento específico do processo. Ao executar este script você pode ver mudança de contexto também.

if [ "$#" -ne 2 ]; then
    echo "INVALID ARGUMENT ERROR: Please use ./see_thread.sh processName threadNumber"
    exit
fi
ls /proc/`pgrep $1`/task | head -n$2 | tail -n+$2>temp
cat /proc/`pgrep $1`/task/`cat temp`/sched

Esperamos que isto ajude.

Eu tenho um script que calcula contexto voluntária e não-voluntária muda feita por um fio, durante um período de tempo específico. Eu não tenho certeza se isso vai servir o seu propósito, mas eu vou postá-lo de qualquer maneira.

Este script é looping sobre os tópicos de um processo e gravação "voluntary_ctxt_switches" & "nonvoluntary_ctxt_switches" de /proc/< process-id>/task/< thread-id>/status. O que eu faço geralmente é gravar estes contadores no início de uma corrida desempenho e gravar novamente no final da corrida e depois diferença calcular como CTX total de vol & non-vol muda durante a execução de desempenho.

pid=`ps -ef | grep <process name> | grep $USER | grep -v grep | awk '{print $2}'`
echo "ThreadId;Vol_Ctx_Switch;Invol_Ctx_Switch"
for tid in `ps -L --pid ${pid}  | awk '{print $2}'`
do
    if [ -f /proc/$pid/task/$tid/status ]
    then
        vol=`cat /proc/$pid/task/$tid/status | grep voluntary_ctxt_switches | grep -v nonvoluntary_ctxt_switches | awk '{print $NF}'`
        non_vol=`cat /proc/$pid/task/$tid/status | grep nonvoluntary_ctxt_switches | awk '{print $NF}'`
    fi
    echo "$tid;$vol;$non_vol"
done

Script é um pouco pesado, no meu processo caso tem cerca de 2500 tópicos. O tempo total para interruptores CTX a cobrar é de cerca de 10 segundos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top