< prev index next >
src/java.base/linux/classes/jdk/internal/platform/cgroupv2/CgroupV2Subsystem.java
Print this page
@ rev 57734 : Review feedback
|
o rev 57733 : 8231111: Cgroups v2: Rework Metrics in java.base so as to recognize unified hierarchy
| Reviewed-by: bobv, mchung
~
o rev 56862 : 8231111: Cgroups v2: Rework Metrics in java.base so as to recognize unified hierarchy
| Reviewed-by: bobv
~
@@ -32,14 +32,15 @@
import java.util.stream.Collectors;
import jdk.internal.platform.CgroupSubsystem;
import jdk.internal.platform.CgroupSubsystemController;
import jdk.internal.platform.CgroupUtil;
-import jdk.internal.platform.Metrics;
public class CgroupV2Subsystem implements CgroupSubsystem {
+ private static final long[] LONG_ARRAY_NOT_SUPPORTED = null;
+ private static final int[] INT_ARRAY_UNAVAILABLE = null;
private final CgroupSubsystemController unified;
private static final String PROVIDER_NAME = "cgroupv2";
private static final int PER_CPU_SHARES = 1024;
private static final String MAX_VAL = "max";
private static final Object EMPTY_STR = "";
@@ -49,38 +50,48 @@
}
private long getLongVal(String file) {
return CgroupSubsystemController.getLongValue(unified,
file,
- CgroupV2SubsystemController::convertStringToLong);
+ CgroupV2SubsystemController::convertStringToLong,
+ CgroupSubsystem.LONG_RETVAL_UNLIMITED);
}
@Override
public String getProvider() {
return PROVIDER_NAME;
}
@Override
public long getCpuUsage() {
- long micros = CgroupSubsystemController.getLongEntry(unified, "cpu.stat", "usage_usec");
+ long micros = CgroupV2SubsystemController.getLongEntry(unified, "cpu.stat", "usage_usec");
+ if (micros < 0) {
+ return micros;
+ }
return TimeUnit.MICROSECONDS.toNanos(micros);
}
@Override
public long[] getPerCpuUsage() {
- return null; // Not supported.
+ return LONG_ARRAY_NOT_SUPPORTED;
}
@Override
public long getCpuUserUsage() {
- long micros = CgroupSubsystemController.getLongEntry(unified, "cpu.stat", "user_usec");
+ long micros = CgroupV2SubsystemController.getLongEntry(unified, "cpu.stat", "user_usec");
+ if (micros < 0) {
+ return micros;
+ }
return TimeUnit.MICROSECONDS.toNanos(micros);
}
@Override
public long getCpuSystemUsage() {
- long micros = CgroupSubsystemController.getLongEntry(unified, "cpu.stat", "system_usec");
+ long micros = CgroupV2SubsystemController.getLongEntry(unified, "cpu.stat", "system_usec");
+ if (micros < 0) {
+ return micros;
+ }
return TimeUnit.MICROSECONDS.toNanos(micros);
}
@Override
public long getCpuPeriod() {
@@ -94,33 +105,33 @@
private long getFromCpuMax(int tokenIdx) {
String cpuMaxRaw = CgroupSubsystemController.getStringValue(unified, "cpu.max");
if (cpuMaxRaw == null) {
// likely file not found
- return Metrics.LONG_RETVAL_UNLIMITED;
+ return CgroupSubsystem.LONG_RETVAL_UNLIMITED;
}
// $MAX $PERIOD
String[] tokens = cpuMaxRaw.split("\\s+");
if (tokens.length != 2) {
- return Metrics.LONG_RETVAL_UNLIMITED;
+ return CgroupSubsystem.LONG_RETVAL_UNLIMITED;
}
String quota = tokens[tokenIdx];
return limitFromString(quota);
}
private long limitFromString(String strVal) {
- if (MAX_VAL.equals(strVal)) {
- return Metrics.LONG_RETVAL_UNLIMITED;
+ if (strVal == null || MAX_VAL.equals(strVal)) {
+ return CgroupSubsystem.LONG_RETVAL_UNLIMITED;
}
return Long.parseLong(strVal);
}
@Override
public long getCpuShares() {
long sharesRaw = getLongVal("cpu.weight");
- if (sharesRaw == 100 || sharesRaw == 0) {
- return Metrics.LONG_RETVAL_UNLIMITED;
+ if (sharesRaw == 100 || sharesRaw <= 0) {
+ return CgroupSubsystem.LONG_RETVAL_UNLIMITED;
}
int shares = (int)sharesRaw;
// CPU shares (OCI) value needs to get translated into
// a proper Cgroups v2 value. See:
// https://github.com/containers/crun/blob/master/crun.1.md#cpu-controller
@@ -143,21 +154,24 @@
return x;
}
@Override
public long getCpuNumPeriods() {
- return CgroupSubsystemController.getLongEntry(unified, "cpu.stat", "nr_periods");
+ return CgroupV2SubsystemController.getLongEntry(unified, "cpu.stat", "nr_periods");
}
@Override
public long getCpuNumThrottled() {
- return CgroupSubsystemController.getLongEntry(unified, "cpu.stat", "nr_throttled");
+ return CgroupV2SubsystemController.getLongEntry(unified, "cpu.stat", "nr_throttled");
}
@Override
public long getCpuThrottledTime() {
- long micros = CgroupSubsystemController.getLongEntry(unified, "cpu.stat", "throttled_usec");
+ long micros = CgroupV2SubsystemController.getLongEntry(unified, "cpu.stat", "throttled_usec");
+ if (micros < 0) {
+ return micros;
+ }
return TimeUnit.MICROSECONDS.toNanos(micros);
}
@Override
public long getEffectiveCpuCount() {
@@ -165,133 +179,71 @@
}
@Override
public int[] getCpuSetCpus() {
String cpuSetVal = CgroupSubsystemController.getStringValue(unified, "cpuset.cpus");
- if (cpuSetVal == null || EMPTY_STR.equals(cpuSetVal)) {
- return null; // not available
- }
- return CgroupSubsystemController.stringRangeToIntArray(cpuSetVal);
+ return getCpuSet(cpuSetVal);
}
@Override
public int[] getEffectiveCpuSetCpus() {
String effCpuSetVal = CgroupSubsystemController.getStringValue(unified, "cpuset.cpus.effective");
- if (effCpuSetVal == null || EMPTY_STR.equals(effCpuSetVal)) {
- return null; // not available
- }
- return CgroupSubsystemController.stringRangeToIntArray(effCpuSetVal);
+ return getCpuSet(effCpuSetVal);
}
@Override
public int[] getCpuSetMems() {
- return CgroupSubsystemController.stringRangeToIntArray(CgroupSubsystemController.getStringValue(unified, "cpuset.mems"));
+ String cpuSetMems = CgroupSubsystemController.getStringValue(unified, "cpuset.mems");
+ return getCpuSet(cpuSetMems);
}
@Override
public int[] getEffectiveCpuSetMems() {
- return CgroupSubsystemController.stringRangeToIntArray(CgroupSubsystemController.getStringValue(unified, "cpuset.mems.effective"));
+ String effCpuSetMems = CgroupSubsystemController.getStringValue(unified, "cpuset.mems.effective");
+ return getCpuSet(effCpuSetMems);
}
- @Override
- public double getCpuSetMemoryPressure() {
- return Metrics.DOUBLE_RETVAL_NOT_SUPPORTED;
+ private int[] getCpuSet(String cpuSetVal) {
+ if (cpuSetVal == null || EMPTY_STR.equals(cpuSetVal)) {
+ return INT_ARRAY_UNAVAILABLE;
}
-
- @Override
- public Boolean isCpuSetMemoryPressureEnabled() {
- return Metrics.BOOL_RETVAL_NOT_SUPPORTED;
+ return CgroupSubsystemController.stringRangeToIntArray(cpuSetVal);
}
@Override
public long getMemoryFailCount() {
- return CgroupSubsystemController.getLongEntry(unified, "memory.events", "max");
+ return CgroupV2SubsystemController.getLongEntry(unified, "memory.events", "max");
}
@Override
public long getMemoryLimit() {
String strVal = CgroupSubsystemController.getStringValue(unified, "memory.max");
return limitFromString(strVal);
}
@Override
- public long getMemoryMaxUsage() {
- return Metrics.LONG_RETVAL_NOT_SUPPORTED;
- }
-
- @Override
public long getMemoryUsage() {
return getLongVal("memory.current");
}
@Override
- public long getKernelMemoryFailCount() {
- return Metrics.LONG_RETVAL_NOT_SUPPORTED;
- }
-
- @Override
- public long getKernelMemoryLimit() {
- return Metrics.LONG_RETVAL_NOT_SUPPORTED;
- }
-
- @Override
- public long getKernelMemoryMaxUsage() {
- return Metrics.LONG_RETVAL_NOT_SUPPORTED;
- }
-
- @Override
- public long getKernelMemoryUsage() {
- return Metrics.LONG_RETVAL_NOT_SUPPORTED;
- }
-
- @Override
- public long getTcpMemoryFailCount() {
- return Metrics.LONG_RETVAL_NOT_SUPPORTED;
- }
-
- @Override
- public long getTcpMemoryLimit() {
- return Metrics.LONG_RETVAL_NOT_SUPPORTED;
- }
-
- @Override
- public long getTcpMemoryMaxUsage() {
- return Metrics.LONG_RETVAL_NOT_SUPPORTED;
- }
-
- @Override
public long getTcpMemoryUsage() {
- return CgroupSubsystemController.getLongEntry(unified, "memory.stat", "sock");
- }
-
- @Override
- public long getMemoryAndSwapFailCount() {
- return Metrics.LONG_RETVAL_NOT_SUPPORTED;
+ return CgroupV2SubsystemController.getLongEntry(unified, "memory.stat", "sock");
}
@Override
public long getMemoryAndSwapLimit() {
String strVal = CgroupSubsystemController.getStringValue(unified, "memory.swap.max");
return limitFromString(strVal);
}
@Override
- public long getMemoryAndSwapMaxUsage() {
- return Metrics.LONG_RETVAL_NOT_SUPPORTED;
- }
-
- @Override
public long getMemoryAndSwapUsage() {
return getLongVal("memory.swap.current");
}
@Override
- public Boolean isMemoryOOMKillEnabled() {
- return Metrics.BOOL_RETVAL_NOT_SUPPORTED;
- }
-
- @Override
public long getMemorySoftLimit() {
String softLimitStr = CgroupSubsystemController.getStringValue(unified, "memory.high");
return limitFromString(softLimitStr);
}
@@ -310,11 +262,11 @@
try {
return CgroupUtil.readFilePrivileged(Paths.get(unified.path(), "io.stat"))
.map(mapFunc)
.collect(Collectors.summingLong(e -> e));
} catch (IOException e) {
- return Metrics.LONG_RETVAL_NOT_SUPPORTED;
+ return CgroupSubsystem.LONG_RETVAL_UNLIMITED;
}
}
private static String[] getRWIOMatchTokenNames() {
return new String[] { "rios", "wios" };
< prev index next >