Compreendendo o switch e as alternâncias de contexto do Linux Perf

1

Estou tentando habilitar eventos de mudança de contexto no perf e usar o despejo do script do perf do perf.data para investigar o tempo bloqueado do thread.

Até o momento, as únicas duas opções de gravação que parecem ser úteis são a alternância de contexto e todos os eventos sched.

Aqui está o comando que estou executando no perf:

perf record -g -a -F 999 -e cpu-clock,sched:sched_stat_sleep,sched:sched_switch,sched:sched_process_exit,context-switches

No entanto, ambos parecem estar incompletos, geralmente um evento sched_switch se parece com algo assim:

comm1   0/0     [000] 0.0:          1 sched:sched_switch: prev_comm=comm1 prev_pid=0 prev_prio=0 prev_state=S ==> next_comm=comm2 next_pid=1 next_prio=1
    stacktrace...

Pelo que entendi, o prev_comm é sempre o thread que será bloqueado e o next_comm é o thread que será desbloqueado. Será esta uma suposição correta? Se estiver, não consigo obter dados completos sobre os eventos, pois há muitos segmentos bloqueados no prev_comm, mas nunca parecem obter um next_comm correspondente.

A ativação de opções de contexto não parece fazer muito, pois não há informações sobre o bloqueio ou desbloqueio do thread (a menos que eu esteja completamente ausente de algo, no qual gostaria de receber uma explicação sobre como elas funcionam).

Veja como um evento típico de mudança de contexto se parece:

comm1   0/0     [000] 0.0:          1 context-switch:
    stacktrace...

tl; dr, como posso fazer investigações de tempo bloqueado no linux através da saída do script perf e quais opções precisam ser ativadas no registro do perf?

Obrigado.

    
por user6256 03.02.2016 / 23:17

1 resposta

1

Eu sei que essa pergunta é bem antiga (16 de fevereiro), mas aqui há uma resposta caso isso ajude alguém. O problema é que você digitou '-F 999' indicando que deseja amostrar os eventos com uma frequência de 999 vezes por segundo. Para eventos 'trace', você geralmente não quer fazer amostragem. Por exemplo, quando seleciono sched: sched_switch, quero ver todas as alternâncias de contexto. Se você inserir -F 999, receberá uma amostra dos interruptores de contexto ... Se você olhar para a saída do seu 'perf record' cmd com algo como:

perf script --verbose -I --header -i perf.dat -F comm,pid,tid,cpu,time,period,event,trace,ip,sym,dso > perf.txt

você veria que o "período" (o número entre o registro de data e hora e o nome do evento) não seria (geralmente) == 1.

Se você usar um cmd de 'perf record' como abaixo, você verá um período de 1 na saída 'perf script' como:

Binder:695_5   695/2077  [000] 16231.700440:          1         sched:sched_switch: prev_comm=Binder:695_5 prev_pid=2077 prev_prio=120 prev_state=S ==> next_comm=kworker/u16:17 next_pid=7665 next_prio=120

Uma explicação longa, mas basicamente: não faça isso (onde 'isso' é '-F 999').

Se você acabou de fazer algo como:

perf record -a -g -e sched:sched_switch -e sched:sched_blocked_reason -e sched:sched_stat_sleep -e sched:sched_stat_wait sleep 5

então a saída mostraria cada mudança de contexto com a pilha de chamadas para cada evento. E você pode precisar fazer:

echo 1 > /proc/sys/kernel/sched_schedstats

para obter os eventos sched_stat.

    
por 26.11.2017 / 04:27