Massive performance loss from OS::sleep hack
David Xu
davidxu at freebsd.org
Sun Sep 16 19:34:10 PDT 2007
Kris Kennaway wrote:
> Hi,
>
> I have been running the volano java benchmark
> (http://www.volano.com/benchmarks.html) on an 8-core i386 system, and
> out of the box jdk15 on FreeBSD performs extremely poorly. The system
> is more than 90% idle, and profiling shows that the ~800 threads in the
> benchmark are spending most of their time doing short nanosleep() calls.
>
>
> I traced it to the following FreeBSD-specific hack in the jdk:
>
> // XXXBSD: understand meaning and workaround related to yield
> ...
> // XXXBSD: done differently in 1.3.1, take a look
> int os::sleep(Thread* thread, jlong millis, bool interruptible) {
> assert(thread == Thread::current(), "thread consistency check");
> ...
>
> if (millis <= 0) {
> // NOTE: workaround for bug 4338139
> if (thread->is_Java_thread()) {
> ThreadBlockInVM tbivm((JavaThread*) thread);
> // BSDXXX: Only use pthread_yield here and below if the system thread
> // scheduler gives time slices to lower priority threads when yielding.
> #ifdef __FreeBSD__
> os_sleep(MinSleepInterval, interruptible);
> #else
> pthread_yield();
> #endif
>
> When I removed this hack (i.e. revert to pthread_yield()) I got an
> immediate 7-fold performance increase, which brings FreeBSD performance
> on par with Solaris.
>
> What is the reason why this code is necessary? Does FreeBSD's
> sched_yield() really have different semantics to the other operating
> systems, or was this a libkse bug that was being worked around?
>
> Kris
Yeah, our sched_yield() really works well, in kernel, if the thread
scheduling policy is SCHED_OTHER (time-sharing), scheduler temporarily
lowers its priority to PRI_MAX_TIMESHARE, it is enough to give some CPU
time to other threads. Why doesn't the UNIX time-sharing work for java ?
Regards,
David Xu
More information about the freebsd-performance
mailing list