8233712: Limit default tests jobs based on ulimit -u setting
authorsgehwolf
Wed, 06 Nov 2019 18:06:36 +0100
changeset 59120 fc68b2cdfeeb
parent 59119 7bdc4f073c7f
child 59121 7cbffba2156b
8233712: Limit default tests jobs based on ulimit -u setting Reviewed-by: erikj, ihse
make/RunTests.gmk
make/RunTestsPrebuiltSpec.gmk
make/autoconf/basics.m4
make/autoconf/spec.gmk.in
--- a/make/RunTests.gmk	Fri Nov 15 16:10:29 2019 +0100
+++ b/make/RunTests.gmk	Wed Nov 06 18:06:36 2019 +0100
@@ -247,11 +247,29 @@
       CORES_DIVIDER := 4
     endif
   endif
+  # For some big multi-core machines with low ulimit -u setting we hit the max
+  # threads/process limit. In such a setup the memory/cores-only-guided
+  # TEST_JOBS config is insufficient. From experience a concurrency setting of
+  # 14 works reasonably well for low ulimit values (<= 4096). Thus, use
+  # divider 4096/14. For high ulimit -u values this shouldn't make a difference.
+  ULIMIT_DIVIDER := (4096/14)
+  PROC_ULIMIT := -1
+  ifneq ($(OPENJDK_TARGET_OS), windows)
+    PROC_ULIMIT := $(shell $(ULIMIT) -u)
+    ifeq ($(PROC_ULIMIT), unlimited)
+      PROC_ULIMIT := -1
+    endif
+  endif
   MEMORY_DIVIDER := 2048
   TEST_JOBS := $(shell $(AWK) \
     'BEGIN { \
       c = $(NUM_CORES) / $(CORES_DIVIDER); \
       m = $(MEMORY_SIZE) / $(MEMORY_DIVIDER); \
+      u = $(PROC_ULIMIT); \
+      if (u > -1) { \
+        u = u / $(ULIMIT_DIVIDER); \
+        if (u < c) c = u; \
+      } \
       if (c > m) c = m; \
       c = c * $(TEST_JOBS_FACTOR); \
       c = c * $(TEST_JOBS_FACTOR_JDL); \
--- a/make/RunTestsPrebuiltSpec.gmk	Fri Nov 15 16:10:29 2019 +0100
+++ b/make/RunTestsPrebuiltSpec.gmk	Wed Nov 06 18:06:36 2019 +0100
@@ -175,6 +175,7 @@
 EXPR := expr
 FILE := file
 HG := hg
+ULIMIT := ulimit
 
 # On Solaris gnu versions of some tools are required.
 ifeq ($(OPENJDK_BUILD_OS), solaris)
--- a/make/autoconf/basics.m4	Fri Nov 15 16:10:29 2019 +0100
+++ b/make/autoconf/basics.m4	Wed Nov 06 18:06:36 2019 +0100
@@ -574,6 +574,26 @@
 ])
 
 ###############################################################################
+# Like BASIC_REQUIRE_PROGS but also allows for bash built-ins
+# $1: variable to set
+# $2: executable name (or list of names) to look for
+# $3: [path]
+AC_DEFUN([BASIC_REQUIRE_BUILTIN_PROGS],
+[
+  BASIC_SETUP_TOOL($1, [AC_PATH_PROGS($1, $2, , $3)])
+  if test "x[$]$1" = x; then
+    AC_MSG_NOTICE([Required tool $2 not found in PATH, checking built-in])
+    if help $2 > /dev/null 2>&1; then
+      AC_MSG_NOTICE([Found $2 as shell built-in. Using it])
+      $1="$2"
+    else
+      AC_MSG_ERROR([Required tool $2 also not found as built-in.])
+    fi
+  fi
+  BASIC_CHECK_NONEMPTY($1)
+])
+
+###############################################################################
 # Setup the most fundamental tools that relies on not much else to set up,
 # but is used by much of the early bootstrap code.
 AC_DEFUN_ONCE([BASIC_SETUP_FUNDAMENTAL_TOOLS],
@@ -1284,6 +1304,9 @@
   elif test "x$OPENJDK_TARGET_OS" = "xsolaris"; then
     BASIC_REQUIRE_PROGS(ELFEDIT, elfedit)
   fi
+  if ! test "x$OPENJDK_TARGET_OS" = "xwindows"; then
+    BASIC_REQUIRE_BUILTIN_PROGS(ULIMIT, ulimit)
+  fi
 ])
 
 ###############################################################################
--- a/make/autoconf/spec.gmk.in	Fri Nov 15 16:10:29 2019 +0100
+++ b/make/autoconf/spec.gmk.in	Wed Nov 06 18:06:36 2019 +0100
@@ -767,6 +767,7 @@
 XCODEBUILD=@XCODEBUILD@
 DTRACE := @DTRACE@
 FIXPATH:=@FIXPATH@
+ULIMIT:=@ULIMIT@
 
 TAR_TYPE:=@TAR_TYPE@
 TAR_CREATE_EXTRA_PARAM:=@TAR_CREATE_EXTRA_PARAM@