This is an automated email from the ASF dual-hosted git repository.
chenyz pushed a commit to branch pbtree_page_concurrency
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/pbtree_page_concurrency by
this push:
new c9148d155a6 Add pbtree configuration and volatile size statistics
(#11958)
c9148d155a6 is described below
commit c9148d155a621f670b37f40e82c0f999d1a532a8
Author: Chen YZ <[email protected]>
AuthorDate: Thu Jan 25 13:21:09 2024 +0800
Add pbtree configuration and volatile size statistics (#11958)
* add volatile size statistics
* add config
* fix ut
---
.../java/org/apache/iotdb/db/conf/IoTDBConfig.java | 95 ++++++++++++++++++++++
.../org/apache/iotdb/db/conf/IoTDBDescriptor.java | 84 ++++++++++++++++++-
.../rescon/CachedSchemaRegionStatistics.java | 15 ++++
.../mtree/impl/pbtree/CachedMTreeStore.java | 3 +-
.../impl/pbtree/memcontrol/MemoryStatistics.java | 10 ++-
.../mtree/impl/pbtree/memory/IMemoryManager.java | 3 +-
.../mtree/impl/pbtree/memory/MemoryManager.java | 17 ++--
.../resources/conf/iotdb-common.properties | 28 +++++++
8 files changed, 243 insertions(+), 12 deletions(-)
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
index ce5c4e5796a..0c108a68461 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
@@ -998,6 +998,21 @@ public class IoTDBConfig {
/** Memory allocated for PartitionCache */
private long allocateMemoryForPartitionCache = allocateMemoryForSchema / 10;
+ private int[] schemaRegionNodePageProportion = new int[] {2, 1};
+ /** Memory allocated for SchemaRegionNode in PBTree Mode */
+ private long allocateMemoryForSchemaRegionNode =
allocateMemoryForSchemaRegion;
+
+ /** Memory allocated for SchemaRegionPage in PBTree Mode */
+ private long allocateMemoryForSchemaRegionPage = 16 * 16 * 1024; // 256KB
+
+ private int[] pagePoolCacheBufferProportion = new int[] {1, 3};
+ private int pbtreeCachePageNum = 4;
+ private int pbtreeBufferPageNum = 12;
+ private double pbtreeNodeReleaseThresholdRatio = 0.7;
+ private double pbtreeNodeFlushThresholdRatio = 0.1;
+ private int pbtreePageFlushMaxNumber = 10;
+ private double pbtreePageFlushMinDirtyRatio = 0.3;
+
/** Policy of DataNodeSchemaCache eviction */
private String dataNodeSchemaCacheEvictionPolicy = "FIFO";
@@ -3231,6 +3246,86 @@ public class IoTDBConfig {
this.allocateMemoryForPartitionCache = allocateMemoryForPartitionCache;
}
+ public int[] getSchemaRegionNodePageProportion() {
+ return schemaRegionNodePageProportion;
+ }
+
+ public void setSchemaRegionNodePageProportion(int[]
schemaRegionNodePageProportion) {
+ this.schemaRegionNodePageProportion = schemaRegionNodePageProportion;
+ }
+
+ public long getAllocateMemoryForSchemaRegionNode() {
+ return allocateMemoryForSchemaRegionNode;
+ }
+
+ public void setAllocateMemoryForSchemaRegionNode(long
allocateMemoryForSchemaRegionNode) {
+ this.allocateMemoryForSchemaRegionNode = allocateMemoryForSchemaRegionNode;
+ }
+
+ public long getAllocateMemoryForSchemaRegionPage() {
+ return allocateMemoryForSchemaRegionPage;
+ }
+
+ public void setAllocateMemoryForSchemaRegionPage(long
allocateMemoryForSchemaRegionPage) {
+ this.allocateMemoryForSchemaRegionPage = allocateMemoryForSchemaRegionPage;
+ }
+
+ public int[] getPagePoolCacheBufferProportion() {
+ return pagePoolCacheBufferProportion;
+ }
+
+ public void setPagePoolCacheBufferProportion(int[]
pagePoolCacheBufferProportion) {
+ this.pagePoolCacheBufferProportion = pagePoolCacheBufferProportion;
+ }
+
+ public int getPbtreeCachePageNum() {
+ return pbtreeCachePageNum;
+ }
+
+ public void setPbtreeCachePageNum(int pbtreeCachePageNum) {
+ this.pbtreeCachePageNum = pbtreeCachePageNum;
+ }
+
+ public int getPbtreeBufferPageNum() {
+ return pbtreeBufferPageNum;
+ }
+
+ public void setPbtreeBufferPageNum(int pbtreeBufferPageNum) {
+ this.pbtreeBufferPageNum = pbtreeBufferPageNum;
+ }
+
+ public double getPbtreeNodeReleaseThresholdRatio() {
+ return pbtreeNodeReleaseThresholdRatio;
+ }
+
+ public void setPbtreeNodeReleaseThresholdRatio(double
pbtreeNodeReleaseThresholdRatio) {
+ this.pbtreeNodeReleaseThresholdRatio = pbtreeNodeReleaseThresholdRatio;
+ }
+
+ public double getPbtreeNodeFlushThresholdRatio() {
+ return pbtreeNodeFlushThresholdRatio;
+ }
+
+ public void setPbtreeNodeFlushThresholdRatio(double
pbtreeNodeFlushThresholdRatio) {
+ this.pbtreeNodeFlushThresholdRatio = pbtreeNodeFlushThresholdRatio;
+ }
+
+ public int getPbtreePageFlushMaxNumber() {
+ return pbtreePageFlushMaxNumber;
+ }
+
+ public void setPbtreePageFlushMaxNumber(int pbtreePageFlushMaxNumber) {
+ this.pbtreePageFlushMaxNumber = pbtreePageFlushMaxNumber;
+ }
+
+ public double getPbtreePageFlushMinDirtyRatio() {
+ return pbtreePageFlushMinDirtyRatio;
+ }
+
+ public void setPbtreePageFlushMinDirtyRatio(double
pbtreePageFlushMinDirtyRatio) {
+ this.pbtreePageFlushMinDirtyRatio = pbtreePageFlushMinDirtyRatio;
+ }
+
public String getDataNodeSchemaCacheEvictionPolicy() {
return dataNodeSchemaCacheEvictionPolicy;
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java
index 5f0616bc08c..8aaae6db5f0 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java
@@ -212,6 +212,9 @@ public class IoTDBDescriptor {
}
public void loadProperties(Properties properties) throws
BadNodeUrlException, IOException {
+ // commons
+ commonDescriptor.loadCommonProps(properties);
+
conf.setClusterName(
properties.getProperty(IoTDBConstant.CLUSTER_NAME,
conf.getClusterName()).trim());
@@ -977,8 +980,6 @@ public class IoTDBDescriptor {
"coordinator_write_executor_size",
Integer.toString(conf.getCoordinatorWriteExecutorSize()))));
- // commons
- commonDescriptor.loadCommonProps(properties);
commonDescriptor.initCommonConfigDir(conf.getSystemDir());
// timed flush memtable
@@ -1904,6 +1905,85 @@ public class IoTDBDescriptor {
conf.setAllocateMemoryForPartitionCache(
schemaMemoryTotal * conf.getSchemaMemoryProportion()[2] /
proportionSum);
LOGGER.info("allocateMemoryForPartitionCache = {}",
conf.getAllocateMemoryForPartitionCache());
+
+ // Load PBTree mode memory configuration.
+ // Make sure common config is loaded before this.
+ if (commonDescriptor.getConfig().getSchemaEngineMode().equals("PBTree")) {
+ String nodePageProportionInput =
properties.getProperty("pbtree_node_page_proportion");
+ if (nodePageProportionInput != null) {
+ String[] proportions = nodePageProportionInput.split(":");
+ int loadedProportionSum = 0;
+ for (String proportion : proportions) {
+ loadedProportionSum += Integer.parseInt(proportion.trim());
+ }
+ if (loadedProportionSum != 0) {
+ conf.setSchemaRegionNodePageProportion(
+ new int[] {
+ Integer.parseInt(proportions[0].trim()),
Integer.parseInt(proportions[1].trim())
+ });
+ }
+ }
+ String cacheBufferProportionInput =
+ properties.getProperty("pbtree_page_pool_cache_buffer_proportion");
+ if (cacheBufferProportionInput != null) {
+ String[] proportions = cacheBufferProportionInput.split(":");
+ int loadedProportionSum = 0;
+ for (String proportion : proportions) {
+ loadedProportionSum += Integer.parseInt(proportion.trim());
+ }
+ if (loadedProportionSum != 0) {
+ conf.setPagePoolCacheBufferProportion(
+ new int[] {
+ Integer.parseInt(proportions[0].trim()),
Integer.parseInt(proportions[1].trim())
+ });
+ }
+ }
+ proportionSum = 0;
+ for (int proportion : conf.getSchemaRegionNodePageProportion()) {
+ proportionSum += proportion;
+ }
+ long pagePoolSize =
+ conf.getAllocateMemoryForSchemaRegion()
+ * conf.getSchemaRegionNodePageProportion()[1]
+ / proportionSum
+ / (16 * 1024);
+ conf.setAllocateMemoryForSchemaRegionPage(pagePoolSize * 16 * 1024);
+ LOGGER.info(
+ "allocateMemoryForSchemaRegionPage = {}",
conf.getAllocateMemoryForSchemaRegionPage());
+ conf.setAllocateMemoryForSchemaRegionNode(
+ conf.getAllocateMemoryForSchemaRegion() -
conf.getAllocateMemoryForSchemaRegionPage());
+ LOGGER.info(
+ "allocateMemoryForSchemaRegionNode = {}",
conf.getAllocateMemoryForSchemaRegionNode());
+ proportionSum = 0;
+ for (int proportion : conf.getPagePoolCacheBufferProportion()) {
+ proportionSum += proportion;
+ }
+ conf.setPbtreeCachePageNum(
+ (int) (pagePoolSize * conf.getPagePoolCacheBufferProportion()[0] /
proportionSum));
+ LOGGER.info("pbtreeCachePageNum = {}", conf.getPbtreeCachePageNum());
+ conf.setPbtreeBufferPageNum((int) (pagePoolSize -
conf.getPbtreeCachePageNum()));
+ LOGGER.info("pbtreeBufferPageNum = {}", conf.getPbtreeBufferPageNum());
+ conf.setPbtreeNodeReleaseThresholdRatio(
+ Double.parseDouble(
+ properties.getProperty(
+ "pbtree_node_release_threshold_ratio",
+
Double.toString(conf.getPbtreeNodeReleaseThresholdRatio()))));
+ conf.setPbtreeNodeFlushThresholdRatio(
+ Double.parseDouble(
+ properties.getProperty(
+ "pbtree_node_flush_threshold_ratio",
+ Double.toString(conf.getPbtreeNodeFlushThresholdRatio()))));
+ conf.setPbtreePageFlushMaxNumber(
+ Integer.parseInt(
+ properties.getProperty(
+ "pbtree_page_flush_max_number",
+ Integer.toString(conf.getPbtreePageFlushMaxNumber()))));
+ conf.setPbtreePageFlushMinDirtyRatio(
+ Double.parseDouble(
+ properties.getProperty(
+ "pbtree_page_flush_min_dirty_ratio",
+ Double.toString(conf.getPbtreePageFlushMinDirtyRatio()))));
+ }
}
@SuppressWarnings("squid:S3518") // "proportionSum" can't be zero
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/rescon/CachedSchemaRegionStatistics.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/rescon/CachedSchemaRegionStatistics.java
index 488b55da118..4b08cf12cc4 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/rescon/CachedSchemaRegionStatistics.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/rescon/CachedSchemaRegionStatistics.java
@@ -31,6 +31,7 @@ public class CachedSchemaRegionStatistics extends
MemSchemaRegionStatistics {
private final AtomicLong unpinnedMemorySize = new AtomicLong(0);
private final AtomicLong pinnedMemorySize = new AtomicLong(0);
+ private final AtomicLong volatileMNodeSize = new AtomicLong(0);
private final AtomicLong unpinnedMNodeNum = new AtomicLong(0);
private final AtomicLong pinnedMNodeNum = new AtomicLong(0);
private final AtomicLong volatileMNodeNum = new AtomicLong(0);
@@ -71,6 +72,10 @@ public class CachedSchemaRegionStatistics extends
MemSchemaRegionStatistics {
this.volatileMNodeNum.addAndGet(delta);
}
+ public void updateVolatileMNodeSize(int delta) {
+ this.volatileMNodeSize.addAndGet(delta);
+ }
+
public void setMlogCheckPoint(long mlogCheckPoint) {
this.mlogCheckPoint = mlogCheckPoint;
}
@@ -103,6 +108,10 @@ public class CachedSchemaRegionStatistics extends
MemSchemaRegionStatistics {
return volatileMNodeNum.get();
}
+ public long getVolatileMNodeSize() {
+ return volatileMNodeSize.get();
+ }
+
public long getCacheNodeNum() {
return memoryManager == null ? 0 : memoryManager.getCacheNodeNum();
}
@@ -124,5 +133,11 @@ public class CachedSchemaRegionStatistics extends
MemSchemaRegionStatistics {
cachedEngineStatistics.updateUnpinnedMNodeNum(-unpinnedMNodeNum.get());
cachedEngineStatistics.updatePinnedMemorySize(-pinnedMemorySize.get());
cachedEngineStatistics.updateUnpinnedMemorySize(-unpinnedMemorySize.get());
+ pinnedMNodeNum.set(0L);
+ unpinnedMNodeNum.set(0L);
+ pinnedMemorySize.set(0L);
+ unpinnedMemorySize.set(0L);
+ volatileMNodeNum.set(0L);
+ volatileMNodeSize.set(0L);
}
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/CachedMTreeStore.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/CachedMTreeStore.java
index d4d2e73e46c..4b894a19a23 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/CachedMTreeStore.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/CachedMTreeStore.java
@@ -373,8 +373,7 @@ public class CachedMTreeStore implements
IMTreeStore<ICachedMNode> {
lockManager.threadReadLock(node.getParent(), true);
}
try {
- operation.accept(node);
- memoryManager.updateCacheStatusAfterUpdate(node);
+ memoryManager.updateCacheStatusAndUpdate(node, operation);
} finally {
if (!node.isDatabase()) {
lockManager.threadReadUnlock(node.getParent());
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/memcontrol/MemoryStatistics.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/memcontrol/MemoryStatistics.java
index 3fef9dc2b26..5aa67533e7b 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/memcontrol/MemoryStatistics.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/memcontrol/MemoryStatistics.java
@@ -83,11 +83,17 @@ public class MemoryStatistics {
regionStatistics.updatePinnedMemorySize(deltaSize);
}
- public void addVolatileNode() {
+ public void addVolatileNode(ICachedMNode node) {
regionStatistics.updateVolatileMNodeNum(1);
+ regionStatistics.updateVolatileMNodeSize(node.estimateSize());
}
- public void removeVolatileNode() {
+ public void removeVolatileNode(ICachedMNode node) {
regionStatistics.updateVolatileMNodeNum(-1);
+ regionStatistics.updateVolatileMNodeSize(-node.estimateSize());
+ }
+
+ public void updateVolatileNodeSize(int deltaSize) {
+ regionStatistics.updateVolatileMNodeSize(deltaSize);
}
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/memory/IMemoryManager.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/memory/IMemoryManager.java
index 103c3a3954e..950ca4184ea 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/memory/IMemoryManager.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/memory/IMemoryManager.java
@@ -26,6 +26,7 @@ import
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.pbtree.mnode.ICa
import java.util.Iterator;
import java.util.concurrent.atomic.AtomicLong;
+import java.util.function.Consumer;
/**
* This class implemented the cache management, involving the cache status
management on per MNode
@@ -59,7 +60,7 @@ public interface IMemoryManager {
void updateCacheStatusAfterAppend(ICachedMNode node);
- void updateCacheStatusAfterUpdate(ICachedMNode node);
+ void updateCacheStatusAndUpdate(ICachedMNode node, Consumer<ICachedMNode>
operation);
IDatabaseMNode<ICachedMNode> collectUpdatedStorageGroupMNodes();
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/memory/MemoryManager.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/memory/MemoryManager.java
index 22b3f139a20..fc6010b9ebe 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/memory/MemoryManager.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/memory/MemoryManager.java
@@ -37,6 +37,7 @@ import java.util.Iterator;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.concurrent.atomic.AtomicLong;
+import java.util.function.Consumer;
import static
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.pbtree.mnode.container.ICachedMNodeContainer.getBelongedContainer;
import static
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.pbtree.mnode.container.ICachedMNodeContainer.getCachedMNodeContainer;
@@ -132,7 +133,7 @@ public class MemoryManager implements IMemoryManager {
pinMNodeWithMemStatusUpdate(node);
CacheEntry cacheEntry = getCacheEntry(node);
cacheEntry.setVolatile(true);
- memoryStatistics.addVolatileNode();
+ memoryStatistics.addVolatileNode(node);
// the ancestors must be processed first since the volatileDescendant
judgement is of higher
// priority than
// children container judgement
@@ -146,10 +147,12 @@ public class MemoryManager implements IMemoryManager {
* volatile subtree it belonged should be added to nodeBuffer.
*
* @param node
+ * @param operation
*/
@Override
- public void updateCacheStatusAfterUpdate(ICachedMNode node) {
+ public void updateCacheStatusAndUpdate(ICachedMNode node,
Consumer<ICachedMNode> operation) {
if (node.isDatabase()) {
+ operation.accept(node);
nodeBuffer.updateDatabaseNodeAfterStatusUpdate(node.getAsDatabaseMNode());
return;
}
@@ -157,11 +160,15 @@ public class MemoryManager implements IMemoryManager {
CacheEntry cacheEntry = getCacheEntry(node);
synchronized (cacheEntry) {
if (cacheEntry.isVolatile()) {
+ int rawSize = node.estimateSize();
+ operation.accept(node);
+ memoryStatistics.updateVolatileNodeSize(node.estimateSize() - rawSize);
return;
}
// the status change affects the subTre collect in nodeBuffer
+ operation.accept(node);
cacheEntry.setVolatile(true);
- memoryStatistics.addVolatileNode();
+ memoryStatistics.addVolatileNode(node);
if (!cacheEntry.hasVolatileDescendant()) {
nodeCache.removeFromNodeCache(cacheEntry);
removeAncestorsFromCache(node);
@@ -339,7 +346,7 @@ public class MemoryManager implements IMemoryManager {
synchronized (cacheEntry) {
cacheEntry.setVolatile(false);
- memoryStatistics.removeVolatileNode();
+ memoryStatistics.removeVolatileNode(node);
container.moveMNodeToCache(node.getName());
if (cacheEntry.hasVolatileDescendant()
@@ -388,7 +395,7 @@ public class MemoryManager implements IMemoryManager {
}
if (cacheEntry.isVolatile()) {
addAncestorsToCache(node);
- memoryStatistics.removeVolatileNode();
+ memoryStatistics.removeVolatileNode(node);
if (!getCacheEntry(node.getParent()).hasVolatileDescendant()) {
nodeBuffer.remove(getCacheEntry(node.getParent()));
}
diff --git
a/iotdb-core/node-commons/src/assembly/resources/conf/iotdb-common.properties
b/iotdb-core/node-commons/src/assembly/resources/conf/iotdb-common.properties
index da20238e2c7..389ba5acafe 100644
---
a/iotdb-core/node-commons/src/assembly/resources/conf/iotdb-common.properties
+++
b/iotdb-core/node-commons/src/assembly/resources/conf/iotdb-common.properties
@@ -298,7 +298,35 @@ data_replication_factor=1
# -1 means unlimited.
# database_limit_threshold = -1
+# Proportion of capacity allocated for node objects to page objects in
SchemaRegion. Calculated based on pbtree_page_pool_size_proportion allocated to
SchemaRegion memory.
+# This parameter only takes effect when schema_engine_mode=PBTree.
+# The parameter form is a:b, where a and b are integers.
+# pbtree_node_page_proportion = 2:1
+
+# Proportion of capacity allocated for dirty pages in the page pool buffer.
This ratio is a recommended value and will be dynamically adjusted during
runtime. For example, when dirty pages are empty, buffer pages can borrow space
from dirty pages.
+# This parameter only takes effect when schema_engine_mode=PBTree.
+# The parameter form is a:b, where a and b are integers.
+# pbtree_page_pool_cache_buffer_proportion = 1:3
+
+# Threshold for NodeCache eviction is SchemaRegion node object capacity *
pbtree_node_release_threshold_ratio.
+# This parameter only takes effect when schema_engine_mode=PBTree.
+# Datatype: double
+# pbtree_node_release_threshold_ratio = 0.7
+
+# Threshold for NodeFlush eviction is SchemaRegion node object capacity *
pbtree_node_flush_threshold_ratio.
+# This parameter only takes effect when schema_engine_mode=PBTree.
+# Datatype: double
+# pbtree_node_flush_threshold_ratio = 0.1
+# During scheduled dirty page flush, at most pbtree_page_flush_max_number
dirty pages are selected for flushing.
+# This parameter only takes effect when schema_engine_mode=PBTree.
+# Datatype: integer
+# pbtree_page_flush_max_number = 10
+
+# During scheduled dirty page flush, only dirty pages with an effective
information rate greater than pbtree_page_flush_min_dirty_ratio are selected
for flushing.
+# This parameter only takes effect when schema_engine_mode=PBTree.
+# Datatype: double
+# pbtree_page_flush_min_dirty_ratio = 0.3
####################
### Configurations for creating schema automatically