strace
provavelmente não fornecerá o nível necessário de detalhes; provavelmente você precisará do SystemTap, do sysdig ou de depuração semelhante no nível do kernel para mostrar melhor o que está acontecendo. Por exemplo, com o SystemTap instalado e todos os detalhes debuginfo e de configuração necessários, um poderia começar com:
probe begin
{
printf("%-16s %s\n", "TIME", "WHAT");
}
probe tty.{ioctl,receive}
{
if (pid() != target()) next;
printf("%d ttyx %s\n", gettimeofday_us(), name);
}
probe tty.poll
{
if (pid() != target()) next;
printf("%d ttypoll %s\n", gettimeofday_us(), file_name);
}
probe tty.{read,write}
{
if (pid() != target()) next;
printf("%d ttyio %s %d\n", gettimeofday_us(), file_name, nr);
}
probe syscall.{read,write,epoll_*}
{
if (pid() != target()) next;
printf("%d syscall %s\tenter\n", gettimeofday_us(), name);
}
probe syscall.{read,write,epoll_*}.return
{
if (pid() != target()) next;
printf("%d syscall %s\treturn\n", gettimeofday_us(), name);
}
e execute isso via
$ sudo stap -x "$(pidof ...)" filecontainingtheabovecode.stp
que para um programa de teste em série e um anexo do Arduino para mim mostra:
TIME WHAT
1516997916648359 syscall read enter
1516997916648366 ttyio ttyACM0 4096
1516997916652456 syscall read return
1516997916652465 syscall read enter
1516997916652470 ttyio ttyACM0 4096
1516997916656459 syscall read return
1516997916656497 syscall write enter
1516997916656503 ttyio 4 21
1516997916656511 syscall write return
...
Você também pode precisar consultar a documentação de tetsets do SystemTap para outros pontos de interesse do probe (planejador, planejador de E / S, IRQs?) se o acima não mostrar onde está o atraso. E possivelmente para comparar os tempos com a versão antiga do código / driver / sistema ...