diff options
author | Bjørn Christian Seime <bjorncs@yahooinc.com> | 2023-08-24 09:45:00 +0200 |
---|---|---|
committer | Bjørn Christian Seime <bjorncs@yahooinc.com> | 2023-08-24 09:50:11 +0200 |
commit | 65655cbcadc890bcad907d6cc34995a926c29183 (patch) | |
tree | d0a80d02f648ca6981bea39c70e4073c2672fd5a /node-admin/src/main/java/com | |
parent | a5b9150a448ed1c30d13c64055a0bc534a1b4a95 (diff) |
Add additional metrics for container memory
Diffstat (limited to 'node-admin/src/main/java/com')
3 files changed, 25 insertions, 6 deletions
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/cgroup/MemoryController.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/cgroup/MemoryController.java index 840cd025917..3dc32e14a9d 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/cgroup/MemoryController.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/cgroup/MemoryController.java @@ -31,9 +31,11 @@ public class MemoryController { return cgroup.readIfExists("memory.current").map(Size::from); } - /** @return Number of bytes used to cache filesystem data, including tmpfs and shared memory. */ - public Size readFileSystemCache() { - return Size.from(readField(cgroup.readLines("memory.stat"), "file")); + public Stats readStat() { + var lines = cgroup.readLines("memory.stat"); + return new Stats( + Size.from(readField(lines, "file")), Size.from(readField(lines, "sock")), Size.from(readField(lines, "slab")), + Size.from(readField(lines, "slab_reclaimable")), Size.from(readField(lines, "anon"))); } private static String readField(List<String> lines, String fieldName) { @@ -45,4 +47,13 @@ public class MemoryController { .findFirst() .orElseThrow(() -> new IllegalArgumentException("No such field: " + fieldName)); } + + /** + * @param file Number of bytes used to cache filesystem data, including tmpfs and shared memory. + * @param sock Amount of memory used in network transmission buffers. + * @param slab Amount of memory used for storing in-kernel data structures. + * @param slabReclaimable Part of "slab" that might be reclaimed, such as dentries and inodes. + * @param anon Amount of memory used in anonymous mappings such as brk(), sbrk(), and mmap(MAP_ANONYMOUS). + */ + public record Stats(Size file, Size sock, Size slab, Size slabReclaimable, Size anon) {} } diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/container/ContainerStats.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/container/ContainerStats.java index a5606784c12..1c02072ed2b 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/container/ContainerStats.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/container/ContainerStats.java @@ -44,8 +44,14 @@ public record ContainerStats(Map<String, NetworkStats> networks, * @param cache memory used by cache in bytes * @param usage memory usage in bytes * @param limit memory limit in bytes + * @param sock network transmission buffers in bytes + * @param slab in-kernel data structures in bytes + * @param slabReclaimable part of "slab" that might be reclaimed in bytes + * @param anon anonymous mappings in bytes */ - public record MemoryStats(long cache, long usage, long limit) {} + public record MemoryStats(long cache, long usage, long limit, long sock, long slab, long slabReclaimable, long anon) { + public MemoryStats(long cache, long usage, long limit) { this(cache, usage, limit, 0, 0, 0, 0); } + } /** * Statistics for CPU usage diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/container/ContainerStatsCollector.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/container/ContainerStatsCollector.java index 8244666f9e0..0e16e2cabf6 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/container/ContainerStatsCollector.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/container/ContainerStatsCollector.java @@ -105,8 +105,10 @@ class ContainerStatsCollector { MemoryController memoryController = rootCgroup.resolveContainer(containerId).memory(); Size max = memoryController.readMax(); long memoryUsageInBytes = memoryController.readCurrent().value(); - long cachedInBytes = memoryController.readFileSystemCache().value(); - return new ContainerStats.MemoryStats(cachedInBytes, memoryUsageInBytes, max.isMax() ? -1 : max.value()); + var stats = memoryController.readStat(); + return new ContainerStats.MemoryStats( + stats.file().value(), memoryUsageInBytes, max.isMax() ? -1 : max.value(), + stats.sock().value(), stats.slab().value(), stats.slabReclaimable().value(), stats.anon().value()); } private ContainerStats.NetworkStats collectNetworkStats(String iface, int containerPid) throws IOException { |