neo-go/pkg
Roman Khimov 9513780c45 core: adjust in-memory processed set dynamically
Instead of tick-tocking with sync/async and having an unpredictable data
set we can just try to check for the real amount of keys that be processed
by the underlying DB. Can't be perfect, but still this adds some hard
limit to the amount of in-memory data. It's also adaptive, slower machines
will keep less and faster machines will keep more.

This gives almost perfect 4s cycles for mainnet BoltDB with no tail cutting,
it makes zero sense to process more blocks since we're clearly DB-bound:

2025-01-15T11:35:00.567+0300    INFO    persisted to disk       {"blocks": 1469, "keys": 40579, "headerHeight": 5438141, "blockHeight": 5438140, "velocity": 9912, "took": "4.378939648s"}
2025-01-15T11:35:04.699+0300    INFO    persisted to disk       {"blocks": 1060, "keys": 39976, "headerHeight": 5439201, "blockHeight": 5439200, "velocity": 9888, "took": "4.131985438s"}
2025-01-15T11:35:08.752+0300    INFO    persisted to disk       {"blocks": 1508, "keys": 39658, "headerHeight": 5440709, "blockHeight": 5440708, "velocity": 9877, "took": "4.052347569s"}
2025-01-15T11:35:12.807+0300    INFO    persisted to disk       {"blocks": 1645, "keys": 39565, "headerHeight": 5442354, "blockHeight": 5442353, "velocity": 9864, "took": "4.05547743s"}
2025-01-15T11:35:17.011+0300    INFO    persisted to disk       {"blocks": 1472, "keys": 39519, "headerHeight": 5443826, "blockHeight": 5443825, "velocity": 9817, "took": "4.203258142s"}
2025-01-15T11:35:21.089+0300    INFO    persisted to disk       {"blocks": 1345, "keys": 39529, "headerHeight": 5445171, "blockHeight": 5445170, "velocity": 9804, "took": "4.078297579s"}
2025-01-15T11:35:25.090+0300    INFO    persisted to disk       {"blocks": 1054, "keys": 39326, "headerHeight": 5446225, "blockHeight": 5446224, "velocity": 9806, "took": "4.000524899s"}
2025-01-15T11:35:30.372+0300    INFO    persisted to disk       {"blocks": 1239, "keys": 39349, "headerHeight": 5447464, "blockHeight": 5447463, "velocity": 9744, "took": "4.281444939s"}

2× can be considered, but this calculation isn't perfect for low number of
keys, so somewhat bigger tolerance is preferable for now. Overall it's not
degrading performance, my mainnet/bolt run was even 8% better with this.

Fixes #3249, we don't need any option this way.

Fixes #3783 as well, it no longer OOMs in that scenario. It however can OOM in
case of big GarbageCollectionPeriod (like 400K), but this can't be solved easily.

Signed-off-by: Roman Khimov <roman@nspcc.ru>
2025-01-15 22:08:08 +03:00
..
compiler config: replace LatestHardfork() with HFLatestStable 2024-12-06 12:24:00 +03:00
config Merge pull request #3750 from nspcc-dev/removeuntraceableheaders 2024-12-13 16:30:31 +03:00
consensus *: migrate onto simplified dbft.PublicKey interface 2024-11-29 18:33:19 +03:00
core core: adjust in-memory processed set dynamically 2025-01-15 22:08:08 +03:00
crypto *: improve for loop syntax 2024-08-30 21:45:18 +03:00
encoding *: improve for loop syntax 2024-08-30 21:45:18 +03:00
interop native: add callflag.AllowNotify to some methods to HFEchidna 2024-12-23 15:54:56 +01:00
io io: no need to do ValueOf() again, it's known 2024-11-15 22:29:06 +03:00
neorpc ws: allow filtering notification by parameters 2024-11-26 00:26:04 +03:00
neotest neotest: Add 'ReadNEF' method 2024-12-20 16:03:03 +03:00
network capability: add ArchivalNode, fix #3776 2024-12-28 10:51:40 +03:00
rpcclient ws: allow filtering notification by parameters 2024-11-26 00:26:04 +03:00
services blockfetcher: make UT work with AIO started 2024-12-25 10:36:38 +03:00
smartcontract manifest: support NEP-24 2024-11-20 14:45:28 +03:00
util *: improve for loop syntax 2024-08-30 21:45:18 +03:00
vm vm: fix PACKMAP operation 2024-11-19 13:49:53 +03:00
wallet *: use slices.Index/slices.Contains where appropriate 2024-08-27 08:24:52 +03:00