Isso é realmente complicado. Mas há dicas:
-
Aprenda sobre o SystemTap, este é o análogo do Linux do DTrace. Eu acho que eles podem até ter scripts de exemplo para tarefas similares.
-
Aprenda blktrace . Você pode ser capaz de analisar sua saída, em teoria. Isso será mais latência de dispositivo (tempo de serviço) do que o tempo de resposta chegar em
read()
.
Sim strace
pode não ser apropriado, pois rastreará tudo (todos os syscalls, mesmo quando você usar o filtro -e
) e carregará o servidor e o processo mais lento consideravelmente. Perf
é uma ferramenta muito obscura, você pode ter momentos em que acha que entende sua saída, mas na verdade não o fez, e seu conjunto de recursos depende muito da versão do kernel. Basicamente e atualmente perf
é adequado para medir tempo de CPU (ciclos), e [ainda] inadequado para medir tempos de resposta (o que você realmente precisa). Ouvi dizer que eles queriam implementar algo para facilitar isso, então em kernels de desenvolvimento muito recentes pode haver alguma coisa. (Veja também em perf-scripts ( perf script -l
) se você investigar mais.)
-
Pode ser que você consiga algo do ftrace . Leia este artigo link (E isso para o intro .) Como eu posso ver, você pode limitar o rastreio por
pid
e function, então rastreie com algo comosys_read
. Eu tentei isso como exemplo para você:# mount -t debugfs debugfs /sys/kernel/debug # if it's not already mounted # cd /sys/kernel/debug/tracing # echo $$ > set_ftrace_pid # pid of process to trace # echo sys_read sys_write > set_ftrace_filter # echo function_graph > current_tracer # head trace # tracer: function_graph # # CPU DURATION FUNCTION CALLS # | | | | | | | 0) 8.235 us | sys_write(); 0) 3.393 us | sys_write(); 0) ! 459859.3 us | sys_read(); 0) 6.289 us | sys_write(); 0) 8.773 us | sys_write(); 0) ! 1576469 us | sys_read();