【问题标题】:Ignite persistence performance hit and metricsIgnite 持久性性能命中和指标
【发布时间】:2023-01-05 18:53:28
【问题描述】:

我正在 Apache Ignite 中尝试本机持久性。我的设置当前是本地的单节点集群。我通过在我的数据区域中添加此属性来启用它

<property name="persistenceEnabled" value="true"/>

我的完整数据区域配置如下

<bean class="org.apache.ignite.configuration.DataRegionConfiguration">
  <property name="name" value="dr.local.input.trade"/>
  <property name="persistenceEnabled" value="true"/>
  <property name="metricsEnabled" value="true"/>
  <property name="initialSize" value="#{200 * 1024 * 1024}"/>
  <property name="maxSize" value="#{500 * 1024 * 1024}"/>
  <property name="pageEvictionMode" value="RANDOM_2_LRU"/>
</bean>

现在条目被持久化了,也就是说,如果我关闭 Ignite 并重新启动它,那么我的数据就会回到缓存中。

我看到显着的性能下降。与非持久数据区域相比,put 操作延迟增加了大约 35%。我已经参考了 Ignite 持久性调整页面。从中我挑选出以下属性及其属性

Property Value
WAL Modes LOG_ONLY
walCompactionLevel 3
walCompationEnabled true
writeThrottlingEnabled true
checkpointBufferSize 512 mb
checkpointFrequency 5 minutes

还有什么我可以调整的吗?我上面提到的性能损失是典型的还是可以降低更多?

我还尝试使用 JConsole 查看与持久性相关的 JMX 指标。我正在检查 org.apache.368239c8.ignitelocal."Persistent Store" 下的指标。这里提到的所有指标都显示为 0。数据肯定是持久的,我可以在 Ignite 工作目录和 WAL 目录中看到。我在看错误的指标吗?请帮忙。

【问题讨论】:

  • 您的 DataRegion 配置是什么?它的大小是否与以前的内存配置相同?说到指标,您必须明确启用它们。是否仅涉及写入或读取操作也受到影响?
  • 编辑了我的问题,添加了数据区域配置。我通过提供与 JMX 相关的 JVM 参数启用了 JMX 指标。我可以看到所有其他指标。我没有收到您的问题“它的大小是否与内存配置中的大小保持一致?”

标签: caching persistence ignite


【解决方案1】:

说到写入可能的性能下降。

与纯内存模式相比,更新时会发生以下磁盘交互:

  • 除了 RAM 中的页面修改之外,Ignite 还需要根据您的 WAL 模式提供一致性保证,但除非未禁用它,否则每次更新都必须写入 WAL 文件。磁盘上还没有刷新数据;修改仅发生在内存中 + WAL 记录被写入。

  • 一旦 RAM 中有太多脏页,或者发生超时,Ignite 将启动 checkpointing process 将磁盘上的脏页刷新到磁盘上的分区文件。

  • 如果 WAL 变得太大,Ignite 可能会通过将它们复制到 WAL 存档来执行段轮换,以释放空间用于新的 WAL 更新。

如您所见,至少有 3 个与磁盘相关的主要操作,这意味着为 /wal、/walarchive 和 /db 安装文件夹提供真正快速的磁盘是至关重要的。同样,这完全取决于您的用例,但通常强烈建议为 WAL 相关活动提供最快的可用磁盘。

读取性能可能下降。

同样,这取决于场景,但如果您可以将所有数据放入内存中(就像打开持久性之前一样),您将不会看到任何性能差异。

需要注意的是,重启后,启动时 RAM 中将没有数据,Ignite 必须先预加载它们,即进行预热。

但是,如果您的数据多于配置的数据区域大小,则会发生 page replacement 将数据从磁盘旋转到磁盘。更糟糕的情况:比如说,您有一个 10 GB 的 RAM 数据区域和 11 GB 的数据集。并且您想按字母顺序扫描您的数据两次。

RAM中还没有数据;假设您重新启动了。 Ignite 开始从磁盘读取数据并将数据页填充到内存中。想象一下,在字母 W 之后,我们的内存数据集变满了,需要翻页来加载剩余的 W-Z 数据。在这种情况下,最旧的页面需要被逐出——也就是说,A-D 块需要转到磁盘以加载 W-Z 数据。因此,您的内存数据集现在类似于 W-Z、E-V。如果我们要进行相同的扫描查询,则需要类似地替换整个数据集。

启用持久性指标。

检查您的数据区域配置中是否具有以下属性,更多详细信息here

<property name="metricsEnabled" value="true"/>

此外,没有必要

<property name="pageEvictionMode" value="RANDOM_2_LRU"/>

它仅适用于非持久性区域。

【讨论】:

  • 感谢您的深入回答。我在 DR 配置中添加了 metricsEnabled=true,但在“持久存储”JMX 部分中我仍然看不到任何内容。另外我真的不明白 WAL 何时生效。即使使用非持久性 DR,我也会看到 WAL 目录中填充了段。
  • 哦,是的,这是真的。 WAL 不仅是为了持久化而编写的,也是为了内存中的。
  • 为什么即使在设置metricsEnabled=true 之后我也看不到与持久性相关的指标?
  • 我可以想到以下几点:a) 确保您为具体数据区域启用了指标,即此属性位于您的 <bean class="org.apache.ignite.configuration.DataRegionConfiguration"> 中,并且 b) 检查您是否正在使用适当的数据区域进行指标监控。如果您没有为该区域配置缓存并且它不是持久的,我认为您将看不到任何指标。
  • 如果您在获取指标方面仍有问题,请分享您的配置,我会看一下。
猜你喜欢
  • 2020-02-05
  • 2017-01-15
  • 2018-05-19
  • 1970-01-01
  • 2022-01-15
  • 2013-03-26
  • 2013-07-17
  • 1970-01-01
  • 2012-01-24
相关资源
最近更新 更多