[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] open/stat64 syscalls run faster on Xen VM than standard Linux



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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.