| From | Sent On | Attachments |
|---|---|---|
| Kris Kennaway | Sep 15, 2007 10:49 am | |
| Kris Kennaway | Sep 15, 2007 12:08 pm | |
| Daniel Eischen | Sep 15, 2007 3:37 pm | |
| Daniel Eischen | Sep 15, 2007 9:47 pm | |
| Kip Macy | Sep 15, 2007 10:52 pm | |
| Kris Kennaway | Sep 16, 2007 3:16 am | |
| Daniel Eischen | Sep 16, 2007 8:45 am | |
| Kurt Miller | Sep 16, 2007 9:06 am | |
| Kurt Miller | Sep 16, 2007 9:06 am | |
| Kip Macy | Sep 16, 2007 12:56 pm | |
| Alfred Perlstein | Sep 16, 2007 6:16 pm | |
| Kurt Miller | Sep 16, 2007 6:47 pm | |
| David Xu | Sep 16, 2007 7:33 pm | |
| Kurt Miller | Sep 18, 2007 4:21 am | |
| Daniel Eischen | Sep 18, 2007 5:29 am | |
| Kurt Miller | Sep 18, 2007 7:15 am | |
| Daniel Eischen | Sep 18, 2007 10:08 am | |
| Kurt Miller | Sep 18, 2007 10:28 am | |
| Daniel Eischen | Sep 18, 2007 11:00 am | |
| Kris Kennaway | Sep 18, 2007 12:16 pm | |
| Kurt Miller | Sep 18, 2007 7:12 pm | |
| Kris Kennaway | Sep 19, 2007 3:16 am |
| Subject: | Massive performance loss from OS::sleep hack | |
|---|---|---|
| From: | Kris Kennaway (kr...@FreeBSD.org) | |
| Date: | Sep 15, 2007 10:49:55 am | |
| List: | org.freebsd.freebsd-performance | |
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





