From DTraceBook
scsilatency.d, page 221
#!/usr/sbin/dtrace -s
#pragma D option quiet
string scsi_cmd[uchar_t];
dtrace:::BEGIN
{
/* See /usr/include/sys/scsi/generic/commands.h for the full list. */
scsi_cmd[0x00] = "test_unit_ready";
scsi_cmd[0x08] = "read";
scsi_cmd[0x0a] = "write";
scsi_cmd[0x12] = "inquiry";
scsi_cmd[0x17] = "release";
scsi_cmd[0x1a] = "mode_sense";
scsi_cmd[0x1b] = "load/start/stop";
scsi_cmd[0x1c] = "get_diagnostic_results";
scsi_cmd[0x1d] = "send_diagnostic_command";
scsi_cmd[0x25] = "read_capacity";
scsi_cmd[0x28] = "read(10)";
scsi_cmd[0x2a] = "write(10)";
scsi_cmd[0x35] = "synchronize_cache";
scsi_cmd[0x4d] = "log_sense";
scsi_cmd[0x5e] = "persistent_reserve_in";
scsi_cmd[0xa0] = "report_luns";
printf("Tracing... Hit Ctrl-C to end.\n");
}
fbt::scsi_transport:entry
{
start[arg0] = timestamp;
}
fbt::scsi_destroy_pkt:entry
/start[arg0]/
{
this->delta = (timestamp - start[arg0]) / 1000;
this->code = *args[0]->pkt_cdbp;
this->cmd = scsi_cmd[this->code] != NULL ?
scsi_cmd[this->code] : lltostr(this->code);
this->reason = args[0]->pkt_reason == 0 ? "Success" :
strjoin("Fail:", lltostr(args[0]->pkt_reason));
@num[this->cmd, this->reason] = count();
@average[this->cmd, this->reason] = avg(this->delta);
@total[this->cmd, this->reason] = sum(this->delta);
start[arg0] = 0;
}
dtrace:::END
{
normalize(@total, 1000);
printf("\n %-26s %-12s %11s %11s %11s\n", "SCSI COMMAND",
"COMPLETION", "COUNT", "AVG(us)", "TOTAL(ms)");
printa(" %-26s %-12s %@11d %@11d %@11d\n", @num, @average, @total);
}