xen-devel
Re: [Xen-devel] open/stat64 syscalls run faster on Xen VM than standard
Your questioning makes sense to me. But I am not very sure about how to effectively count how many
these operations can be completed in a second. Can you give me some hint?
Here's a quick-and-dirty wrapper for timing "something" over the space
of a few seconds (default 10) and working out how fast it went.
Obviously, you want to be running this on an otherwise-idle machine, and
with CPU frequency management disabled. It's really, really dumb, but
it only uses "time()", not any subsecond time sourcing, for its work.
Stephen,
Thanks for prioviding the code. I have one question about the calculation of "how_long" (average
time of tested system call in the timeme_dosomething()). In your original code, it is calculated as:
how_long = 1.0 / ((float) (loops_noop - loops_something) / (TIME_SECS));
I think it should be
how_long = (float)TIME_SECS /loops_something -
(float)TIME_SECS/loops_noop;
Plese correct me if I am wrong.
I applied the above modification to your code (I named it Tick.c) and ran the Tick binary on 3
platforms (physical machine, domU with loopback file as VBDs, domU with hard disk partition as
VBDs). I put together the results and discussion in the following PDF doc:
http://people.cs.uchicago.edu/~hai/tmp/tick_performance.pdf
"The average stat64 system call time reported by the corrected tick binary now accords with the time
reported by strace. It runs faster on both PVM and LVM than PHY. The PVM is the platform it runs
fastest."
Thanks.
Xuehai
------------------------------------------------------------------------
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/time.h>
#define TIME_SECS 10
static inline int time_is_before(time_t a, time_t b)
{
return ((signed) (a-b)) < 0;
}
void timeme_noop(void)
{
return;
}
void timeme_dosomething(void)
{
struct stat statbuf;
stat("/", &statbuf);
}
int run_time_loop(const char *what, void (*fn)(void))
{
time_t end;
int count=0;
end = time(NULL) + TIME_SECS;
printf("Timing %s for %d seconds: ", what, TIME_SECS);
fflush(stdout);
do {
++count;
fn();
} while (time_is_before(time(NULL), end));
printf("completed %d cycles in %d seconds\n", count, TIME_SECS);
return count;
}
void wait_for_tick(void)
{
time_t end;
printf("Waiting for fresh timer tick...");
fflush(stdout);
end = time(NULL) + 1;
while (time_is_before(time(NULL), end));
printf(" done.\n");
}
int main(void)
{
int loops_noop, loops_something;
float how_long;
wait_for_tick();
loops_noop = run_time_loop("noop", timeme_noop);
loops_something = run_time_loop("something", timeme_dosomething);
how_long = 1.0 / ((float) (loops_noop - loops_something) / (TIME_SECS));
I wonder if this line should be:
how_long = (float)TIME_SECS /loops_something - (float)TIME_SECS/loops_noop;
printf ("Average time for something: %f seconds (%f ns).\n",
how_long, how_long * 1000000000.0);
}
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|
|
|