Skip to content

LMDB memory is overcommitted by default on Raspberry Pi #344

Description

@Swiddis

Describe the Bug

Running the default config of 0.1.0-rc2 on a raspberry Pi 4-B (aarch64, libc, Debian 13) immediately OOMs:

/ferrumc-0.1.0-rc2 $ ./target/release/ferrumc
2026-04-20T06:26:12.312360Z  INFO Starting server...
2026-04-20T06:26:12.312663Z  INFO Server setup complete.

thread 'main' (120408) panicked at src/lib/world/src/lib.rs:98:14:
Failed to initialize database: DatabaseInitError("Cannot allocate memory (os error 12)")
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

With memory stracing:

/ferrumc-0.1.0-rc2 $ RUST_BACKTRACE=1 strace -f -e trace=mmap,brk  ./target/release/ferrumc
brk(NULL)                               = 0x55b230d000
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fba3f5000
mmap(NULL, 27392, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fba3ee000
mmap(NULL, 263104, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_DENYWRITE, -1, 0) = 0x7fba37c000
mmap(0x7fba380000, 197568, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0) = 0x7fba380000
mmap(0x7fba3af000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1f000) = 0x7fba3af000
mmap(NULL, 720920, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_DENYWRITE, -1, 0) = 0x7fba2cf000
mmap(0x7fba2d0000, 655384, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0) = 0x7fba2d0000
mmap(0x7fba36f000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x8f000) = 0x7fba36f000
mmap(NULL, 1892368, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_DENYWRITE, -1, 0) = 0x7fba101000
mmap(0x7fba110000, 1826832, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0) = 0x7fba110000
mmap(0x7fba2bd000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x19d000) = 0x7fba2bd000
mmap(0x7fba2c2000, 49168, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fba2c2000
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fba3ec000
brk(NULL)                               = 0x55b230d000
brk(0x55b232e000)                       = 0x55b232e000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_DROPPABLE|MAP_ANONYMOUS, -1, 0) = 0x7fba3f4000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fba3f3000
mmap(NULL, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fba3ee000
2026-04-20T06:26:35.273296Z  INFO Starting server...
2026-04-20T06:26:35.274054Z  INFO Server setup complete.
mmap(NULL, 1052672, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fba00f000
mmap(NULL, 2101248, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb9e0e000
mmap(NULL, 8256, PROT_READ|PROT_WRITE, MAP_SHARED, 4, 0) = 0x7fba3e9000
mmap(NULL, 1073741824000, PROT_READ, MAP_SHARED, 5, 0) = -1 ENOMEM (Cannot allocate memory)

thread 'main' (120501) panicked at src/lib/world/src/lib.rs:98:14:
Failed to initialize database: DatabaseInitError("Cannot allocate memory (os error 12)")
stack backtrace:
mmap(NULL, 32654832, PROT_READ, MAP_PRIVATE, 4, 0) = 0x7fb81eb000
brk(0x55b2356000)                       = 0x55b2356000
brk(0x55b23d4000)                       = 0x55b23d4000
brk(0x55b2464000)                       = 0x55b2464000
brk(0x55b2584000)                       = 0x55b2584000
   0: __rustc::rust_begin_unwind
   1: core::panicking::panic_fmt
   2: core::result::unwrap_failed
   3: <ferrumc_world::World>::new::<&alloc::string::String>
   4: ferrumc::launch::create_state
   5: ferrumc::main
mmap(NULL, 1716616, PROT_READ, MAP_PRIVATE, 4, 0) = 0x7fb8047000
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
+++ exited with 101 +++

The mmap(NULL, 1073741824000, PROT_READ, MAP_SHARED, 5, 0) = -1 ENOMEM (Cannot allocate memory) line points at the default config of taking 1 TB of shmem. This is workaroundable by just changing the limit to e.g. 100GB in config.toml.

To Reproduce

Just cargo run --release on this machine, specifically with the default map_size = 1000:

OS: Debian GNU/Linux 13 (trixie) aarch64
Host: Raspberry Pi 4 Model B Rev 1.4
Kernel: Linux 6.12.75+rpt-rpi-v8
CPU: BCM2711 (4) @ 1.80 GHz
GPU: Broadcom bcm2711-vc5 [Integrated]

Expected Behaviour

Work OOTB.

The bug is easy to work around: reduce the map_size. I'm creating this issue to help others who run into it, and to see if the default could be fixed on this platform.

Screenshots / Videos

N/A

FerrumC Version

0.1.0-rc2 (built from source)

Rust Version

rustc 1.97.0-nightly (e22c616e4 2026-04-19)

Server Logs

See above

Additional Context

No response

Is there an existing issue for this?

  • I have searched current existing issues before creating this.
  • I checked all the boxes without reading them
  • I have provided all necessary and relevant details, including logs, reproduction steps, etc.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingunconfirmedFor templating

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions