diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2022-04-27 15:51:09 +0200 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2022-04-27 15:51:09 +0200 |
commit | 2b0994346361e2e292dc390abd21129ba527f39f (patch) | |
tree | 922d718015f270b8820d0315bc2f296ac8256061 | |
parent | a69561e12789d506c3b45f81ffda4baae05b3965 (diff) |
Report metrics for the size of the native heap.
6 files changed, 76 insertions, 5 deletions
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/VespaMetricSet.java b/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/VespaMetricSet.java index 1b6b43625f7..f66e987bea6 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/VespaMetricSet.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/VespaMetricSet.java @@ -196,6 +196,10 @@ public class VespaMetricSet { metrics.add(new Metric("mem.direct.used.average")); metrics.add(new Metric("mem.direct.used.max")); metrics.add(new Metric("mem.direct.count.max")); + metrics.add(new Metric("mem.native.total.average")); + metrics.add(new Metric("mem.native.free.average")); + metrics.add(new Metric("mem.native.used.average")); + metrics.add(new Metric("mem.native.used.max")); metrics.add(new Metric("jdisc.gc.count.average")); metrics.add(new Metric("jdisc.gc.count.max")); diff --git a/container-disc/src/main/java/com/yahoo/container/jdisc/metric/MetricUpdater.java b/container-disc/src/main/java/com/yahoo/container/jdisc/metric/MetricUpdater.java index 62982d66978..4659c2acc36 100644 --- a/container-disc/src/main/java/com/yahoo/container/jdisc/metric/MetricUpdater.java +++ b/container-disc/src/main/java/com/yahoo/container/jdisc/metric/MetricUpdater.java @@ -5,6 +5,8 @@ import com.google.inject.Inject; import com.yahoo.component.AbstractComponent; import com.yahoo.jdisc.Metric; import com.yahoo.jdisc.statistics.ContainerWatchdogMetrics; +import com.yahoo.nativec.NativeHeap; + import java.lang.management.BufferPoolMXBean; import java.lang.management.ManagementFactory; import java.nio.file.DirectoryStream; @@ -24,6 +26,9 @@ import java.util.TimerTask; */ public class MetricUpdater extends AbstractComponent { + private static final String NATIVE_FREE_MEMORY_BYTES = "mem.native.free"; + private static final String NATIVE_USED_MEMORY_BYTES = "mem.native.used"; + private static final String NATIVE_TOTAL_MEMORY_BYTES = "mem.native.total"; private static final String HEAP_FREE_MEMORY_BYTES = "mem.heap.free"; private static final String HEAP_USED_MEMORY_BYTES = "mem.heap.used"; private static final String HEAP_TOTAL_MEMORY_BYTES = "mem.heap.total"; @@ -116,6 +121,13 @@ public class MetricUpdater extends AbstractComponent { metric.set(DIRECT_COUNT, count, null); } + private void nativeHeapUsed() { + NativeHeap nativeHeap = NativeHeap.sample(); + metric.set(NATIVE_FREE_MEMORY_BYTES, nativeHeap.availableSize(), null); + metric.set(NATIVE_USED_MEMORY_BYTES, nativeHeap.usedSize(), null); + metric.set(NATIVE_TOTAL_MEMORY_BYTES, nativeHeap.totalSize(), null); + } + @Override public void run() { long freeMemory = runtime.freeMemory(); @@ -127,6 +139,7 @@ public class MetricUpdater extends AbstractComponent { metric.set(MEMORY_MAPPINGS_COUNT, count_mappings(), null); metric.set(OPEN_FILE_DESCRIPTORS, count_open_files(), null); directMemoryUsed(); + nativeHeapUsed(); containerWatchdogMetrics.emitMetrics(metric); garbageCollectionMetrics.emitMetrics(metric); diff --git a/container-disc/src/test/java/com/yahoo/container/jdisc/metric/MetricUpdaterTest.java b/container-disc/src/test/java/com/yahoo/container/jdisc/metric/MetricUpdaterTest.java index 68d73a7914a..f49ccf2c2f6 100644 --- a/container-disc/src/test/java/com/yahoo/container/jdisc/metric/MetricUpdaterTest.java +++ b/container-disc/src/test/java/com/yahoo/container/jdisc/metric/MetricUpdaterTest.java @@ -27,7 +27,7 @@ public class MetricUpdaterTest { ContainerWatchdogMetrics containerWatchdogMetrics = mock(ContainerWatchdogMetrics.class); new MetricUpdater(new MockScheduler(), metric, containerWatchdogMetrics); verify(containerWatchdogMetrics, times(1)).emitMetrics(any()); - verify(metric, times(9 + 2 * gcCount)).set(anyString(), any(), any()); + verify(metric, times(12 + 2 * gcCount)).set(anyString(), any(), any()); } private static class MockScheduler implements MetricUpdater.Scheduler { diff --git a/vespajlib/src/main/java/com/yahoo/nativec/MallInfo.java b/vespajlib/src/main/java/com/yahoo/nativec/MallInfo.java index a4f5486ccf1..d7da1b2d8c2 100644 --- a/vespajlib/src/main/java/com/yahoo/nativec/MallInfo.java +++ b/vespajlib/src/main/java/com/yahoo/nativec/MallInfo.java @@ -2,7 +2,7 @@ package com.yahoo.nativec; import com.sun.jna.Structure; -public class MallInfo { +public class MallInfo extends NativeHeap { private final static Throwable initException = NativeC.loadLibrary(MallInfo.class); public static Throwable init() { return initException; @@ -23,8 +23,27 @@ public class MallInfo { public int keepcost; /* Top-most, releasable space (bytes) */ } private static native MallInfoStruct.ByValue mallinfo(); + + private final MallInfoStruct mallinfo; public MallInfo() { mallinfo = mallinfo(); } - private final MallInfoStruct mallinfo; + + @Override + public long usedSize() { + long v = mallinfo.uordblks; + return v << 20; // Due to too few bits in ancient mallinfo vespamalloc reports in 1M units + } + + @Override + public long totalSize() { + long v = mallinfo.arena; + return v << 20; // Due to too few bits in ancient mallinfo vespamalloc reports in 1M units + } + + @Override + public long availableSize() { + long v = mallinfo.fordblks; + return v << 20; // Due to too few bits in ancient mallinfo vespamalloc reports in 1M units + } } diff --git a/vespajlib/src/main/java/com/yahoo/nativec/MallInfo2.java b/vespajlib/src/main/java/com/yahoo/nativec/MallInfo2.java index 1ae3bc590e2..9e94bad8d40 100644 --- a/vespajlib/src/main/java/com/yahoo/nativec/MallInfo2.java +++ b/vespajlib/src/main/java/com/yahoo/nativec/MallInfo2.java @@ -2,7 +2,7 @@ package com.yahoo.nativec; import com.sun.jna.Structure; -public class MallInfo2 { +public class MallInfo2 extends NativeHeap { private final static Throwable initException = NativeC.loadLibrary(MallInfo2.class); public static Throwable init() { return initException; @@ -23,8 +23,24 @@ public class MallInfo2 { public long keepcost; /* Top-most, releasable space (bytes) */ } private static native MallInfo2Struct.ByValue mallinfo2(); + private final MallInfo2Struct mallinfo; + public MallInfo2() { mallinfo = mallinfo2(); } - private final MallInfo2Struct mallinfo; + + @Override + public long usedSize() { + return mallinfo.uordblks; + } + + @Override + public long totalSize() { + return mallinfo.arena; + } + + @Override + public long availableSize() { + return mallinfo.fordblks; + } } diff --git a/vespajlib/src/main/java/com/yahoo/nativec/NativeHeap.java b/vespajlib/src/main/java/com/yahoo/nativec/NativeHeap.java new file mode 100644 index 00000000000..929ebdd1737 --- /dev/null +++ b/vespajlib/src/main/java/com/yahoo/nativec/NativeHeap.java @@ -0,0 +1,19 @@ +package com.yahoo.nativec; + +import com.sun.jna.Platform; + +public class NativeHeap { + public long usedSize() { return 0; } + public long totalSize() { return 0; } + public long availableSize() { return 0; } + public static NativeHeap sample() { + if (Platform.isLinux()) { + GLibcVersion version = new GLibcVersion(); + if ((version.major() >= 3) || ((version.major() == 2) && (version.minor() >= 33))) { + return new MallInfo2(); + } + return new MallInfo(); + } + return new NativeHeap(); + } +} |