From c711bbc5ad37a91d283770ad1343787e297890ab Mon Sep 17 00:00:00 2001 From: Andrea Cavalli Date: Mon, 4 Apr 2022 11:16:20 +0200 Subject: [PATCH] Explain the hard-coded rocksdb settings --- pom.xml | 2 +- src/main/data-generator/quic-rpc.yaml | 1 + .../disk/LLLocalKeyValueDatabase.java | 33 +++++++++++++------ .../dbengine/LocalTemporaryDbGenerator.java | 3 +- .../dbengine/MemoryTemporaryDbGenerator.java | 3 +- 5 files changed, 29 insertions(+), 13 deletions(-) diff --git a/pom.xml b/pom.xml index 91274a7..299fdaf 100644 --- a/pom.xml +++ b/pom.xml @@ -330,7 +330,7 @@ org.rocksdb rocksdbjni - 7.0.3 + 7.0.4 org.apache.lucene diff --git a/src/main/data-generator/quic-rpc.yaml b/src/main/data-generator/quic-rpc.yaml index 3782bc9..8f11375 100644 --- a/src/main/data-generator/quic-rpc.yaml +++ b/src/main/data-generator/quic-rpc.yaml @@ -235,6 +235,7 @@ versions: memtableMemoryBudgetBytes: -long blockCache: -long setCacheIndexAndFilterBlocks: -boolean + spinning: boolean DatabaseVolume: data: volumePath: Path diff --git a/src/main/java/it/cavallium/dbengine/database/disk/LLLocalKeyValueDatabase.java b/src/main/java/it/cavallium/dbengine/database/disk/LLLocalKeyValueDatabase.java index 60b908e..e9458ba 100644 --- a/src/main/java/it/cavallium/dbengine/database/disk/LLLocalKeyValueDatabase.java +++ b/src/main/java/it/cavallium/dbengine/database/disk/LLLocalKeyValueDatabase.java @@ -143,12 +143,6 @@ public class LLLocalKeyValueDatabase implements LLKeyValueDatabase { descriptors.add(new ColumnFamilyDescriptor(RocksDB.DEFAULT_COLUMN_FAMILY)); for (Column column : columns) { var columnOptions = new ColumnFamilyOptions(); - columnOptions.setMaxBytesForLevelBase(256 * SizeUnit.MB); - columnOptions.setMaxBytesForLevelMultiplier(10); - columnOptions.setLevelCompactionDynamicLevelBytes(true); - columnOptions.setLevel0FileNumCompactionTrigger(2); - columnOptions.setLevel0SlowdownWritesTrigger(20); - columnOptions.setLevel0StopWritesTrigger(36); //noinspection ConstantConditions if (databaseOptions.memtableMemoryBudgetBytes() != null) { @@ -158,6 +152,20 @@ public class LLLocalKeyValueDatabase implements LLKeyValueDatabase { .orElse(databaseOptions.lowMemory() ? 16L * SizeUnit.MB : 128L * SizeUnit.MB)); } + // https://www.arangodb.com/docs/stable/programs-arangod-rocksdb.html + columnOptions.setMaxBytesForLevelBase(256 * SizeUnit.MB); + // https://www.arangodb.com/docs/stable/programs-arangod-rocksdb.html + columnOptions.setMaxBytesForLevelMultiplier(10); + // https://www.arangodb.com/docs/stable/programs-arangod-rocksdb.html + // https://github.com/facebook/rocksdb/wiki/Tuning-RocksDB-on-Spinning-Disks + columnOptions.setLevelCompactionDynamicLevelBytes(true); + // https://www.arangodb.com/docs/stable/programs-arangod-rocksdb.html + columnOptions.setLevel0FileNumCompactionTrigger(2); + // https://www.arangodb.com/docs/stable/programs-arangod-rocksdb.html + columnOptions.setLevel0SlowdownWritesTrigger(20); + // https://www.arangodb.com/docs/stable/programs-arangod-rocksdb.html + columnOptions.setLevel0StopWritesTrigger(36); + if (!databaseOptions.levels().isEmpty()) { var firstLevelOptions = getRocksLevelOptions(databaseOptions.levels().get(0)); columnOptions.setCompressionType(firstLevelOptions.compressionType); @@ -198,11 +206,16 @@ public class LLLocalKeyValueDatabase implements LLKeyValueDatabase { tableOptions.setOptimizeFiltersForMemory(true); tableOptions.setVerifyCompression(false); } + boolean cacheIndexAndFilterBlocks = databaseOptions.setCacheIndexAndFilterBlocks().orElse(true); + if (databaseOptions.spinning()) { + // https://github.com/facebook/rocksdb/wiki/Tuning-RocksDB-on-Spinning-Disks + cacheIndexAndFilterBlocks = true; + } tableOptions .setPinTopLevelIndexAndFilter(true) .setPinL0FilterAndIndexBlocksInCache(true) .setCacheIndexAndFilterBlocksWithHighPriority(true) - .setCacheIndexAndFilterBlocks(databaseOptions.setCacheIndexAndFilterBlocks().orElse(true)) + .setCacheIndexAndFilterBlocks(cacheIndexAndFilterBlocks) .setPartitionFilters(true) .setIndexType(IndexType.kTwoLevelIndexSearch) .setFormatVersion(5) @@ -211,11 +224,11 @@ public class LLLocalKeyValueDatabase implements LLKeyValueDatabase { .setBlockCacheCompressed(optionsWithCache.compressedCache()) .setBlockCache(optionsWithCache.standardCache()) // Spinning disks: 64KiB to 256KiB (also 512KiB). SSDs: 16KiB - .setBlockSize(256 * 1024); + // https://github.com/facebook/rocksdb/wiki/Tuning-RocksDB-on-Spinning-Disks + .setBlockSize((databaseOptions.spinning() ? 256 : 16) * SizeUnit.KB); - //columnOptions.setLevelCompactionDynamicLevelBytes(true); columnOptions.setTableFormatConfig(tableOptions); - columnOptions.setCompactionPriority(CompactionPriority.OldestSmallestSeqFirst); + columnOptions.setCompactionPriority(CompactionPriority.MinOverlappingRatio); descriptors.add(new ColumnFamilyDescriptor(column.name().getBytes(StandardCharsets.US_ASCII), columnOptions)); } diff --git a/src/test/java/it/cavallium/dbengine/LocalTemporaryDbGenerator.java b/src/test/java/it/cavallium/dbengine/LocalTemporaryDbGenerator.java index 20ecaa3..5efc24f 100644 --- a/src/test/java/it/cavallium/dbengine/LocalTemporaryDbGenerator.java +++ b/src/test/java/it/cavallium/dbengine/LocalTemporaryDbGenerator.java @@ -96,7 +96,8 @@ public class LocalTemporaryDbGenerator implements TemporaryDbGenerator { Nullableint.of(-1), Nullablelong.empty(), Nullablelong.empty(), - Nullableboolean.empty() + Nullableboolean.empty(), + false ) ), conn.getLuceneIndex("testluceneindex1", diff --git a/src/test/java/it/cavallium/dbengine/MemoryTemporaryDbGenerator.java b/src/test/java/it/cavallium/dbengine/MemoryTemporaryDbGenerator.java index 5df3755..dc28c21 100644 --- a/src/test/java/it/cavallium/dbengine/MemoryTemporaryDbGenerator.java +++ b/src/test/java/it/cavallium/dbengine/MemoryTemporaryDbGenerator.java @@ -67,7 +67,8 @@ public class MemoryTemporaryDbGenerator implements TemporaryDbGenerator { Nullableint.of(-1), Nullablelong.empty(), Nullablelong.empty(), - Nullableboolean.empty() + Nullableboolean.empty(), + false ) ), conn.getLuceneIndex("testluceneindex1",