aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2022-04-27 15:51:09 +0200
committerHenning Baldersheim <balder@yahoo-inc.com>2022-04-27 15:51:09 +0200
commit2b0994346361e2e292dc390abd21129ba527f39f (patch)
tree922d718015f270b8820d0315bc2f296ac8256061
parenta69561e12789d506c3b45f81ffda4baae05b3965 (diff)
Report metrics for the size of the native heap.
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/VespaMetricSet.java4
-rw-r--r--container-disc/src/main/java/com/yahoo/container/jdisc/metric/MetricUpdater.java13
-rw-r--r--container-disc/src/test/java/com/yahoo/container/jdisc/metric/MetricUpdaterTest.java2
-rw-r--r--vespajlib/src/main/java/com/yahoo/nativec/MallInfo.java23
-rw-r--r--vespajlib/src/main/java/com/yahoo/nativec/MallInfo2.java20
-rw-r--r--vespajlib/src/main/java/com/yahoo/nativec/NativeHeap.java19
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();
+ }
+}