Requirements

Measured disk, memory and CPU, not a guess.

Docs / Run a node / Requirements

These figures are measured on a real import of chain 2800, not estimated. Where a number moves with the height of the chain, that is said rather than averaged away.

Memory

8 GB is the floor at which a full from-genesis import stops being practical, not a comfortable size. 16 GB gives the database the room the measurement shows it wants.

The requirement is not flat. It grows with the height, because the storage engine's working set grows with the chain. Measured on an 8 GB machine: past 12.2 million blocks the process sat at 5.96 GB resident with a 3.4 GB heap, the old generation 99.8% full, and four full garbage collections in five minutes.

Heap: bigger is not faster

The same -Xmx flag was measured at four values on the same machine:

-XmxWhat the JVM didBlocks per minute
4500m89 OutOfMemoryError, 7.1 GB resident, import stopped dead0
3200mRan, then degraded with repeated out-of-memory errors~1,500
2400mHealthy early, 1,409 full collections past 9.19 M~82,000 early, ~640 late
3400mZero full collections past nine million~28,800

The reason a larger heap is slower is that the storage engine's block cache lives outside the heap. A heap that takes the memory the database also needs starves it, and the process spends its time collecting instead of importing.

So do not pick a fraction of RAM and hope. Watch it:

jstat -gcutil <pid> 5000 3

If the old generation sits near 100% and full collections are frequent, the heap is too small. If you see OutOfMemoryError in the log, it is too large for what the database also needs: lower it. On 8 GB the band that worked was roughly 2.4 GB early and 3.4 GB past nine million blocks, and the optimum moves as the chain grows.

Disk

Headers are roughly 95% of a node's disk on chain 2800. Blocks are mostly empty, so there are few transactions, receipts or state to store.

Anchor headers are the exception and they are large: every 128th header carries a post-quantum certificate of tens of kilobytes. Size from the measured header, never from the minimum seal count, because nodes attach as many valid seals as arrive rather than the minimum required.

Growth is best measured as size divided by height over the life of the database, not over a short window. A compacting database can report zero growth for eighteen minutes and tens of kilobytes per block over the next eighteen.

Measure a database's growth with du on its directory, never with df on the filesystem. df measures the whole filesystem, so it counts every other thing that changes on that disk, including whatever you copied there yourself, and will attribute it to the chain.

Network

Outbound and inbound TCP and UDP on your peer-to-peer port. Discovery is UDP; a TCP-only opening gives you a node that never finds peers and looks broken for no visible reason.

Then

Install and Configure.