Estou tentando gerar arquivos do FTrace dentro de um ambiente Android, usando:
root@adroid:# echo 1 > /sys/kernel/debug/tracing/events/sched/sched_switch/enable
root@adroid:# echo 1 > /sys/kernel/debug/tracing/tracing_on
root@adroid:# cat /sys/kernel/debug/tracing/trace > mytracefile.txt
root@adroid:# echo 0 > /sys/kernel/debug/tracing/tracing_on
root@adroid:# echo 0 > /sys/kernel/debug/tracing/events/sched/sched_switch/enable
O problema é que, em mytracefile.txt
, a precisão do registro de data e hora está em milissegundos:
<idle>-0 [000] d.h7 14186.690000: sched_wakeup: comm=tfm_b6bcf800 pid=1714 prio=35 success=1 target_cpu=000
<idle>-0 [000] d..3 14186.690000: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=tfm_b6bcf800 next_pid=1714 next_prio=35
tfm_b6bcf800-1714 [000] d..3 14186.690000: sched_switch: prev_comm=tfm_b6bcf800 prev_pid=1714 prev_prio=35 prev_state=D|W ==> next_comm=swapper/0 next_pid=0 next_prio=120
<idle>-0 [001] d.h3 14186.690000: sched_wakeup: comm=Player Aud Mixe pid=146 prio=35 success=1 target_cpu=001
<idle>-0 [001] d..3 14186.690000: sched_switch: prev_comm=swapper/1 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=Player Aud Mixe next_pid=146 next_prio=35
Player Aud Mixe-146 [001] d..3 14186.690000: sched_switch: prev_comm=Player Aud Mixe prev_pid=146 prev_prio=35 prev_state=D ==> next_comm=swapper/1 next_pid=0 next_prio=120
<idle>-0 [001] d.h3 14186.690000: sched_wakeup: comm=Player Aud Mixe pid=146 prio=35 success=1 target_cpu=001
<idle>-0 [001] d..3 14186.690000: sched_switch: prev_comm=swapper/1 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=Player Aud Mixe next_pid=146 next_prio=35
Player Aud Mixe-146 [001] d..3 14186.690000: sched_switch: prev_comm=Player Aud Mixe prev_pid=146 prev_prio=35 prev_state=S ==> next_comm=swapper/1 next_pid=0 next_prio=120
<idle>-0 [001] d.h3 14186.700000: sched_wakeup: comm=Player Aud Mixe pid=146 prio=35 success=1 target_cpu=001
<idle>-0 [001] d..3 14186.700000: sched_switch: prev_comm=swapper/1 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=Player Aud Mixe next_pid=146 next_prio=35
Normalmente, deve ser da ordem de microssegundos, como 14186.691234 em vez de apenas 14186.690000.
Já testei todas as outras opções de trace_clock
que tenho (local, global e contador), mas os resultados são sempre os mesmos. Alterar esse parâmetro não altera nada no arquivo de saída.
Segui cuidadosamente a documentação do FTrace mas eu não sei mais o que mudar na configuração.
Pesquisando pela internet, eu só consegui encontrar este relatório de bug, mas ele não foi resolvido: link
Algum conselho?
Existem módulos adicionais no kernel que eu tenho que instalar?
- Versão do Android: 4.2.2
- Versão do Kernel Linux: 3.4.7
A saída
dmesg
também está mostrando a precisão de milissegundos:
<4>[ 38.130000] oom_adj 0 => oom_score_adj 0
<4>[ 38.130000] oom_adj 1 => oom_score_adj 58
<4>[ 38.140000] oom_adj 2 => oom_score_adj 117
<4>[ 38.140000] oom_adj 4 => oom_score_adj 235
<4>[ 38.150000] oom_adj 9 => oom_score_adj 529
<4>[ 38.150000] oom_adj 15 => oom_score_adj 1000
Atualização:
Estamos construindo um analisador gráfico para arquivos do android ftrace (incluindo rastreamentos atrace ). É por isso que é muito importante ter o máximo de precisão possível.
Usando o mesmo dispositivo e outras ferramentas de software, podemos ter precisão de microssegundos com sucesso.
Então, agora estamos planejando editar o código-fonte ftrace.c para modificar a maneira como o timestamp é gerado para este:
static inline uint64_t my_custom_jiffies(void)
{
struct timeval tv;
gettimeofday(&tv, NULL);
return tv.tv_sec*1000000 + tv.tv_usec;
}
Pessoalmente, acho que não é uma solução / arquitetura / implementação muito boa, porque isso deve ser possível sem modificar o código fonte ... mas é a única ideia que temos neste momento.
O que você acha?