8209894: ZGC: Cap number of GC workers based on heap size
authorpliden
Tue, 28 Aug 2018 09:06:23 +0200
changeset 51542 04b857edadec
parent 51541 69ee8894f5fa
child 51543 5303c6c05db6
8209894: ZGC: Cap number of GC workers based on heap size Reviewed-by: ehelin, tschatzl
src/hotspot/share/gc/z/zWorkers.cpp
src/hotspot/share/gc/z/zWorkers.hpp
--- a/src/hotspot/share/gc/z/zWorkers.cpp	Mon Aug 27 21:50:52 2018 -0700
+++ b/src/hotspot/share/gc/z/zWorkers.cpp	Tue Aug 28 09:06:23 2018 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -22,14 +22,27 @@
  */
 
 #include "precompiled.hpp"
+#include "gc/z/zGlobals.hpp"
 #include "gc/z/zTask.hpp"
 #include "gc/z/zWorkers.inline.hpp"
 #include "runtime/os.hpp"
 #include "runtime/mutexLocker.hpp"
 #include "runtime/safepoint.hpp"
 
-uint ZWorkers::calculate_ncpus(double share_in_percent) {
-  return ceil(os::initial_active_processor_count() * share_in_percent / 100.0);
+static uint calculate_nworkers_based_on_ncpus(double cpu_share_in_percent) {
+  return ceil(os::initial_active_processor_count() * cpu_share_in_percent / 100.0);
+}
+
+static uint calculate_nworkers_based_on_heap_size(double reserve_share_in_percent) {
+  const int nworkers = ((MaxHeapSize * (reserve_share_in_percent / 100.0)) - ZPageSizeMedium) / ZPageSizeSmall;
+  return MAX2(nworkers, 1);
+}
+
+static uint calculate_nworkers(double cpu_share_in_percent) {
+  // Cap number of workers so that we never use more than 10% of the max heap
+  // for the reserve. This is useful when using small heaps on large machines.
+  return MIN2(calculate_nworkers_based_on_ncpus(cpu_share_in_percent),
+              calculate_nworkers_based_on_heap_size(10.0));
 }
 
 uint ZWorkers::calculate_nparallel() {
@@ -38,7 +51,7 @@
   // close to the number of processors tends to lead to over-provisioning and
   // scheduling latency issues. Using 60% of the active processors appears to
   // be a fairly good balance.
-  return calculate_ncpus(60.0);
+  return calculate_nworkers(60.0);
 }
 
 uint ZWorkers::calculate_nconcurrent() {
@@ -48,7 +61,7 @@
   // throughput, while using too few threads will prolong the GC-cycle and
   // we then risk being out-run by the application. Using 12.5% of the active
   // processors appears to be a fairly good balance.
-  return calculate_ncpus(12.5);
+  return calculate_nworkers(12.5);
 }
 
 class ZWorkersWarmupTask : public ZTask {
--- a/src/hotspot/share/gc/z/zWorkers.hpp	Mon Aug 27 21:50:52 2018 -0700
+++ b/src/hotspot/share/gc/z/zWorkers.hpp	Tue Aug 28 09:06:23 2018 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -34,8 +34,6 @@
   bool     _boost;
   WorkGang _workers;
 
-  static uint calculate_ncpus(double share_in_percent);
-
   void run(ZTask* task, uint nworkers);
 
 public: