changeset 59789:627cfc1935b7

8247469: getSystemCpuLoad() returns -1 on linux when some offline cpus are present and cpusets.effective_cpus is not available Reviewed-by: bobv, dtitov
author mbaesken
date Fri, 12 Jun 2020 16:40:47 +0200
parents 6b6ac993c69f
children 49fee4ea8073
files src/jdk.management/aix/native/libmanagement_ext/UnixOperatingSystem.c src/jdk.management/linux/native/libmanagement_ext/UnixOperatingSystem.c src/jdk.management/macosx/native/libmanagement_ext/UnixOperatingSystem.c src/jdk.management/unix/classes/com/sun/management/internal/OperatingSystemImpl.java
diffstat 4 files changed, 36 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/jdk.management/aix/native/libmanagement_ext/UnixOperatingSystem.c	Mon Jun 15 06:05:17 2020 +0000
+++ b/src/jdk.management/aix/native/libmanagement_ext/UnixOperatingSystem.c	Fri Jun 12 16:40:47 2020 +0200
@@ -1,6 +1,6 @@
 /*
- * Copyright (c) 2008, 2019, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2015 SAP SE. All rights reserved.
+ * Copyright (c) 2008, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2020 SAP SE. 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
@@ -57,3 +57,10 @@
 {
     return -1;
 }
+
+JNIEXPORT jint JNICALL
+Java_com_sun_management_internal_OperatingSystemImpl_getHostOnlineCpuCount0
+(JNIEnv *env, jobject mbean)
+{
+    return -1;
+}
--- a/src/jdk.management/linux/native/libmanagement_ext/UnixOperatingSystem.c	Mon Jun 15 06:05:17 2020 +0000
+++ b/src/jdk.management/linux/native/libmanagement_ext/UnixOperatingSystem.c	Fri Jun 12 16:40:47 2020 +0200
@@ -362,3 +362,15 @@
        return -1;
     }
 }
+
+JNIEXPORT jint JNICALL
+Java_com_sun_management_internal_OperatingSystemImpl_getHostOnlineCpuCount0
+(JNIEnv *env, jobject mbean)
+{
+    int n = sysconf(_SC_NPROCESSORS_ONLN);
+    if (n <= 0) {
+        n = 1;
+    }
+    return n;
+}
+
--- a/src/jdk.management/macosx/native/libmanagement_ext/UnixOperatingSystem.c	Mon Jun 15 06:05:17 2020 +0000
+++ b/src/jdk.management/macosx/native/libmanagement_ext/UnixOperatingSystem.c	Fri Jun 12 16:40:47 2020 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2019, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2020, 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
@@ -173,3 +173,11 @@
 {
     return -1;
 }
+
+JNIEXPORT jint JNICALL
+Java_com_sun_management_internal_OperatingSystemImpl_getHostOnlineCpuCount0
+(JNIEnv *env, jobject mbean)
+{
+    return -1;
+}
+
--- a/src/jdk.management/unix/classes/com/sun/management/internal/OperatingSystemImpl.java	Mon Jun 15 06:05:17 2020 +0000
+++ b/src/jdk.management/unix/classes/com/sun/management/internal/OperatingSystemImpl.java	Fri Jun 12 16:40:47 2020 +0200
@@ -158,6 +158,10 @@
                     return getCpuLoad0();
                 } else {
                     int[] cpuSet = containerMetrics.getEffectiveCpuSetCpus();
+                    // in case the effectiveCPUSetCpus are not available, attempt to use just cpusets.cpus
+                    if (cpuSet == null || cpuSet.length <= 0) {
+                        cpuSet = containerMetrics.getCpuSetCpus();
+                    }
                     if (cpuSet != null && cpuSet.length > 0) {
                         double systemLoad = 0.0;
                         for (int cpu : cpuSet) {
@@ -182,7 +186,7 @@
 
     private boolean isCpuSetSameAsHostCpuSet() {
         if (containerMetrics != null && containerMetrics.getCpuSetCpus() != null) {
-            return containerMetrics.getCpuSetCpus().length == getHostConfiguredCpuCount0();
+            return containerMetrics.getCpuSetCpus().length == getHostOnlineCpuCount0();
         }
         return false;
     }
@@ -200,6 +204,7 @@
     private native long getTotalSwapSpaceSize0();
     private native double getSingleCpuLoad0(int cpuNum);
     private native int getHostConfiguredCpuCount0();
+    private native int getHostOnlineCpuCount0();
 
     static {
         initialize0();