Skip to content

Commit ea4ef52

Browse files
authored
perf(wal): add cairo.wal.writer.madvise.mode configuration option (#6841)
1 parent a7f6bd7 commit ea4ef52

File tree

11 files changed

+55
-2
lines changed

11 files changed

+55
-2
lines changed

core/src/main/java/io/questdb/PropServerConfiguration.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -566,6 +566,7 @@ public class PropServerConfiguration implements ServerConfiguration {
566566
private final int walTxnNotificationQueueCapacity;
567567
private final long walWriterDataAppendPageSize;
568568
private final long walWriterEventAppendPageSize;
569+
private final int walWriterMadviseMode;
569570
private final int walWriterPoolMaxSegments;
570571
private final long workStealTimeoutNanos;
571572
private final long writerAsyncCommandBusyWaitTimeout;
@@ -1471,6 +1472,7 @@ public PropServerConfiguration(
14711472
this.parallelIndexThreshold = getInt(properties, env, PropertyKey.CAIRO_PARALLEL_INDEX_THRESHOLD, 100000);
14721473
this.readerPoolMaxSegments = getInt(properties, env, PropertyKey.CAIRO_READER_POOL_MAX_SEGMENTS, 10);
14731474
this.poolSegmentSize = getIntSize(properties, env, PropertyKey.DEBUG_CAIRO_POOL_SEGMENT_SIZE, 32);
1475+
this.walWriterMadviseMode = getWalWriterMadviseMode(properties, env, PropertyKey.CAIRO_WAL_WRITER_MADVISE_MODE);
14741476
this.walWriterPoolMaxSegments = getInt(properties, env, PropertyKey.CAIRO_WAL_WRITER_POOL_MAX_SEGMENTS, 10);
14751477
this.viewWalWriterPoolMaxSegments = getInt(properties, env, PropertyKey.CAIRO_VIEW_WAL_WRITER_POOL_MAX_SEGMENTS, 4);
14761478
this.spinLockTimeout = getMillis(properties, env, PropertyKey.CAIRO_SPIN_LOCK_TIMEOUT, 1_000);
@@ -2255,6 +2257,27 @@ private int getSqlJitMode(Properties properties, @Nullable Map<String, String> e
22552257
return SqlJitMode.JIT_MODE_ENABLED;
22562258
}
22572259

2260+
private int getWalWriterMadviseMode(Properties properties, @Nullable Map<String, String> env, ConfigPropertyKey key) throws ServerConfigurationException {
2261+
final String mode = getString(properties, env, key, "none");
2262+
2263+
// must not be null because we provided non-null default value
2264+
assert mode != null;
2265+
2266+
if (Chars.equalsLowerCaseAscii(mode, "none")) {
2267+
return -1;
2268+
}
2269+
2270+
if (Chars.equalsLowerCaseAscii(mode, "sequential")) {
2271+
return Files.POSIX_MADV_SEQUENTIAL;
2272+
}
2273+
2274+
if (Chars.equalsLowerCaseAscii(mode, "random")) {
2275+
return Files.POSIX_MADV_RANDOM;
2276+
}
2277+
2278+
throw ServerConfigurationException.forInvalidKey(key.getPropertyPath(), mode);
2279+
}
2280+
22582281
// The enterprise version needs to add tcps and https
22592282
private String initIlpTransport() {
22602283
StringSink sink = Misc.getThreadLocalSink();
@@ -4468,6 +4491,11 @@ public int getWalTxnNotificationQueueCapacity() {
44684491
return walTxnNotificationQueueCapacity;
44694492
}
44704493

4494+
@Override
4495+
public int getWalWriterMadviseMode() {
4496+
return walWriterMadviseMode;
4497+
}
4498+
44714499
@Override
44724500
public int getWalWriterPoolMaxSegments() {
44734501
return walWriterPoolMaxSegments;

core/src/main/java/io/questdb/PropertyKey.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -529,6 +529,7 @@ public enum PropertyKey implements ConfigPropertyKey {
529529
CAIRO_WAL_SEGMENT_ROLLOVER_SIZE("cairo.wal.segment.rollover.size"),
530530
CAIRO_WAL_WRITER_DATA_APPEND_PAGE_SIZE("cairo.wal.writer.data.append.page.size"),
531531
CAIRO_WAL_WRITER_EVENT_APPEND_PAGE_SIZE("cairo.wal.writer.event.append.page.size"),
532+
CAIRO_WAL_WRITER_MADVISE_MODE("cairo.wal.writer.madvise.mode"),
532533
CAIRO_WAL_SEQUENCER_CHECK_INTERVAL("cairo.wal.sequencer.check.interval"),
533534
CAIRO_SYSTEM_WAL_WRITER_DATA_APPEND_PAGE_SIZE("cairo.system.wal.writer.data.append.page.size"),
534535
CAIRO_SYSTEM_WAL_WRITER_EVENT_APPEND_PAGE_SIZE("cairo.system.wal.writer.event.append.page.size"),

core/src/main/java/io/questdb/cairo/CairoConfiguration.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -776,6 +776,8 @@ default int getWalPurgeWaitBeforeDelete() {
776776

777777
int getWalTxnNotificationQueueCapacity();
778778

779+
int getWalWriterMadviseMode();
780+
779781
int getWalWriterPoolMaxSegments();
780782

781783
int getWindowColumnPoolCapacity();

core/src/main/java/io/questdb/cairo/CairoConfigurationWrapper.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1356,6 +1356,11 @@ public int getWalTxnNotificationQueueCapacity() {
13561356
return getDelegate().getWalTxnNotificationQueueCapacity();
13571357
}
13581358

1359+
@Override
1360+
public int getWalWriterMadviseMode() {
1361+
return getDelegate().getWalWriterMadviseMode();
1362+
}
1363+
13591364
@Override
13601365
public int getWalWriterPoolMaxSegments() {
13611366
return getDelegate().getWalWriterPoolMaxSegments();

core/src/main/java/io/questdb/cairo/DefaultCairoConfiguration.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1370,6 +1370,11 @@ public int getWalTxnNotificationQueueCapacity() {
13701370
return 4096;
13711371
}
13721372

1373+
@Override
1374+
public int getWalWriterMadviseMode() {
1375+
return -1;
1376+
}
1377+
13731378
@Override
13741379
public int getWalWriterPoolMaxSegments() {
13751380
return 5;

core/src/main/java/io/questdb/cairo/wal/WalWriter.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ public class WalWriter extends WalWriterBase implements TableWriterAPI {
116116

117117
private final AlterOperation alterOp = new AlterOperation();
118118
private final ObjList<MemoryMA> columns;
119+
private final int columnsMadviseMode;
119120
private final DdlListener ddlListener;
120121
private final AtomicIntList initialSymbolCounts;
121122
private final IntList localSymbolIds;
@@ -174,6 +175,7 @@ public WalWriter(
174175
super(configuration, tableToken, tableSequencerAPI, walDirectoryPolicy, walLocker);
175176

176177
LOG.info().$("open [table=").$(tableToken).I$();
178+
this.columnsMadviseMode = configuration.getWalWriterMadviseMode();
177179
this.ddlListener = ddlListener;
178180
this.recentWriteTracker = recentWriteTracker;
179181
this.telemetryWal = telemetryWal;
@@ -1308,7 +1310,7 @@ private void openColumnFiles(CharSequence columnName, int columnType, int column
13081310
-1,
13091311
MemoryTag.MMAP_TABLE_WAL_WRITER,
13101312
configuration.getWriterFileOpenOpts(),
1311-
Files.POSIX_MADV_RANDOM
1313+
columnsMadviseMode
13121314
);
13131315

13141316
final MemoryMA auxMem = getAuxColumn(columnIndex);
@@ -1323,7 +1325,7 @@ private void openColumnFiles(CharSequence columnName, int columnType, int column
13231325
getDataAppendPageSize(),
13241326
MemoryTag.MMAP_TABLE_WAL_WRITER,
13251327
configuration.getWriterFileOpenOpts(),
1326-
Files.POSIX_MADV_RANDOM
1328+
columnsMadviseMode
13271329
);
13281330
}
13291331
} finally {

core/src/main/resources/io/questdb/site/conf/server.conf

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1066,6 +1066,9 @@ cairo.sql.copy.root=import
10661066
# this page size can be reduced. The optimal value should be established via ingestion benchmark.
10671067
#cairo.wal.writer.event.append.page.size=128k
10681068

1069+
# madvise mode for WalWriter memory-mapped files. Valid values: none, sequential, random.
1070+
#cairo.wal.writer.madvise.mode=none
1071+
10691072
# Multiplier to cairo.max.uncommitted.rows to calculate the limit of rows that can kept invisible when writing
10701073
# to WAL table under heavy load, when multiple transactions are to be applied.
10711074
# It is used to reduce the number Out Of Order commits when Out Of Order commits are unavoidable by squashing multiple commits together.

core/src/test/java/io/questdb/test/PropServerConfigurationTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -500,6 +500,7 @@ public void testAllDefaults() throws Exception {
500500
Assert.assertEquals(1048576, configuration.getCairoConfiguration().getWalDataAppendPageSize());
501501
Assert.assertEquals(262144, configuration.getCairoConfiguration().getSystemWalDataAppendPageSize());
502502
Assert.assertTrue(configuration.getCairoConfiguration().isTableTypeConversionEnabled());
503+
Assert.assertEquals(-1, configuration.getCairoConfiguration().getWalWriterMadviseMode());
503504
Assert.assertEquals(10, configuration.getCairoConfiguration().getWalWriterPoolMaxSegments());
504505
Assert.assertTrue(configuration.getCairoConfiguration().isWalApplyParallelSqlEnabled());
505506

@@ -2098,6 +2099,7 @@ private void testSetAllFromFile(CairoConfiguration configuration) {
20982099
Assert.assertFalse(configuration.isWalApplyEnabled());
20992100
Assert.assertEquals(23, configuration.getWalApplyLookAheadTransactionCount());
21002101
Assert.assertFalse(configuration.isTableTypeConversionEnabled());
2102+
Assert.assertEquals(Files.POSIX_MADV_RANDOM, configuration.getWalWriterMadviseMode());
21012103
Assert.assertEquals(100, configuration.getWalWriterPoolMaxSegments());
21022104
Assert.assertEquals(50, configuration.getViewWalWriterPoolMaxSegments());
21032105
Assert.assertEquals(120, configuration.getO3LagCalculationWindowsSize());

core/src/test/java/io/questdb/test/ServerMainTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -723,6 +723,7 @@ public void testShowParameters() throws Exception {
723723
"cairo.view.wal.writer.pool.max.segments\tQDB_CAIRO_VIEW_WAL_WRITER_POOL_MAX_SEGMENTS\t4\tdefault\tfalse\tfalse\n" +
724724
"cairo.wal.sequencer.check.interval\tQDB_CAIRO_WAL_SEQUENCER_CHECK_INTERVAL\t10000\tdefault\tfalse\tfalse\n" +
725725
"cairo.wal.writer.event.append.page.size\tQDB_CAIRO_WAL_WRITER_EVENT_APPEND_PAGE_SIZE\t131072\tdefault\tfalse\tfalse\n" +
726+
"cairo.wal.writer.madvise.mode\tQDB_CAIRO_WAL_WRITER_MADVISE_MODE\tnone\tdefault\tfalse\tfalse\n" +
726727
"cairo.work.steal.timeout.nanos\tQDB_CAIRO_WORK_STEAL_TIMEOUT_NANOS\t10000\tdefault\tfalse\tfalse\n" +
727728
"cairo.writer.alter.busy.wait.timeout\tQDB_CAIRO_WRITER_ALTER_BUSY_WAIT_TIMEOUT\t500\tdefault\tfalse\tfalse\n" +
728729
"cairo.writer.alter.max.wait.timeout\tQDB_CAIRO_WRITER_ALTER_MAX_WAIT_TIMEOUT\t30000\tdefault\tfalse\tfalse\n" +

core/src/test/resources/server.conf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -340,6 +340,7 @@ cairo.wal.enabled.default=true
340340
cairo.wal.purge.interval=333
341341
cairo.wal.segment.rollover.row.count=100
342342
cairo.wal.writer.data.append.page.size=256k
343+
cairo.wal.writer.madvise.mode=random
343344
cairo.system.wal.writer.data.append.page.size=512k
344345
cairo.wal.apply.parallel.sql.enabled=false
345346

0 commit comments

Comments
 (0)