< prev index next >
src/java.base/linux/classes/jdk/internal/platform/cgroupv1/Metrics.java
Print this page
@ rev 54202 : 8217338: [Containers] Improve systemd slice memory limit support
| Summary: Use hierachical memory limit in addition to memory_limits_in_bytes
~ Reviewed-by: duke
*** 23,41 ****
* questions.
*/
package jdk.internal.platform.cgroupv1;
- import java.io.BufferedReader;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;
public class Metrics implements jdk.internal.platform.Metrics {
! private SubSystem memory;
private SubSystem cpu;
private SubSystem cpuacct;
private SubSystem cpuset;
private SubSystem blkio;
private boolean activeSubSystems;
--- 23,42 ----
* questions.
*/
package jdk.internal.platform.cgroupv1;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;
+ import jdk.internal.platform.cgroupv1.SubSystem.MemorySubSystem;
+
public class Metrics implements jdk.internal.platform.Metrics {
! private MemorySubSystem memory;
private SubSystem cpu;
private SubSystem cpuacct;
private SubSystem cpuset;
private SubSystem blkio;
private boolean activeSubSystems;
*** 131,141 ****
String[] subsystemNames = p.getFileName().toString().split(",");
for (String subsystemName: subsystemNames) {
switch (subsystemName) {
case "memory":
! metric.setMemorySubSystem(new SubSystem(mountentry[3], mountentry[4]));
break;
case "cpuset":
metric.setCpuSetSubSystem(new SubSystem(mountentry[3], mountentry[4]));
break;
case "cpuacct":
--- 132,142 ----
String[] subsystemNames = p.getFileName().toString().split(",");
for (String subsystemName: subsystemNames) {
switch (subsystemName) {
case "memory":
! metric.setMemorySubSystem(new MemorySubSystem(mountentry[3], mountentry[4]));
break;
case "cpuset":
metric.setCpuSetSubSystem(new SubSystem(mountentry[3], mountentry[4]));
break;
case "cpuacct":
*** 193,219 ****
}
}
if (subsystem != null) {
subsystem.setPath(base);
metric.setActiveSubSystems();
}
if (subsystem2 != null) {
subsystem2.setPath(base);
}
}
private void setActiveSubSystems() {
activeSubSystems = true;
}
private boolean activeSubSystems() {
return activeSubSystems;
}
! private void setMemorySubSystem(SubSystem memory) {
this.memory = memory;
}
private void setCpuSubSystem(SubSystem cpu) {
this.cpu = cpu;
--- 194,230 ----
}
}
if (subsystem != null) {
subsystem.setPath(base);
+ if (subsystem instanceof MemorySubSystem) {
+ MemorySubSystem memorySubSystem = (MemorySubSystem)subsystem;
+ boolean isHierarchial = getHierarchical(memorySubSystem);
+ memorySubSystem.setHierarchical(isHierarchial);
+ }
metric.setActiveSubSystems();
}
if (subsystem2 != null) {
subsystem2.setPath(base);
}
}
+ private static boolean getHierarchical(MemorySubSystem subsystem) {
+ long hierarchical = SubSystem.getLongValue(subsystem, "memory.use_hierarchy");
+ return hierarchical > 0;
+ }
+
private void setActiveSubSystems() {
activeSubSystems = true;
}
private boolean activeSubSystems() {
return activeSubSystems;
}
! private void setMemorySubSystem(MemorySubSystem memory) {
this.memory = memory;
}
private void setCpuSubSystem(SubSystem cpu) {
this.cpu = cpu;
*** 364,376 ****
--- 375,407 ----
return SubSystem.getLongValue(memory, "memory.failcnt");
}
public long getMemoryLimit() {
long retval = SubSystem.getLongValue(memory, "memory.limit_in_bytes");
+ if (retval > unlimited_minimum) {
+ if (memory.isHierarchical()) {
+ // memory.limit_in_bytes returned unlimited, attempt
+ // hierarchical memory limit
+ String match = "hierarchical_memory_limit";
+ retval = SubSystem.getLongValueMatchingLine(memory,
+ "memory.stat",
+ match,
+ Metrics::convertHierachicalLimitLine);
+ }
+ }
return retval > unlimited_minimum ? -1L : retval;
}
+ public static long convertHierachicalLimitLine(String line) {
+ String[] tokens = line.split("\\s");
+ if (tokens.length == 2) {
+ String strVal = tokens[1];
+ return SubSystem.convertStringToLong(strVal);
+ }
+ return unlimited_minimum + 1; // unlimited
+ }
+
public long getMemoryMaxUsage() {
return SubSystem.getLongValue(memory, "memory.max_usage_in_bytes");
}
public long getMemoryUsage() {
*** 415,424 ****
--- 446,466 ----
return SubSystem.getLongValue(memory, "memory.memsw.failcnt");
}
public long getMemoryAndSwapLimit() {
long retval = SubSystem.getLongValue(memory, "memory.memsw.limit_in_bytes");
+ if (retval > unlimited_minimum) {
+ if (memory.isHierarchical()) {
+ // memory.memsw.limit_in_bytes returned unlimited, attempt
+ // hierarchical memory limit
+ String match = "hierarchical_memsw_limit";
+ retval = SubSystem.getLongValueMatchingLine(memory,
+ "memory.stat",
+ match,
+ Metrics::convertHierachicalLimitLine);
+ }
+ }
return retval > unlimited_minimum ? -1L : retval;
}
public long getMemoryAndSwapMaxUsage() {
return SubSystem.getLongValue(memory, "memory.memsw.max_usage_in_bytes");
< prev index next >