szaydel
5/22/2013 - 2:01 AM

Very generic information about IO, using io:::start probe. Looking for min, max, avg, and other details.

Very generic information about IO, using io:::start probe. Looking for min, max, avg, and other details.

#!/bin/bash

name=${0/.sh}
user_custom_limit=$1
var_def_limit='100'
var_limit=${user_custom_limit:-${var_def_limit}}
output_log=/root/$name-${var_limit}-$(date +"%Y%m%d").log
exec 1> $output_log

dtrace -qn '
inline int maxrun = '$var_limit';

BEGIN {
	cnt = 0;
}
io:::start {

	self->rw = (int )args[0]->b_flags & B_READ ? "READ" : "WRITE";
	@by_size[self->rw] = quantize(args[0]->b_bcount);
	/* @files[pid, execname, self->rw, args[2]->fi_pathname] = sum (args[0]->b_bcount); */
 	@total_blks[self->rw] 	= 	count();
 	@total_bytes[self->rw]	= 	sum(args[0]->b_bcount);
 	@min_bsize[self->rw] 	= 	min(args[0]->b_bcount);
 	@max_bsize[self->rw] 	= 	max(args[0]->b_bcount);
 	@avg_bsize[self->rw] 	= 	avg(args[0]->b_bcount);
	self->rw = 0;
}

tick-60sec /cnt > maxrun/ {
	exit(0);
}

tick-60sec {
	cnt++;
}

END {
	normalize(@total_bytes, 1024);
	printa("%s Bytes: %@d\n", @by_size);
	printa("Average %s IO Size: %@d\n", @avg_bsize);
	printa("Minimum %s IO Size: %@d\n", @min_bsize); 
	printa("Maximum %s IO Size: %@d\n", @max_bsize);
	printa("%s Blocks: %@d\n", @total_blks); 
	printa("Total %s KBytes: %@d\n", @total_bytes);
}'