Massive performance loss from OS::sleep hack

Kurt Miller kurt at intricatesoftware.com
Tue Sep 18 19:13:04 PDT 2007


On Tuesday 18 September 2007 03:17:14 pm Kris Kennaway wrote:
> Kurt Miller wrote:
> > David Xu confirmed for me that pthread_yield() does give some
> > time to lower priority threads on 7.0 using thr. Attached and inline
> > are two patches for the 1.5 port that is how I suggest the issue be
> > addressed.
> >
> > For 7.0 and up default UseThreadPriorities to true and always
> > use pthread_yield(). For < 7.0 default UseThreadPriorities to
> > false and conditionally use pthread_yield()/os_sleep(). User's
> > can toggle UseThreadPriorities with the command line argument
> > -XX:+UseThreadPriorities
>
> Do we know that 6.x requires the old behaviour?  Maybe it can default to
> on there too.  Otherwise this looks good to my eyeball (but the
> DEFAULT_LD_LIBRARY_PATH change looks unrelated)
>
> -#define DEFAULT_LD_LIBRARY_PATH "/usr/lib" /* See ld.so.1(1) */
> +#define DEFAULT_LD_LIBRARY_PATH "/usr/lib:/usr/local/lib" /* See
> ld.so.1(1)

Yea I messed up the DEFAULT_LD_LIBRARY_PATH part. I didn't intend
to change that segment of the existing os_bsd.cpp patch.

Regarding 6.x it either needs UseThreadPriorities defaulted to false
or the os_sleep hack. After discussing the options with Daniel we
agree that defaulting UseThreadPriorities to false and eliminating
the os_sleep hack for all versions is the most consitant approach.

The following is a CVS diff of ports/java/jdk15 that updates the
port to fix the performance issue plus an alternative method
to setting DEFAULT_LD_LIBRARY_PATH without patching and
substituting it:

Index: Makefile
===================================================================
RCS file: /home/ncvs/ports/java/jdk15/Makefile,v
retrieving revision 1.135
diff -u -r1.135 Makefile
--- Makefile	7 Sep 2007 20:41:52 -0000	1.135
+++ Makefile	19 Sep 2007 01:53:17 -0000
@@ -7,7 +7,7 @@
 
 PORTNAME=	jdk
 PORTVERSION=	${JDK_VERSION}.${JDK_UPDATE_VERSION}p${JDK_PATCHSET_VERSION}
-PORTREVISION=	1
+PORTREVISION=	2
 PORTEPOCH=	1
 CATEGORIES=	java devel
 MASTER_SITES=	# http://download.java.net/tiger/
@@ -129,6 +129,7 @@
 
 MAKE_ENV+=	ALT_BOOTDIR="${BOOTSTRAPJDKDIR}" \
 		ALT_MOTIF_DIR="${X11BASE}" \
+		DEFAULT_LD_LIBRARY_PATH="/usr/lib:${LOCALBASE}/lib" \
 		SYS_CFLAGS="${CFLAGS}" \
 		LANG="C" \
 		JAVA_HOME="" \
@@ -161,7 +162,6 @@
 JDKIMAGEDIR=	${WRKSRC}/../build/bsd-${HOTSPOTARCH}/j2sdk-image
 JDKIMAGEDIR_G=	${WRKSRC}/../build/bsd-${HOTSPOTARCH}/j2sdk-debug-image
 
-LOCAL_FILES=	../../hotspot/src/os/bsd/vm/os_bsd.cpp
 PTHREAD_FILES=	../../hotspot/build/bsd/makefiles/vm.make \
 		../../j2se/make/com/sun/java/pack/Makefile \
 		../../j2se/make/common/Defs.gmk \
@@ -265,10 +265,6 @@
 .endif
 
 post-patch:
-	@for file in ${LOCAL_FILES}; do \
-		${REINPLACE_CMD} -e "s:%%LOCALBASE%%:${LOCALBASE}:" \
-			${WRKSRC}/$${file}; \
-	done
 	@for file in ${PTHREAD_FILES}; do \
 		${REINPLACE_CMD} -e "s:-pthread:${PTHREAD_LIBS}:g" \
 			${WRKSRC}/$${file}; \
Index: files/patch-vm::globals.hpp
===================================================================
RCS file: files/patch-vm::globals.hpp
diff -N files/patch-vm::globals.hpp
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ files/patch-vm::globals.hpp	19 Sep 2007 01:53:17 -0000
@@ -0,0 +1,26 @@
+$FreeBSD$
+
+--- ../../hotspot/src/share/vm/runtime/globals.hpp.orig	Wed May  2 04:01:50 
2007
++++ ../../hotspot/src/share/vm/runtime/globals.hpp	Tue Sep 18 21:40:44 2007
+@@ -130,6 +130,12 @@
+ #define falseInProduct true
+ #endif
+ 
++#if defined(_ALLBSD_SOURCE)
++#define OSUseThreadPriorities false
++#else
++#define OSUseThreadPriorities true
++#endif
++
+ // develop flags are settable / visible only during development and are 
constant in the PRODUCT version
+ // product flags are always settable / visible
+ 
+@@ -2546,7 +2552,7 @@
+           "beginning to throw OutOfMemoryErrors in each compile")           
\
+                                                                             
\
+   /* Priorities */                                                          
\
+-  product(bool, UseThreadPriorities, true,                                  
\
++  product(bool, UseThreadPriorities, OSUseThreadPriorities,                 
\
+           "Use native thread priorities")	                            \
+                                                                             
\
+   product(intx, ThreadPriorityPolicy, 0,                                    
\
Index: files/patch-vm::os_bsd.cpp
===================================================================
RCS file: /home/ncvs/ports/java/jdk15/files/patch-vm::os_bsd.cpp,v
retrieving revision 1.7
diff -u -r1.7 patch-vm::os_bsd.cpp
--- files/patch-vm::os_bsd.cpp	9 Jun 2007 05:14:56 -0000	1.7
+++ files/patch-vm::os_bsd.cpp	19 Sep 2007 01:53:17 -0000
@@ -1,13 +1,32 @@
 $FreeBSD: ports/java/jdk15/files/patch-vm::os_bsd.cpp,v 1.7 2007/06/09 
05:14:56 glewis Exp $
 
---- ../../hotspot/src/os/bsd/vm/os_bsd.cpp	Sun Jun  3 18:46:31 2007
-+++ ../../hotspot/src/os/bsd/vm/os_bsd.cpp.orig	Sun Jun  3 18:47:28 2007
-@@ -499,7 +499,7 @@
- #define getenv(n) ::getenv(n)
+--- ../../hotspot/src/os/bsd/vm/os_bsd.cpp.orig	Mon Sep 17 21:03:04 2007
++++ ../../hotspot/src/os/bsd/vm/os_bsd.cpp	Tue Sep 18 21:36:51 2007
+@@ -2271,13 +2271,7 @@
+     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
+ 
+ #if SOLARIS
+       // XXX - This code was not exercised during the Merlin RC1
+@@ -2297,13 +2291,7 @@
+       return 0;
+     }
+ 
+-// BSDXXX: Only use pthread_yield here and above if the system thread
+-// scheduler gives time slices to lower priority threads when yielding.
+-#ifdef __FreeBSD__
+-    os_sleep(MinSleepInterval, interruptible);
+-#else
+     pthread_yield();
+-#endif
+     return 0;
+   }
  
- #ifndef DEFAULT_LD_LIBRARY_PATH
--#define DEFAULT_LD_LIBRARY_PATH "/usr/lib" /* See ld.so.1(1) */
-+#define DEFAULT_LD_LIBRARY_PATH "/usr/lib:%%LOCALBASE%%/lib" /* See ld.so.1
(1) */
- #endif
- #define EXTENSIONS_DIR "/lib/ext"
- #define ENDORSED_DIR "/lib/endorsed"



More information about the freebsd-java mailing list