Tempo de gravação de cada processo ou interruptor de contexto de encadeamento

3

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. Eu quero ter uma "sensação" para o tipo de performance que posso esperar.

Eu ia fazer isso escrevendo um programa C simples que alterna um pino repetidamente o mais rápido possível, e o monitora com um analisador lógico.

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

Esta pergunta anterior responde como ver quantas opções de contexto são feitas em algum período de tempo para um determinado processo, mas existe uma maneira de registrar o tempo exato das opções, 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 memória RAM para minimizar a sobrecarga

Nota para si: possíveis soluções:

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

1 resposta

3

Eu não tenho uma resposta, mas você pode encontrar uma entre as ferramentas, exemplos e recursos escritos ou listados por Brendan Gregg no comando perf e no kernel do Linux ftrace e debugfs.

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

De interesse pode ser esta discussão benchmark benchmark por Benoit Sigoure, e o lat_ctx teste do antigo pacote lmbench .

Eles podem precisar de algum trabalho para executar no Pi, por exemplo, com tsuna/contextswitch eu editei timectxswws.c get_iterations() para while (iterations * ws_pages * 4096UL < 4294967295UL) { e removi -march=native -mno-avx do Makefile .

Usando perf record por 10 segundos no Pi sobre o ssh enquanto fazendo while sleep .1;do echo hi;done em 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 assim

           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 um evento de troca de contexto aconteceu, para qual processo.

    
por 30.09.2016 / 21:43