Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 5 Jun 2012 19:14:46 +0200
From:      Luigi Rizzo <rizzo@iet.unipi.it>
To:        John Baldwin <jhb@freebsd.org>
Cc:        Gianni <gianni@freebsd.org>, Alan Cox <alc@rice.edu>, Alexander Kabaev <kan@freebsd.org>, Attilio Rao <attilio@freebsd.org>, Konstantin Belousov <kib@freebsd.org>, freebsd-arch@freebsd.org, Konstantin Belousov <kostikbel@gmail.com>, Dag-Erling Sm??rgrav <des@des.no>
Subject:   Fast vs slow syscalls (Re: Fwd: [RFC] Kernel shared variables)
Message-ID:  <20120605171446.GA28387@onelab2.iet.unipi.it>
In-Reply-To: <201206051222.12627.jhb@freebsd.org>
References:  <CACfq090r1tWhuDkxdSZ24fwafbVKU0yduu1yV2%2BoYo%2BwwT4ipA@mail.gmail.com> <201206051008.29568.jhb@freebsd.org> <86haupvk4a.fsf@ds4.des.no> <201206051222.12627.jhb@freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Tue, Jun 05, 2012 at 12:22:12PM -0400, John Baldwin wrote:
> On Tuesday, June 05, 2012 11:44:37 am Dag-Erling Sm??rgrav wrote:
> > John Baldwin <jhb@freebsd.org> writes:
> > > So you call getpid() on each access to a shared resource?
> > 
> > I don't, but I've seen code that does, under the assumption that all the
> > world is Linux and getpid() is free.  Here's a sample from RHEL6 on a
> > 3.1 GHz i5, using raise(0) as a baseline:
> > 
> > getpid(): 10,000,000 iterations in 24,400 ms
> > gettimeofday(0, 0): 10,000,000 iterations in 54,104 ms
> > raise(0): 10,000,000 iterations in 1,284,593 ms
> > 
> > The difference between the first two is due to the fact that while
> > getpid() just returns a constant, gettimeofday(0, 0) performs two
> > comparisons first.  Passing an actual struct timeval to gettimeofday()
> > slows it down by a factor of about 6.
> > 
> > (strace confirms that no system calls occur for either getpid() or
> > gettimeofday(0, 0))
> > 
> > Here is the same program running on FreeBSD 9.0-RELEASE in VirtualBox on
> > an otherwise idle 3.4 GHz i7:
> > 
> > getpid(): 10,000,000 iterations in 777,251 ms
> > gettimeofday(0, 0): 10,000,000 iterations in 799,808 ms
> > raise(0): 10,000,000 iterations in 2,142,275 ms
> 
> Yes, we know getpid() is slow, I think the question is does it matter that 
> it's slow in something other than a microbenchmark.  Can you name the 
> application that you've seen use getpid()?

i think the important question is, for any function X:
    Q1	"does it require horrible hacks or a huge amount of work
	to make X syscall-free ?"
rather than
    Q2	"does it matter to make X fast"

If the answer to Q1 is "no" then there is no question
we should try to implement it.

Clearly the answer changes depending on the infrastructure we
have in place (e.g. without some shared kernel page we could not
export gettimeofday() calibration data, or PID numbers, etc).

And if we really want to educate people to use syscalls in a sensible
way (which I do see as a valuable goal, just not always)
we could always use an environment variable, LIBC_OPTIONS,
which enables or disables certain optimizations, similar
to MALLOC_OPTIONS.

cheers
luigi

  or 
> -- 
> John Baldwin
> _______________________________________________
> freebsd-arch@freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-arch
> To unsubscribe, send any mail to "freebsd-arch-unsubscribe@freebsd.org"



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20120605171446.GA28387>