This is an automated email from the ASF dual-hosted git repository.

alexpl pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git


The following commit(s) were added to refs/heads/master by this push:
     new bb4e9be5438 IGNITE-18823 Add page read time and page replace time 
metrics - Fixes #10545.
bb4e9be5438 is described below

commit bb4e9be54383525d1d7160a92379dfe007acd0c1
Author: Aleksey Plekhanov <[email protected]>
AuthorDate: Tue Feb 28 11:00:44 2023 +0300

    IGNITE-18823 Add page read time and page replace time metrics - Fixes 
#10545.
    
    Signed-off-by: Aleksey Plekhanov <[email protected]>
---
 .../cache/persistence/DataRegionMetricsImpl.java   | 28 +++++++--
 .../cache/persistence/pagemem/PageMemoryImpl.java  | 19 ++++--
 .../db/IgnitePdsDataRegionMetricsTest.java         | 70 ++++++++++++++++++++++
 3 files changed, 108 insertions(+), 9 deletions(-)

diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/DataRegionMetricsImpl.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/DataRegionMetricsImpl.java
index 7d7750c34a4..0b76ca2d70d 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/DataRegionMetricsImpl.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/DataRegionMetricsImpl.java
@@ -118,12 +118,18 @@ public class DataRegionMetricsImpl implements 
DataRegionMetrics {
     /** */
     private final LongAdderMetric readPages;
 
+    /** */
+    private final LongAdderMetric readPagesTime;
+
     /** */
     private final LongAdderMetric writtenPages;
 
     /** */
     private final LongAdderMetric replacedPages;
 
+    /** */
+    private final LongAdderMetric pageReplaceTime;
+
     /** */
     private final AtomicLongMetric offHeapSize;
 
@@ -241,12 +247,18 @@ public class DataRegionMetricsImpl implements 
DataRegionMetrics {
         readPages = mreg.longAdderMetric("PagesRead",
             "Number of pages read from last restart.");
 
+        readPagesTime = mreg.longAdderMetric("PagesReadTime",
+            "Total pages read time in nanoseconds since last restart.");
+
         writtenPages = mreg.longAdderMetric("PagesWritten",
             "Number of pages written from last restart.");
 
         replacedPages = mreg.longAdderMetric("PagesReplaced",
             "Number of pages replaced from last restart.");
 
+        pageReplaceTime = mreg.longAdderMetric("PagesReplaceTime",
+            "Total pages replace time in nanoseconds since last restart.");
+
         offHeapSize = mreg.longMetric("OffHeapSize",
             "Offheap size in bytes.");
 
@@ -519,24 +531,30 @@ public class DataRegionMetricsImpl implements 
DataRegionMetrics {
     }
 
     /**
-     * Updates pageReplaceRate metric.
+     * Updates page replacement metrics.
      */
-    public void updatePageReplaceRate(long pageAge) {
+    public void onPageReplaced(long pageAge, long nanos) {
         if (metricsEnabled) {
             pageReplaceRate.increment();
 
             pageReplaceAge.add(pageAge);
 
             replacedPages.increment();
+
+            pageReplaceTime.add(nanos);
         }
     }
 
     /**
      * Updates page read.
+     *
+     * @param nanos Time consumed by page reading.
      */
-    public void onPageRead() {
-        if (metricsEnabled)
+    public void onPageRead(long nanos) {
+        if (metricsEnabled) {
             readPages.increment();
+            readPagesTime.add(nanos);
+        }
     }
 
     /**
@@ -783,8 +801,10 @@ public class DataRegionMetricsImpl implements 
DataRegionMetrics {
         largeEntriesPages.reset();
         dirtyPages.reset();
         readPages.reset();
+        readPagesTime.reset();
         writtenPages.reset();
         replacedPages.reset();
+        pageReplaceTime.reset();
         offHeapSize.reset();
         checkpointBufSize.reset();
         allocRate.reset();
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/pagemem/PageMemoryImpl.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/pagemem/PageMemoryImpl.java
index ef2ac4336eb..5acbe2dab88 100755
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/pagemem/PageMemoryImpl.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/pagemem/PageMemoryImpl.java
@@ -926,6 +926,8 @@ public class PageMemoryImpl implements PageMemoryEx {
 
                 long actualPageId = 0;
 
+                long startReadTs = System.nanoTime();
+
                 try {
                     pmPageMgr.read(grpId, pageId, buf, false);
 
@@ -933,7 +935,7 @@ public class PageMemoryImpl implements PageMemoryEx {
 
                     actualPageId = PageIO.getPageId(buf);
 
-                    dataRegionMetrics.onPageRead();
+                    dataRegionMetrics.onPageRead(System.nanoTime() - 
startReadTs);
 
                     if (PageIO.isIndexPage(PageIO.getType(buf)))
                         
dataRegionMetrics.cacheGrpPageMetrics(grpId).indexPages().increment();
@@ -954,7 +956,7 @@ public class PageMemoryImpl implements PageMemoryEx {
 
                     statHolder.trackPhysicalAndLogicalRead(pageAddr);
 
-                    dataRegionMetrics.onPageRead();
+                    dataRegionMetrics.onPageRead(System.nanoTime() - 
startReadTs);
                 }
                 finally {
                     rwLock.writeUnlock(lockedPageAbsPtr + PAGE_LOCK_OFFSET,
@@ -2211,8 +2213,6 @@ public class PageMemoryImpl implements PageMemoryEx {
                 checkpointPages.markAsSaved(fullPageId);
             }
 
-            dataRegionMetrics.updatePageReplaceRate(U.currentTimeMillis() - 
PageHeader.readTimestamp(absPtr));
-
             loadedPages.remove(fullPageId.groupId(), 
fullPageId.effectivePageId());
 
             if (PageIO.isIndexPage(PageIO.getType(absPtr + PAGE_OVERHEAD))) {
@@ -2344,7 +2344,16 @@ public class PageMemoryImpl implements PageMemoryEx {
             if (acquiredPages() >= loadedPages.size())
                 throw oomException("all pages are acquired");
 
-            return pageReplacementPolicy.replace();
+            long replaceStartTs = System.nanoTime();
+
+            long page = pageReplacementPolicy.replace();
+
+            dataRegionMetrics.onPageReplaced(
+                U.currentTimeMillis() - 
PageHeader.readTimestamp(absolute(page)),
+                System.nanoTime() - replaceStartTs
+            );
+
+            return page;
         }
 
         /**
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/db/IgnitePdsDataRegionMetricsTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/db/IgnitePdsDataRegionMetricsTest.java
index 3d44f23d49a..1557951332e 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/db/IgnitePdsDataRegionMetricsTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/db/IgnitePdsDataRegionMetricsTest.java
@@ -25,6 +25,7 @@ import java.util.Map;
 import java.util.Random;
 import java.util.UUID;
 import java.util.concurrent.ThreadLocalRandom;
+import java.util.concurrent.atomic.AtomicBoolean;
 import org.apache.ignite.DataRegionMetrics;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
@@ -44,23 +45,31 @@ import 
org.apache.ignite.internal.processors.cache.persistence.file.FilePageStor
 import org.apache.ignite.internal.util.future.GridFutureAdapter;
 import org.apache.ignite.internal.util.typedef.T2;
 import org.apache.ignite.internal.util.typedef.internal.CU;
+import org.apache.ignite.spi.metric.LongMetric;
+import org.apache.ignite.spi.metric.ReadOnlyMetricRegistry;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 import org.junit.Assert;
 import org.junit.Test;
 
 import static java.nio.file.Files.newDirectoryStream;
 import static 
org.apache.ignite.configuration.DataStorageConfiguration.DFLT_DATA_REG_DEFAULT_NAME;
+import static org.apache.ignite.events.EventType.EVT_PAGE_REPLACEMENT_STARTED;
 import static 
org.apache.ignite.internal.processors.cache.GridCacheUtils.UTILITY_CACHE_NAME;
 import static 
org.apache.ignite.internal.processors.cache.mvcc.txlog.TxLog.TX_LOG_CACHE_NAME;
+import static 
org.apache.ignite.internal.processors.cache.persistence.DataRegionMetricsImpl.DATAREGION_METRICS_PREFIX;
 import static 
org.apache.ignite.internal.processors.cache.persistence.file.FilePageStoreManager.partId;
 import static 
org.apache.ignite.internal.processors.cache.persistence.metastorage.MetaStorage.METASTORAGE_CACHE_ID;
 import static 
org.apache.ignite.internal.processors.cache.persistence.metastorage.MetaStorage.METASTORAGE_CACHE_NAME;
 import static 
org.apache.ignite.internal.processors.cache.persistence.metastorage.MetaStorage.METASTORAGE_DIR_NAME;
+import static 
org.apache.ignite.internal.processors.metric.impl.MetricUtils.metricName;
 
 /**
  *
  */
 public class IgnitePdsDataRegionMetricsTest extends GridCommonAbstractTest {
+    /** */
+    private static final String SMALL_REGION = "SmallRegion";
+
     /** */
     private static final long INIT_REGION_SIZE = 20 << 20;
 
@@ -83,6 +92,8 @@ public class IgnitePdsDataRegionMetricsTest extends 
GridCommonAbstractTest {
     @Override protected IgniteConfiguration getConfiguration(String 
igniteInstanceName) throws Exception {
         IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName);
 
+        cfg.setIncludeEventTypes(EVT_PAGE_REPLACEMENT_STARTED);
+
         DataStorageConfiguration memCfg = new DataStorageConfiguration()
             .setDefaultDataRegionConfiguration(
                 new DataRegionConfiguration()
@@ -97,6 +108,12 @@ public class IgnitePdsDataRegionMetricsTest extends 
GridCommonAbstractTest {
                     .setMaxSize(MAX_REGION_SIZE)
                     .setPersistenceEnabled(true)
                     .setMetricsEnabled(true))
+            .setDataRegionConfigurations(
+                new DataRegionConfiguration()
+                    .setName(SMALL_REGION)
+                    .setMaxSize(INIT_REGION_SIZE)
+                    .setPersistenceEnabled(true)
+                    .setMetricsEnabled(true))
             .setCheckpointFrequency(1000);
 
         cfg.setDataStorageConfiguration(memCfg);
@@ -294,6 +311,59 @@ public class IgnitePdsDataRegionMetricsTest extends 
GridCommonAbstractTest {
         Assert.assertTrue(metricsResult.get().get2() > 0);
     }
 
+    /**
+     *
+     */
+    @Test
+    public void testReadMetrics() throws Exception {
+        int cnt = 100;
+
+        IgniteEx ignite = startGrid();
+
+        ignite.cluster().state(ClusterState.ACTIVE);
+
+        IgniteCache<Object, Object> cache = ignite.getOrCreateCache(new 
CacheConfiguration<>("smallRegionCache")
+            .setDataRegionName(SMALL_REGION));
+
+        for (int i = 0; i < cnt; i++)
+            cache.put(i, i);
+
+        ignite.cluster().state(ClusterState.INACTIVE);
+
+        ignite.cluster().state(ClusterState.ACTIVE);
+
+        ReadOnlyMetricRegistry mreg = 
ignite.context().metric().registry(metricName(DATAREGION_METRICS_PREFIX,
+            SMALL_REGION));
+
+        LongMetric readPages = mreg.findMetric("PagesRead");
+        LongMetric readPagesTime = mreg.findMetric("PagesReadTime");
+        LongMetric replPages = mreg.findMetric("PagesReplaced");
+        LongMetric replPagesTime = mreg.findMetric("PagesReplaceTime");
+
+        assertTrue(readPages.value() > 0);
+        assertTrue(readPagesTime.value() > 0);
+        assertEquals(0, replPages.value());
+        assertEquals(0, replPagesTime.value());
+
+        AtomicBoolean replacementStarted = new AtomicBoolean();
+
+        ignite.events().remoteListen((uuid, evt) -> {
+            if (evt.type() == EVT_PAGE_REPLACEMENT_STARTED) {
+                replacementStarted.set(true);
+
+                return false;
+            }
+
+            return true;
+        }, null, EVT_PAGE_REPLACEMENT_STARTED);
+
+        while (!replacementStarted.get())
+            cache.put(cnt++, new byte[1000]);
+
+        assertTrue(replPages.value() > 0);
+        assertTrue(replPagesTime.value() > 0);
+    }
+
     /**
      * @param ig Ignite.
      */

Reply via email to