Registre o tempo de cada processo ou troca de contexto de thread

Registre o tempo de cada processo ou troca de contexto de thread

Estou tentando chegar o mais próximo possível do processamento em tempo real com uma distribuição Raspbian em um Raspberry Pi para manipular seus pinos GPIO. Quero ter uma “sensação” do tipo de desempenho que posso esperar.

Eu faria isso escrevendo um programa C simples que alterna um pino repetidamente o mais rápido possível e monitorando-o com um analisador lógico.

Mas talvez haja outra maneira, escrevendo o programa acima, mas simplesmente registrando as mudanças de contexto para ver exatamente quando esse thread/processo tem controle sobre um período de amostra de, digamos, alguns segundos.

Esta pergunta anteriorresponde como ver quantas trocas de contexto são feitas em algum período de tempo para um determinado processo, mas existe uma maneira de registrar o tempo preciso das trocas, e talvez para cada processo, não apenas um? Obviamente, isso criaria sobrecarga, mas ainda poderia ser útil. Obviamente, os dados devem ser armazenados na RAM para minimizar a sobrecarga

Nota para mim mesmo: possíveis soluções:

  • Comando para listar em tempo real todas as ações de um processo
  • Hacky: faça com que o programa obtenha e armazene repetidamente a hora atual (e salve-o em um arquivo quando o log atingir um determinado limite). Ou, uma ligeira melhoria para evitar logs enormes: use um algoritmo que elimine tempos consecutivos se eles estiverem próximos o suficiente para deduzir que não foram antecipados por algum outro processo.

Responder1

Não tenho uma resposta, mas você pode encontrar uma entre asferramentas, exemplos e recursosescrito ou listado por Brendan Gregg no perfcomando e kernel Linux ftrace e debugfs.

No meu Raspberry Pi essas ferramentas estavam no pacote perf-tools-unstable. O perfcomando estava realmente em /usr/bin/perf_3.16.


De interesse pode ser issodiscussãoe mudança de contextoreferênciapor Benoit Sigoure, e olat_ctxteste do bastante antigobancosuíte.

Eles podem precisar de algum trabalho para rodar no Pi, por exemplo, editei tsuna/contextswitche removi do .timectxswws.c get_iterations()while (iterations * ws_pages * 4096UL < 4294967295UL) {-march=native -mno-avxMakefile


Usando perf recordpor 10 segundos no Pi sobre ssh enquanto faz simultaneamente while sleep .1;do echo hi;doneem outro ssh:

sudo timeout -10 perf_3.16 record -e context-switches -a
sudo perf_3.16 script -f time,pid,comm | less

dá saída como esta

           sleep 29341 2703976.560357: 
         swapper     0 2703976.562160: 
    kworker/u8:2 29163 2703976.564901: 
         swapper     0 2703976.565737: 
            echo 29342 2703976.565768: 
     migration/3    19 2703976.567549: 
           sleep 29343 2703976.570212: 
     kworker/0:0 28906 2703976.588613: 
     rcu_preempt     7 2703976.609261: 
           sleep 29343 2703976.670674: 
            bash 29066 2703976.671654: 
            echo 29344 2703976.675065: 
            sshd 29065 2703976.675454: 
         swapper     0 2703976.677757: 

presumivelmente mostrando quando ocorreu um evento de troca de contexto, para qual processo.

informação relacionada