O provedor syscall permite que você rastreie cada entrada e retorno da chamada do sistema. As chamadas do sistema podem ser um bom começo para entender o comportamento do processo, especialmente se o processo estiver gastando uma grande quantidade de tempo sendo executado ou bloqueado no kernel. Você pode usar o comando prstat(1M) para ver onde os processos estão gastando tempo:
$ prstat -m -p 31337 PID USERNAME USR SYS TRP TFL DFL LCK SLP LAT VCX ICX SCL SIG PROCESS/NLWP 13499 user1 53 44 0.0 0.0 0.0 0.0 2.5 0.0 4K 24 9K 0 mystery/6 |
Este exemplo mostra que o processo está consumindo uma grande quantidade de tempo do sistema. Uma possível explicação para este comportamento é que o processo está executando um grande número de chamadas do sistema. Você pode usar um simples programa em D especificado na linha de comando para ver quais chamadas do sistema estão acontecendo com mais freqüência:
# dtrace -n syscall:::entry'/pid == 31337/{ @syscalls[probefunc] = count(); }' dtrace: description 'syscall:::entry' matched 215 probes ^C open 1 lwp_park 2 times 4 fcntl 5 close 6 sigaction 6 read 10 ioctl 14 sigprocmask 106 write 1092 |
Este relatório mostra quais chamadas do sistema estão sendo chamadas com mais freqüência, neste caso, a chamada do sistema write(2). Você pode usar o provedor syscall para examinar mais detalhadamente a origem das chamadas do sistema write():
# dtrace -n syscall::write:entry'/pid == 31337/{ @writes[arg2] = quantize(arg2); }' dtrace: description 'syscall::write:entry' matched 1 probe ^C value ------------- Distribution ------------- count 0 | 0 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1037 2 |@ 3 4 | 0 8 | 0 16 | 0 32 |@ 3 64 | 0 128 | 0 256 | 0 512 | 0 1024 |@ 5 2048 | 0 |
A saída mostra que o processo está executando muitas chamadas do sistema write () com uma quantidade relativamente pequena de dados. Esta taxa poderia ser a origem do problema de desempenho deste processo específico. Este exemplo ilustra uma metodologia geral para investigar o comportamento da chamada do sistema.