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.
*/