From 1134686ef92fb622ac32dc7463d3763cf18c85ad Mon Sep 17 00:00:00 2001 From: willcl-ark Date: Tue, 8 Nov 2022 13:52:49 +0000 Subject: [PATCH 1/3] mempool: Don't share mempool with dbcache in blocksonly When -blockonly is set, reduce mempool size to 5MB unless -maxmempool is also set. See #9569 --- src/init.cpp | 5 ++++- src/kernel/mempool_options.h | 2 ++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/init.cpp b/src/init.cpp index 5160718eaa..b2b0308353 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -719,10 +719,13 @@ void InitParameterInteraction(ArgsManager& args) LogPrintf("%s: parameter interaction: -externalip set -> setting -discover=0\n", __func__); } - // disable whitelistrelay in blocksonly mode if (args.GetBoolArg("-blocksonly", DEFAULT_BLOCKSONLY)) { + // disable whitelistrelay in blocksonly mode if (args.SoftSetBoolArg("-whitelistrelay", false)) LogPrintf("%s: parameter interaction: -blocksonly=1 -> setting -whitelistrelay=0\n", __func__); + // Reduce default mempool size in blocksonly mode to avoid unexpected resource usage + if (args.SoftSetArg("-maxmempool", ToString(DEFAULT_BLOCKSONLY_MAX_MEMPOOL_SIZE_MB))) + LogPrintf("%s: parameter interaction: -blocksonly=1 -> setting -maxmempool=%d\n", __func__, DEFAULT_BLOCKSONLY_MAX_MEMPOOL_SIZE_MB); } // Forcing relay from whitelisted hosts implies we will accept relays from them in the first place. diff --git a/src/kernel/mempool_options.h b/src/kernel/mempool_options.h index dad6f14c39..a5a0bae86d 100644 --- a/src/kernel/mempool_options.h +++ b/src/kernel/mempool_options.h @@ -18,6 +18,8 @@ class CBlockPolicyEstimator; /** Default for -maxmempool, maximum megabytes of mempool memory usage */ static constexpr unsigned int DEFAULT_MAX_MEMPOOL_SIZE_MB{300}; +//** Default for -maxmempool when blocksonly is set */ +static constexpr unsigned int DEFAULT_BLOCKSONLY_MAX_MEMPOOL_SIZE_MB{5}; /** Default for -mempoolexpiry, expiration time for mempool transactions in hours */ static constexpr unsigned int DEFAULT_MEMPOOL_EXPIRY_HOURS{336}; /** Default for -mempoolfullrbf, if the transaction replaceability signaling is ignored */ From ae797463dc7c72d990afa3ca53eeced7563ccd29 Mon Sep 17 00:00:00 2001 From: willcl-ark Date: Fri, 13 Jan 2023 20:08:46 +0000 Subject: [PATCH 2/3] doc: Update blocksonly behaviour in reduce-memory Changes to the default mempool allocation size now documented. Provides users with guidance on the mempool implications of -blocksonly mode, along with instructions on how to re-enable old behaviour. --- doc/reduce-memory.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/reduce-memory.md b/doc/reduce-memory.md index 296b172bde..097cc9f001 100644 --- a/doc/reduce-memory.md +++ b/doc/reduce-memory.md @@ -16,12 +16,12 @@ The size of some in-memory caches can be reduced. As caches trade off memory usa - The minimum value for `-maxmempool` is 5. - A lower maximum mempool size means that transactions will be evicted sooner. This will affect any uses of `bitcoind` that process unconfirmed transactions. -- To completely disable mempool functionality there is the option `-blocksonly`. This will make the client opt out of receiving (and thus relaying) transactions completely, except as part of blocks. +- Since `0.14.0`, unused memory allocated to the mempool (default: 300MB) is shared with the UTXO cache, so when trying to reduce memory usage you should limit the mempool, with the `-maxmempool` command line argument. + +- To disable most of the mempool functionality there is the `-blocksonly` option. This will reduce the default memory usage to 5MB and make the client opt out of receiving (and thus relaying) transactions, except from whitelisted peers and as part of blocks. - Do not use this when using the client to broadcast transactions as any transaction sent will stick out like a sore thumb, affecting privacy. When used with the wallet it should be combined with `-walletbroadcast=0` and `-spendzeroconfchange=0`. Another mechanism for broadcasting outgoing transactions (if any) should be used. -- Since `0.14.0`, unused memory allocated to the mempool (default: 300MB) is shared with the UTXO cache, so when trying to reduce memory usage you should limit the mempool, with the `-maxmempool` command line argument. - ## Number of peers - `-maxconnections=` - the maximum number of connections, which defaults to 125. Each active connection takes up some From 8e85164e7d12be324ea1af2e288ebcf689c930b7 Mon Sep 17 00:00:00 2001 From: willcl-ark Date: Mon, 16 Jan 2023 20:00:03 +0000 Subject: [PATCH 3/3] doc: release note on mempool size in -blocksonly Adds a release note detailing the new mempool sizing behaviour when running in blocksonly mode, and instruction on how to override the new defaults. --- doc/release-notes-26471.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 doc/release-notes-26471.md diff --git a/doc/release-notes-26471.md b/doc/release-notes-26471.md new file mode 100644 index 0000000000..2cb74804ca --- /dev/null +++ b/doc/release-notes-26471.md @@ -0,0 +1,13 @@ +Updated settings +---------------- + +- Setting `-blocksonly` will now reduce the maximum mempool memory + to 5MB (users may still use `-maxmempool` to override). Previously, + the default 300MB would be used, leading to unexpected memory usage + for users running with `-blocksonly` expecting it to eliminate + mempool memory usage. + + As unused mempool memory is shared with dbcache, this also reduces + the dbcache size for users running with `-blocksonly`, potentially + impacting performance. +