wall-clock time profiling

Akihiro KAYAMA kayama at personal-media.co.jp
Mon May 28 07:08:10 UTC 2007


Hi all.

What is the right way to measure wall-clock time in profiling on FreeBSD?

Standard profiling method in UNIX like 'gprof' measures CPU time, but
it doesn't always offer a good indication for tuning if application is
not CPU bound.

For example, the below simple program spend most of the time for disk
I/O, but gprof doesn't tell me that fsync(2) in output() is the
hot-spot which should be removed at first.

------------------------------------------------------------
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

char calc()
{
	int i;
	char c;
	for (i = 0; i < 10000; i++) {
		c = c * i;
	}
	return c;
}

void output(int fd, char c)
{
	write(fd, &c, 1);
	fsync(fd);			/* XXX time consuming system call */
}

int main()
{
	int fd;
	int i;
	char c;

	fd = open("testfile", O_CREAT | O_WRONLY);

	for (i = 0; i < 10000; i++) {
		c = calc(i);
		output(fd, c);
	}

	return 0;
}
------------------------------------------------------------
gprof's output:

  %   cumulative   self              self     total           
 time   seconds   seconds    calls  ms/call  ms/call  name    
 84.2       0.56     0.56    10000     0.06     0.06  calc [3]
 13.6       0.65     0.09    10000     0.01     0.01  _fsync [5]
  1.4       0.66     0.01    10000     0.00     0.00  write [6]
  0.7       0.66     0.00                             .mcount (12)
  0.2       0.66     0.00    10000     0.00     0.01  output [4]
------------------------------------------------------------

Measuring CPU time has been proper for traditional UNIX as TSS, but I
think wall-clock time is also useful in these days. It is affected by
system load, but it is easy to arrange some dedicated system for
profiling purpose.

Wall-clock time profiling itself could be implemented by simple kernel
hack (i386/i386/trap.c:syscall() and kern/subr_trap.c:userret()), but
if both CPU and wall-clock time profiling are available, I don't know
how users should change the method. sysctl(8) may be inappropriate.

Although I'm not familiar with another analysis tools, like DTrace for
FreeBSD, is there something help for me?

Thanks.

--
Akihiro KAYAMA


More information about the freebsd-questions mailing list