From owner-freebsd-java@FreeBSD.ORG Sat Sep 15 17:50:14 2007 Return-Path: Delivered-To: java@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id E483816A418; Sat, 15 Sep 2007 17:50:14 +0000 (UTC) (envelope-from kris@FreeBSD.org) Received: from weak.local (hub.freebsd.org [IPv6:2001:4f8:fff6::36]) by mx1.freebsd.org (Postfix) with ESMTP id B140713C442; Sat, 15 Sep 2007 17:50:13 +0000 (UTC) (envelope-from kris@FreeBSD.org) Message-ID: <46EC1B55.4060202@FreeBSD.org> Date: Sat, 15 Sep 2007 19:50:13 +0200 From: Kris Kennaway User-Agent: Thunderbird 2.0.0.6 (Macintosh/20070728) MIME-Version: 1.0 To: java@FreeBSD.org, performance@FreeBSD.org Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: Subject: Massive performance loss from OS::sleep hack X-BeenThere: freebsd-java@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Porting Java to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 15 Sep 2007 17:50:15 -0000 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