From 8e626ad5e6fed39f16f02390a00b5775514a390f Mon Sep 17 00:00:00 2001 From: Henning Baldersheim Date: Mon, 25 Apr 2022 14:32:25 +0200 Subject: Report direct memory usage --- .../model/admin/monitoring/VespaMetricSet.java | 5 ++++ .../container/jdisc/metric/MetricUpdater.java | 35 +++++++++++++++++----- 2 files changed, 33 insertions(+), 7 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 3a8cf23a49e..1b6b43625f7 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 @@ -191,6 +191,11 @@ public class VespaMetricSet { metrics.add(new Metric("mem.heap.used.max")); metrics.add(new Metric("jdisc.memory_mappings.max")); metrics.add(new Metric("jdisc.open_file_descriptors.max")); + metrics.add(new Metric("mem.direct.total.average")); + metrics.add(new Metric("mem.direct.free.average")); + 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("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 8def68e9f04..62982d66978 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,7 +5,8 @@ import com.google.inject.Inject; import com.yahoo.component.AbstractComponent; import com.yahoo.jdisc.Metric; import com.yahoo.jdisc.statistics.ContainerWatchdogMetrics; - +import java.lang.management.BufferPoolMXBean; +import java.lang.management.ManagementFactory; import java.nio.file.DirectoryStream; import java.nio.file.Files; import java.nio.file.Path; @@ -23,9 +24,13 @@ import java.util.TimerTask; */ public class MetricUpdater extends AbstractComponent { - private static final String FREE_MEMORY_BYTES = "mem.heap.free"; - private static final String USED_MEMORY_BYTES = "mem.heap.used"; - private static final String TOTAL_MEMORY_BYTES = "mem.heap.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"; + private static final String DIRECT_FREE_MEMORY_BYTES = "mem.direct.free"; + private static final String DIRECT_USED_MEMORY_BYTES = "mem.direct.used"; + private static final String DIRECT_TOTAL_MEMORY_BYTES = "mem.direct.total"; + private static final String DIRECT_COUNT = "mem.direct.count"; private static final String MEMORY_MAPPINGS_COUNT = "jdisc.memory_mappings"; private static final String OPEN_FILE_DESCRIPTORS = "jdisc.open_file_descriptors"; @@ -96,16 +101,32 @@ public class MetricUpdater extends AbstractComponent { this.jrtMetrics = new JrtMetrics(metric); } + private void directMemoryUsed() { + long count = 0; + long used = 0; + long total = 0; + for (BufferPoolMXBean pool : ManagementFactory.getPlatformMXBeans(BufferPoolMXBean.class)) { + count += pool.getCount(); + used += pool.getMemoryUsed(); + total += pool.getTotalCapacity(); + } + metric.set(DIRECT_FREE_MEMORY_BYTES, total - used, null); + metric.set(DIRECT_USED_MEMORY_BYTES, used, null); + metric.set(DIRECT_TOTAL_MEMORY_BYTES, total, null); + metric.set(DIRECT_COUNT, count, null); + } + @Override public void run() { long freeMemory = runtime.freeMemory(); long totalMemory = runtime.totalMemory(); long usedMemory = totalMemory - freeMemory; - metric.set(FREE_MEMORY_BYTES, freeMemory, null); - metric.set(USED_MEMORY_BYTES, usedMemory, null); - metric.set(TOTAL_MEMORY_BYTES, totalMemory, null); + metric.set(HEAP_FREE_MEMORY_BYTES, freeMemory, null); + metric.set(HEAP_USED_MEMORY_BYTES, usedMemory, null); + metric.set(HEAP_TOTAL_MEMORY_BYTES, totalMemory, null); metric.set(MEMORY_MAPPINGS_COUNT, count_mappings(), null); metric.set(OPEN_FILE_DESCRIPTORS, count_open_files(), null); + directMemoryUsed(); containerWatchdogMetrics.emitMetrics(metric); garbageCollectionMetrics.emitMetrics(metric); -- cgit v1.2.3 From da8e72f4ea80dd4a27ff2c7ca4ec955999de5fb4 Mon Sep 17 00:00:00 2001 From: Henning Baldersheim Date: Mon, 25 Apr 2022 15:57:25 +0200 Subject: Update expected number of metrics --- .../test/java/com/yahoo/container/jdisc/metric/MetricUpdaterTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 0701c5268b9..68d73a7914a 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 @@ -20,14 +20,14 @@ import static org.mockito.Mockito.verify; public class MetricUpdaterTest { @Test - public void metrics_are_updated_in_scheduler_cycle() throws InterruptedException { + public void metrics_are_updated_in_scheduler_cycle() { int gcCount = ManagementFactory.getGarbageCollectorMXBeans().size(); Metric metric = mock(Metric.class); ContainerWatchdogMetrics containerWatchdogMetrics = mock(ContainerWatchdogMetrics.class); new MetricUpdater(new MockScheduler(), metric, containerWatchdogMetrics); verify(containerWatchdogMetrics, times(1)).emitMetrics(any()); - verify(metric, times(5 + 2 * gcCount)).set(anyString(), any(), any()); + verify(metric, times(9 + 2 * gcCount)).set(anyString(), any(), any()); } private static class MockScheduler implements MetricUpdater.Scheduler { -- cgit v1.2.3