From 868413340f8d6058d74186b65ac3498d6b7f254a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C5=91rinc?= Date: Sun, 5 Jan 2025 21:44:27 +0100 Subject: [PATCH] coins: bump default LevelDB write batch size to 64 MiB The UTXO set has grown significantly, and flushing it from memory to LevelDB often takes over 20 minutes after a successful IBD with large dbcache values. The final UTXO set is written to disk in batches, which LevelDB sorts into SST files. By increasing the default batch size, we can reduce overhead from repeated compaction cycles, minimize constant overhead per batch, and achieve more sequential writes. Experiments with different batch sizes (loaded via assumeutxo at block 840k, then measuring final flush time) show that 64 MiB batches significantly reduce flush time without notably increasing memory usage: | dbbatchsize | flush_sum (ms) | |-------------|----------------| | 8 MiB | ~240,000 | | 16 MiB | ~220,000 | | 32 MiB | ~200,000 | | *64 MiB* | *~150,000* | | 128 MiB | ~156,000 | | 256 MiB | ~166,000 | | 512 MiB | ~186,000 | | 1 GiB | ~186,000 | Checking the impact of a `-reindex-chainstate` with `-stopatheight=878000` and `-dbcache=30000` gives: 16 << 20 ``` 2025-01-12T07:31:05Z Flushed fee estimates to fee_estimates.dat. 2025-01-12T07:31:05Z [warning] Flushing large (26 GiB) UTXO set to disk, it may take several minutes 2025-01-12T07:53:51Z Shutdown: done ``` Flush time: 22 minutes and 46 seconds 64 >> 20 ``` 2025-01-12T18:30:00Z Flushed fee estimates to fee_estimates.dat. 2025-01-12T18:30:00Z [warning] Flushing large (26 GiB) UTXO set to disk, it may take several minutes 2025-01-12T18:44:43Z Shutdown: done ``` Flush time: ~14 minutes 43 seconds. --- src/txdb.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/txdb.h b/src/txdb.h index 968b7c27810..5d6d861ffd4 100644 --- a/src/txdb.h +++ b/src/txdb.h @@ -22,7 +22,7 @@ class COutPoint; class uint256; //! -dbbatchsize default (bytes) -static const int64_t nDefaultDbBatchSize = 16 << 20; +static const int64_t nDefaultDbBatchSize = 64 << 20; //! User-controlled performance and debug options. struct CoinsViewOptions {