Harness s8 steady state and the bench-log paragraph: RSS per 1,000 blocks before and after the M30 fix

s8-steady.mjs: two nodes, one honest vmine miner at 1 block/s, no flood,
RSS and cache-build count every 60 s, vmmap -summary at 0, 500, 1,000 and
1,500 blocks. Both builds ran 1,500 blocks on the 60x profile: before
41 to 1,342 MB by 514 blocks (9 cache builds, five 256 MiB chunks resident:
KEEP 4 plus one evicted chunk the allocator keeps) then flat, 27 builds in
1,529 blocks; after 319 MB at 510 blocks (1 build), 589 at 1,029 (the second
day's cache, by design), 603 at 1,526, 2 builds. Residual 30 MB per 1,000
blocks on both builds, read as the consensus database and caches filling,
not the PoW cache. JSON and vmmap files under
docs/benchmarks/memory-floods-2026-10-04/.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
igneum-labs 2026-10-05 01:49:46 +00:00
parent 32fe292a85
commit 90478b5cf4
14 changed files with 1628 additions and 0 deletions

View file

@ -1130,3 +1130,20 @@ Honest template p95 (upper bounds; the before run and pass 1 ran at load over 10
Harness changes (this repo): `IGNEUM_HARNESS_BASE_PORT` and `IGNEUM_HARNESS_TMP` (ports and data directory, so two agents can run the harness at once), the u64 sentinel round-trip fixed with the BigInt reviver from `tools/finality-attacks/lib/net.mjs` (ledger F25), s6 records `rss_start`, `rss_delta` and `cache_builds` per load and its row reports per-load growth, s7 records `cache_builds` beside every RSS sample, and `--live-only` skips the s7 simulator part. Result JSON: `docs/benchmarks/memory-floods-2026-10-04/{before,after,after-pass1}-{s6-exhaustion,s7-flood}.json` (`after` is the committed build, `after-pass1` the build before its last three-line guard: `insert_program` skips a program whose day cache was evicted during its generation, which cannot fire in these single-day runs). Data directories `/tmp/igneum-fud-mem/{baseline,after-pass1 as after,after2}`.
Not covered tonight: the execution layer's `ExecState.records` (`igneum/exec/src/service.rs:31`, pushed per chain block, never truncated) is a slow growth, not a flood effect: 197 chain blocks cost under 1 MB in these runs, and a record on an empty devnet is roughly 1 to 2 KB (approximate, from the struct), so about 100 to 170 MB per day at 1 block/s; bounding it needs a window at least as long as the proving sortition window (`proving.rs:200`) plus the RPC's by-number history, which is a design choice, not a cache. The snapshot ring (`SNAPSHOT_RING = 64` full `IgneumDb` clones) is bounded in count but scales with the state size. The finality store trims votes, checkpoints, certificates and locks every index (`processes/finality.rs:531`); its `keys` and `stripped` maps grow with distinct vote keys (about 150 bytes per key, approximate). The proof pool keeps `RECORD_WINDOW_CHAIN_BLOCKS` of entries. None of these moved in these floods.
Steady state, no flood (5 October 2026, 01:20 to 01:48 UTC, asked for after the live app node on this Mac was reported at 1,081 MB at 27 min, 1,193 MB at 79 min and 2,258 MB at 4 h 14 min on the devnet profile): the new scenario `tools/harness/scenarios/s8-steady.mjs`, two nodes on the 60x profile (60-DAA epochs, a 24-minute day), one honest vmine miner at 1 block/s on node A, node B following, 1,500 blocks, RSS and the `PoW cache built` count every 60 s, `vmmap -summary` of both nodes at 0, 500, 1,000 and 1,500 blocks. Both builds ran at the same time on their own run slots (the lock script's three run slots) and port ranges. The first 8 minutes ran at load 60 to 85, the rest at load 2 to 8; the counts do not depend on it.
```
IGNEUMD=<binary> IGNEUM_FAST_TIME=1 IGNEUM_HARNESS_BASE_PORT=<29500|29600> IGNEUM_HARNESS_TMP=/tmp/igneum-fud-mem/steady-<before|after> \
IGNEUM_STEADY_BLOCKS=1500 IGNEUM_STEADY_MAX_MIN=40 tools/lock/with-lock.sh run node tools/harness/scenarios/s8-steady.mjs
```
| Blocks (node A / B, both equal) | Before (shipping igneumd, 29500+): RSS A / B MB, cache builds | After (796f758d, 29600+): RSS A / B MB, cache builds |
|---|---|---|
| 0 (nodes up, miner not started) | 41 / 42, 0 | 41 / 42, 0 |
| 514 and 510 | 1,342 / 1,342, 9 | 319 / 317, 1 |
| 1,008 and 1,029 | 1,355 / 1,355, 18 | 589 / 588, 2 |
| 1,529 and 1,526 (end, 1,527 and 1,521 s) | 1,371 / 1,372, 27 | 603 / 602, 2 |
| Slope from 1,000 blocks to the end | 30.7 MB per 1,000 blocks | 30.2 MB per 1,000 blocks |
Reading. Before: one cache build per epoch roll (25 rolls in 1,529 blocks, plus the two days) and the RSS steps with them up to five chunks: `KEEP = 4` plus one evicted 256 MiB chunk the allocator keeps and never returns to the OS (vmmap at 500, 1,000 and 1,500 blocks: 1.3 G resident in the region vmmap labels IOAccelerator, which held exactly the cache chunks; the malloc zones hold 9 to 22 MB). It stays at five: the before node is flat at 1,34x to 1,37x from 514 blocks on. After: one cache for the first day (319 MB at 510 blocks), a second when the fast-time day rolled at 01:36 UTC (both runs; the day cache is per day by design, `KEEP_DAYS = 3`), 2 of 2 builds in 1,526 blocks against 27 of 27 before; on the devnet profile (24-hour day, 1-hour epochs) that is 256 MiB flat, 512 MiB around midnight UTC, 768 MiB worst case, against 256 MiB per hour up to 1.3 GB before. So per 1,000 blocks: before, 1,300 MB in the first 500 blocks (the four caches plus the kept chunk) then 31 MB; after, 30 MB, plus 256 MiB once per day. The 30 MB per 1,000 blocks is the same on both builds and is not the PoW cache: at 1,526 blocks the after node's non-cache footprint is 584.0 M physical minus 2 x 256 MiB = 72 MB against 23 MB at 0 blocks, and the malloc zones account for 22 MB of it, so most of it is in large `vm_allocate` regions, which on this node means the consensus database's write buffers and block cache and the consensus in-memory caches filling toward their fixed sizes (rusty-kaspa sizes them in entries for mainnet), not the execution layer (1,526 chain-block records on an empty chain are about 2 to 3 MB, approximate) and not the finality key maps (1 voter here). That is a reading, not a measurement: it needs a longer run to see the plateau (the live node's own figures fit it: 1,081 to 1,193 MB over 52 minutes with no epoch roll is 36 MB per 1,000 blocks). The live app node's 2,258 MB at 4 h 14 min is more than the before build can hold on its own (five chunks plus 30 MB per 1,000 blocks gives about 1.7 GB at 15,000 blocks); the app runs a GPU worker beside the node (Metal buffers and a kernel per epoch), which this harness does not cover, so that node wants its own `vmmap -summary`. Result JSON `docs/benchmarks/memory-floods-2026-10-04/{before,after}-s8-steady.json`, vmmap summaries under `.../vmmap/`.

View file

@ -0,0 +1,506 @@
{
"rows": [
{
"scenario": "8 steady state, one honest miner at 1 block/s, no flood (RSS per 1,000 blocks)",
"criterion": "recorded: RSS of the mining node / the follower at 0, 500, 1,000 and 1,500 blocks, cache builds",
"result": "0: 41/42 MB at 0 blocks (0/0 builds); 500: 319/317 MB at 510 blocks (1/1 builds); 1000: 589/588 MB at 1029 blocks (2/2 builds); 1500: 603/602 MB at 1526 blocks (2/2 builds); end 1526 blocks in 1521 s: 604/602 MB; honest accepted 1526 rejected 0 errors 0; alive true",
"pass": null
}
],
"data": {
"samples": [
{
"t_s": 0,
"blocks_a": 0,
"blocks_b": 0,
"daa_a": 0,
"rss_a": 41,
"rss_b": 42,
"cache_builds_a": 0,
"cache_builds_b": 0,
"same_sink": true,
"load": "70.63 67.18 58.38",
"vmmap_a": {
"physical_footprint": "22.8M",
"malloc_total": "0K",
"file": "/tmp/igneum-fud-mem/steady-after/vmmap/s8a-0.txt"
},
"vmmap_b": {
"physical_footprint": "23.0M",
"malloc_total": "0K",
"file": "/tmp/igneum-fud-mem/steady-after/vmmap/s8b-0.txt"
}
},
{
"t_s": 69,
"blocks_a": 80,
"blocks_b": 80,
"daa_a": 80,
"rss_a": 305,
"rss_b": 305,
"cache_builds_a": 1,
"cache_builds_b": 1,
"same_sink": true,
"load": "83.54 72.66 61.20"
},
{
"t_s": 130,
"blocks_a": 143,
"blocks_b": 143,
"daa_a": 143,
"rss_a": 307,
"rss_b": 307,
"cache_builds_a": 1,
"cache_builds_b": 1,
"same_sink": true,
"load": "85.99 75.42 63.01"
},
{
"t_s": 191,
"blocks_a": 204,
"blocks_b": 203,
"daa_a": 204,
"rss_a": 311,
"rss_b": 309,
"cache_builds_a": 1,
"cache_builds_b": 1,
"same_sink": false,
"load": "78.72 75.80 64.03"
},
{
"t_s": 251,
"blocks_a": 269,
"blocks_b": 269,
"daa_a": 269,
"rss_a": 313,
"rss_b": 311,
"cache_builds_a": 1,
"cache_builds_b": 1,
"same_sink": true,
"load": "32.71 63.22 60.12"
},
{
"t_s": 311,
"blocks_a": 332,
"blocks_b": 332,
"daa_a": 332,
"rss_a": 314,
"rss_b": 313,
"cache_builds_a": 1,
"cache_builds_b": 1,
"same_sink": true,
"load": "13.79 52.21 56.21"
},
{
"t_s": 371,
"blocks_a": 392,
"blocks_b": 392,
"daa_a": 392,
"rss_a": 316,
"rss_b": 314,
"cache_builds_a": 1,
"cache_builds_b": 1,
"same_sink": true,
"load": "6.30 43.08 52.52"
},
{
"t_s": 431,
"blocks_a": 456,
"blocks_b": 456,
"daa_a": 456,
"rss_a": 317,
"rss_b": 316,
"cache_builds_a": 1,
"cache_builds_b": 1,
"same_sink": true,
"load": "4.83 35.97 49.22"
},
{
"t_s": 492,
"blocks_a": 510,
"blocks_b": 510,
"daa_a": 510,
"rss_a": 319,
"rss_b": 317,
"cache_builds_a": 1,
"cache_builds_b": 1,
"same_sink": true,
"load": "3.65 29.96 46.07",
"vmmap_a": {
"physical_footprint": "299.2M",
"malloc_total": "0K",
"file": "/tmp/igneum-fud-mem/steady-after/vmmap/s8a-500.txt"
},
"vmmap_b": {
"physical_footprint": "298.4M",
"malloc_total": "0K",
"file": "/tmp/igneum-fud-mem/steady-after/vmmap/s8b-500.txt"
}
},
{
"t_s": 554,
"blocks_a": 571,
"blocks_b": 571,
"daa_a": 571,
"rss_a": 320,
"rss_b": 319,
"cache_builds_a": 1,
"cache_builds_b": 1,
"same_sink": true,
"load": "3.15 24.72 42.91"
},
{
"t_s": 614,
"blocks_a": 635,
"blocks_b": 635,
"daa_a": 635,
"rss_a": 322,
"rss_b": 320,
"cache_builds_a": 1,
"cache_builds_b": 1,
"same_sink": true,
"load": "3.39 20.87 40.23"
},
{
"t_s": 674,
"blocks_a": 687,
"blocks_b": 687,
"daa_a": 687,
"rss_a": 323,
"rss_b": 322,
"cache_builds_a": 1,
"cache_builds_b": 1,
"same_sink": true,
"load": "2.77 17.54 37.67"
},
{
"t_s": 734,
"blocks_a": 746,
"blocks_b": 746,
"daa_a": 746,
"rss_a": 325,
"rss_b": 323,
"cache_builds_a": 1,
"cache_builds_b": 1,
"same_sink": true,
"load": "4.99 15.57 35.56"
},
{
"t_s": 795,
"blocks_a": 797,
"blocks_b": 797,
"daa_a": 797,
"rss_a": 326,
"rss_b": 325,
"cache_builds_a": 1,
"cache_builds_b": 1,
"same_sink": true,
"load": "4.22 13.41 33.39"
},
{
"t_s": 855,
"blocks_a": 864,
"blocks_b": 864,
"daa_a": 864,
"rss_a": 328,
"rss_b": 326,
"cache_builds_a": 1,
"cache_builds_b": 1,
"same_sink": true,
"load": "5.90 12.34 31.64"
},
{
"t_s": 915,
"blocks_a": 920,
"blocks_b": 920,
"daa_a": 920,
"rss_a": 330,
"rss_b": 328,
"cache_builds_a": 1,
"cache_builds_b": 1,
"same_sink": true,
"load": "4.99 10.91 29.79"
},
{
"t_s": 975,
"blocks_a": 981,
"blocks_b": 981,
"daa_a": 981,
"rss_a": 588,
"rss_b": 586,
"cache_builds_a": 2,
"cache_builds_b": 2,
"same_sink": true,
"load": "4.12 9.61 28.02"
},
{
"t_s": 1035,
"blocks_a": 1029,
"blocks_b": 1029,
"daa_a": 1029,
"rss_a": 589,
"rss_b": 588,
"cache_builds_a": 2,
"cache_builds_b": 2,
"same_sink": true,
"load": "3.05 8.28 26.26",
"vmmap_a": {
"physical_footprint": "569.6M",
"malloc_total": "0K",
"file": "/tmp/igneum-fud-mem/steady-after/vmmap/s8a-1000.txt"
},
"vmmap_b": {
"physical_footprint": "568.6M",
"malloc_total": "0K",
"file": "/tmp/igneum-fud-mem/steady-after/vmmap/s8b-1000.txt"
}
},
{
"t_s": 1098,
"blocks_a": 1095,
"blocks_b": 1095,
"daa_a": 1095,
"rss_a": 591,
"rss_b": 589,
"cache_builds_a": 2,
"cache_builds_b": 2,
"same_sink": true,
"load": "2.31 7.01 24.46"
},
{
"t_s": 1158,
"blocks_a": 1163,
"blocks_b": 1163,
"daa_a": 1163,
"rss_a": 592,
"rss_b": 591,
"cache_builds_a": 2,
"cache_builds_b": 2,
"same_sink": true,
"load": "2.19 6.11 22.93"
},
{
"t_s": 1218,
"blocks_a": 1219,
"blocks_b": 1219,
"daa_a": 1219,
"rss_a": 594,
"rss_b": 592,
"cache_builds_a": 2,
"cache_builds_b": 2,
"same_sink": true,
"load": "1.84 5.33 21.50"
},
{
"t_s": 1279,
"blocks_a": 1281,
"blocks_b": 1281,
"daa_a": 1281,
"rss_a": 596,
"rss_b": 594,
"cache_builds_a": 2,
"cache_builds_b": 2,
"same_sink": true,
"load": "1.90 4.76 20.18"
},
{
"t_s": 1339,
"blocks_a": 1341,
"blocks_b": 1341,
"daa_a": 1341,
"rss_a": 597,
"rss_b": 596,
"cache_builds_a": 2,
"cache_builds_b": 2,
"same_sink": true,
"load": "1.25 4.04 18.86"
},
{
"t_s": 1399,
"blocks_a": 1406,
"blocks_b": 1406,
"daa_a": 1406,
"rss_a": 599,
"rss_b": 598,
"cache_builds_a": 2,
"cache_builds_b": 2,
"same_sink": true,
"load": "1.50 3.58 17.68"
},
{
"t_s": 1459,
"blocks_a": 1465,
"blocks_b": 1465,
"daa_a": 1465,
"rss_a": 601,
"rss_b": 600,
"cache_builds_a": 2,
"cache_builds_b": 2,
"same_sink": true,
"load": "2.19 3.41 16.65"
},
{
"t_s": 1519,
"blocks_a": 1526,
"blocks_b": 1526,
"daa_a": 1526,
"rss_a": 603,
"rss_b": 602,
"cache_builds_a": 2,
"cache_builds_b": 2,
"same_sink": true,
"load": "2.04 3.14 15.65",
"vmmap_a": {
"physical_footprint": "584.0M",
"malloc_total": "0K",
"file": "/tmp/igneum-fud-mem/steady-after/vmmap/s8a-1500.txt"
},
"vmmap_b": {
"physical_footprint": "582.8M",
"malloc_total": "0K",
"file": "/tmp/igneum-fud-mem/steady-after/vmmap/s8b-1500.txt"
}
},
{
"t_s": 1521,
"blocks_a": 1526,
"blocks_b": 1526,
"daa_a": 1526,
"rss_a": 604,
"rss_b": 602,
"cache_builds_a": 2,
"cache_builds_b": 2,
"same_sink": true,
"load": "2.04 3.14 15.65",
"vmmap_a": {
"physical_footprint": "584.0M",
"malloc_total": "0K",
"file": "/tmp/igneum-fud-mem/steady-after/vmmap/s8a-end.txt"
},
"vmmap_b": {
"physical_footprint": "582.8M",
"malloc_total": "0K",
"file": "/tmp/igneum-fud-mem/steady-after/vmmap/s8b-end.txt"
}
}
],
"milestones": {
"0": {
"t_s": 0,
"blocks_a": 0,
"blocks_b": 0,
"daa_a": 0,
"rss_a": 41,
"rss_b": 42,
"cache_builds_a": 0,
"cache_builds_b": 0,
"same_sink": true,
"load": "70.63 67.18 58.38",
"vmmap_a": {
"physical_footprint": "22.8M",
"malloc_total": "0K",
"file": "/tmp/igneum-fud-mem/steady-after/vmmap/s8a-0.txt"
},
"vmmap_b": {
"physical_footprint": "23.0M",
"malloc_total": "0K",
"file": "/tmp/igneum-fud-mem/steady-after/vmmap/s8b-0.txt"
}
},
"500": {
"t_s": 492,
"blocks_a": 510,
"blocks_b": 510,
"daa_a": 510,
"rss_a": 319,
"rss_b": 317,
"cache_builds_a": 1,
"cache_builds_b": 1,
"same_sink": true,
"load": "3.65 29.96 46.07",
"vmmap_a": {
"physical_footprint": "299.2M",
"malloc_total": "0K",
"file": "/tmp/igneum-fud-mem/steady-after/vmmap/s8a-500.txt"
},
"vmmap_b": {
"physical_footprint": "298.4M",
"malloc_total": "0K",
"file": "/tmp/igneum-fud-mem/steady-after/vmmap/s8b-500.txt"
}
},
"1000": {
"t_s": 1035,
"blocks_a": 1029,
"blocks_b": 1029,
"daa_a": 1029,
"rss_a": 589,
"rss_b": 588,
"cache_builds_a": 2,
"cache_builds_b": 2,
"same_sink": true,
"load": "3.05 8.28 26.26",
"vmmap_a": {
"physical_footprint": "569.6M",
"malloc_total": "0K",
"file": "/tmp/igneum-fud-mem/steady-after/vmmap/s8a-1000.txt"
},
"vmmap_b": {
"physical_footprint": "568.6M",
"malloc_total": "0K",
"file": "/tmp/igneum-fud-mem/steady-after/vmmap/s8b-1000.txt"
}
},
"1500": {
"t_s": 1519,
"blocks_a": 1526,
"blocks_b": 1526,
"daa_a": 1526,
"rss_a": 603,
"rss_b": 602,
"cache_builds_a": 2,
"cache_builds_b": 2,
"same_sink": true,
"load": "2.04 3.14 15.65",
"vmmap_a": {
"physical_footprint": "584.0M",
"malloc_total": "0K",
"file": "/tmp/igneum-fud-mem/steady-after/vmmap/s8a-1500.txt"
},
"vmmap_b": {
"physical_footprint": "582.8M",
"malloc_total": "0K",
"file": "/tmp/igneum-fud-mem/steady-after/vmmap/s8b-1500.txt"
}
},
"end": {
"t_s": 1521,
"blocks_a": 1526,
"blocks_b": 1526,
"daa_a": 1526,
"rss_a": 604,
"rss_b": 602,
"cache_builds_a": 2,
"cache_builds_b": 2,
"same_sink": true,
"load": "2.04 3.14 15.65",
"vmmap_a": {
"physical_footprint": "584.0M",
"malloc_total": "0K",
"file": "/tmp/igneum-fud-mem/steady-after/vmmap/s8a-end.txt"
},
"vmmap_b": {
"physical_footprint": "582.8M",
"malloc_total": "0K",
"file": "/tmp/igneum-fud-mem/steady-after/vmmap/s8b-end.txt"
}
}
},
"honest": {
"accepted": 1526,
"rejected": 0,
"errors": 0
},
"alive": true
}
}

View file

@ -0,0 +1,506 @@
{
"rows": [
{
"scenario": "8 steady state, one honest miner at 1 block/s, no flood (RSS per 1,000 blocks)",
"criterion": "recorded: RSS of the mining node / the follower at 0, 500, 1,000 and 1,500 blocks, cache builds",
"result": "0: 41/42 MB at 0 blocks (0/0 builds); 500: 1342/1342 MB at 514 blocks (9/9 builds); 1000: 1355/1355 MB at 1008 blocks (18/18 builds); 1500: 1371/1372 MB at 1529 blocks (27/27 builds); end 1529 blocks in 1527 s: 1371/1372 MB; honest accepted 1529 rejected 0 errors 0; alive true",
"pass": null
}
],
"data": {
"samples": [
{
"t_s": 0,
"blocks_a": 0,
"blocks_b": 0,
"daa_a": 0,
"rss_a": 41,
"rss_b": 42,
"cache_builds_a": 0,
"cache_builds_b": 0,
"same_sink": true,
"load": "80.88 75.23 63.38",
"vmmap_a": {
"physical_footprint": "22.5M",
"malloc_total": "0K",
"file": "/tmp/igneum-fud-mem/steady-before/vmmap/s8a-0.txt"
},
"vmmap_b": {
"physical_footprint": "23.7M",
"malloc_total": "0K",
"file": "/tmp/igneum-fud-mem/steady-before/vmmap/s8b-0.txt"
}
},
{
"t_s": 67,
"blocks_a": 83,
"blocks_b": 83,
"daa_a": 83,
"rss_a": 564,
"rss_b": 563,
"cache_builds_a": 2,
"cache_builds_b": 2,
"same_sink": true,
"load": "48.05 68.48 61.83"
},
{
"t_s": 127,
"blocks_a": 143,
"blocks_b": 143,
"daa_a": 143,
"rss_a": 821,
"rss_b": 820,
"cache_builds_a": 3,
"cache_builds_b": 3,
"same_sink": true,
"load": "19.61 56.55 57.81"
},
{
"t_s": 187,
"blocks_a": 203,
"blocks_b": 203,
"daa_a": 203,
"rss_a": 1079,
"rss_b": 1078,
"cache_builds_a": 4,
"cache_builds_b": 4,
"same_sink": true,
"load": "8.59 46.69 54.04"
},
{
"t_s": 248,
"blocks_a": 268,
"blocks_b": 268,
"daa_a": 268,
"rss_a": 1080,
"rss_b": 1079,
"cache_builds_a": 5,
"cache_builds_b": 5,
"same_sink": true,
"load": "5.31 38.76 50.57"
},
{
"t_s": 308,
"blocks_a": 329,
"blocks_b": 329,
"daa_a": 329,
"rss_a": 1081,
"rss_b": 1081,
"cache_builds_a": 6,
"cache_builds_b": 6,
"same_sink": true,
"load": "4.13 32.34 47.36"
},
{
"t_s": 368,
"blocks_a": 398,
"blocks_b": 398,
"daa_a": 398,
"rss_a": 1083,
"rss_b": 1083,
"cache_builds_a": 7,
"cache_builds_b": 7,
"same_sink": true,
"load": "4.16 26.78 44.16"
},
{
"t_s": 428,
"blocks_a": 461,
"blocks_b": 461,
"daa_a": 461,
"rss_a": 1085,
"rss_b": 1084,
"cache_builds_a": 8,
"cache_builds_b": 8,
"same_sink": true,
"load": "3.37 22.41 41.34"
},
{
"t_s": 488,
"blocks_a": 514,
"blocks_b": 514,
"daa_a": 514,
"rss_a": 1342,
"rss_b": 1342,
"cache_builds_a": 9,
"cache_builds_b": 9,
"same_sink": true,
"load": "3.05 18.88 38.73",
"vmmap_a": {
"physical_footprint": "1.3G",
"malloc_total": "0K",
"file": "/tmp/igneum-fud-mem/steady-before/vmmap/s8a-500.txt"
},
"vmmap_b": {
"physical_footprint": "1.3G",
"malloc_total": "0K",
"file": "/tmp/igneum-fud-mem/steady-before/vmmap/s8b-500.txt"
}
},
{
"t_s": 551,
"blocks_a": 569,
"blocks_b": 569,
"daa_a": 569,
"rss_a": 1343,
"rss_b": 1343,
"cache_builds_a": 10,
"cache_builds_b": 10,
"same_sink": true,
"load": "5.64 16.62 36.52"
},
{
"t_s": 611,
"blocks_a": 633,
"blocks_b": 633,
"daa_a": 633,
"rss_a": 1345,
"rss_b": 1345,
"cache_builds_a": 11,
"cache_builds_b": 11,
"same_sink": true,
"load": "4.37 14.24 34.27"
},
{
"t_s": 671,
"blocks_a": 699,
"blocks_b": 699,
"daa_a": 699,
"rss_a": 1347,
"rss_b": 1346,
"cache_builds_a": 12,
"cache_builds_b": 12,
"same_sink": true,
"load": "6.78 13.04 32.45"
},
{
"t_s": 731,
"blocks_a": 761,
"blocks_b": 761,
"daa_a": 761,
"rss_a": 1348,
"rss_b": 1348,
"cache_builds_a": 13,
"cache_builds_b": 13,
"same_sink": true,
"load": "5.68 11.55 30.57"
},
{
"t_s": 791,
"blocks_a": 823,
"blocks_b": 823,
"daa_a": 823,
"rss_a": 1350,
"rss_b": 1350,
"cache_builds_a": 14,
"cache_builds_b": 14,
"same_sink": true,
"load": "4.46 10.14 28.75"
},
{
"t_s": 852,
"blocks_a": 894,
"blocks_b": 894,
"daa_a": 894,
"rss_a": 1352,
"rss_b": 1352,
"cache_builds_a": 16,
"cache_builds_b": 16,
"same_sink": true,
"load": "3.31 8.79 26.97"
},
{
"t_s": 912,
"blocks_a": 958,
"blocks_b": 958,
"daa_a": 958,
"rss_a": 1354,
"rss_b": 1354,
"cache_builds_a": 17,
"cache_builds_b": 17,
"same_sink": true,
"load": "2.38 7.53 25.26"
},
{
"t_s": 972,
"blocks_a": 1008,
"blocks_b": 1008,
"daa_a": 1008,
"rss_a": 1355,
"rss_b": 1355,
"cache_builds_a": 18,
"cache_builds_b": 18,
"same_sink": true,
"load": "2.17 6.53 23.68",
"vmmap_a": {
"physical_footprint": "1.3G",
"malloc_total": "0K",
"file": "/tmp/igneum-fud-mem/steady-before/vmmap/s8a-1000.txt"
},
"vmmap_b": {
"physical_footprint": "1.3G",
"malloc_total": "0K",
"file": "/tmp/igneum-fud-mem/steady-before/vmmap/s8b-1000.txt"
}
},
{
"t_s": 1034,
"blocks_a": 1069,
"blocks_b": 1069,
"daa_a": 1069,
"rss_a": 1357,
"rss_b": 1357,
"cache_builds_a": 19,
"cache_builds_b": 19,
"same_sink": true,
"load": "2.37 5.73 22.11"
},
{
"t_s": 1095,
"blocks_a": 1139,
"blocks_b": 1139,
"daa_a": 1139,
"rss_a": 1359,
"rss_b": 1358,
"cache_builds_a": 20,
"cache_builds_b": 20,
"same_sink": true,
"load": "2.46 5.10 20.76"
},
{
"t_s": 1155,
"blocks_a": 1192,
"blocks_b": 1192,
"daa_a": 1192,
"rss_a": 1360,
"rss_b": 1360,
"cache_builds_a": 21,
"cache_builds_b": 21,
"same_sink": true,
"load": "1.41 4.31 19.39"
},
{
"t_s": 1215,
"blocks_a": 1247,
"blocks_b": 1247,
"daa_a": 1247,
"rss_a": 1362,
"rss_b": 1362,
"cache_builds_a": 22,
"cache_builds_b": 22,
"same_sink": true,
"load": "1.19 3.72 18.14"
},
{
"t_s": 1275,
"blocks_a": 1294,
"blocks_b": 1294,
"daa_a": 1294,
"rss_a": 1363,
"rss_b": 1363,
"cache_builds_a": 23,
"cache_builds_b": 23,
"same_sink": true,
"load": "1.59 3.40 17.04"
},
{
"t_s": 1335,
"blocks_a": 1352,
"blocks_b": 1352,
"daa_a": 1352,
"rss_a": 1365,
"rss_b": 1364,
"cache_builds_a": 24,
"cache_builds_b": 24,
"same_sink": true,
"load": "1.87 3.20 16.04"
},
{
"t_s": 1395,
"blocks_a": 1401,
"blocks_b": 1401,
"daa_a": 1401,
"rss_a": 1367,
"rss_b": 1366,
"cache_builds_a": 25,
"cache_builds_b": 25,
"same_sink": true,
"load": "7.11 4.19 15.52"
},
{
"t_s": 1456,
"blocks_a": 1468,
"blocks_b": 1468,
"daa_a": 1468,
"rss_a": 1369,
"rss_b": 1369,
"cache_builds_a": 26,
"cache_builds_b": 26,
"same_sink": true,
"load": "43.45 13.68 18.21"
},
{
"t_s": 1517,
"blocks_a": 1529,
"blocks_b": 1529,
"daa_a": 1529,
"rss_a": 1371,
"rss_b": 1372,
"cache_builds_a": 27,
"cache_builds_b": 27,
"same_sink": true,
"load": "92.08 33.71 25.42",
"vmmap_a": {
"physical_footprint": "1.3G",
"malloc_total": "0K",
"file": "/tmp/igneum-fud-mem/steady-before/vmmap/s8a-1500.txt"
},
"vmmap_b": {
"physical_footprint": "1.3G",
"malloc_total": "0K",
"file": "/tmp/igneum-fud-mem/steady-before/vmmap/s8b-1500.txt"
}
},
{
"t_s": 1527,
"blocks_a": 1529,
"blocks_b": 1529,
"daa_a": 1529,
"rss_a": 1371,
"rss_b": 1372,
"cache_builds_a": 27,
"cache_builds_b": 27,
"same_sink": true,
"load": "90.06 35.17 26.04",
"vmmap_a": {
"physical_footprint": "1.3G",
"malloc_total": "0K",
"file": "/tmp/igneum-fud-mem/steady-before/vmmap/s8a-end.txt"
},
"vmmap_b": {
"physical_footprint": "1.3G",
"malloc_total": "0K",
"file": "/tmp/igneum-fud-mem/steady-before/vmmap/s8b-end.txt"
}
}
],
"milestones": {
"0": {
"t_s": 0,
"blocks_a": 0,
"blocks_b": 0,
"daa_a": 0,
"rss_a": 41,
"rss_b": 42,
"cache_builds_a": 0,
"cache_builds_b": 0,
"same_sink": true,
"load": "80.88 75.23 63.38",
"vmmap_a": {
"physical_footprint": "22.5M",
"malloc_total": "0K",
"file": "/tmp/igneum-fud-mem/steady-before/vmmap/s8a-0.txt"
},
"vmmap_b": {
"physical_footprint": "23.7M",
"malloc_total": "0K",
"file": "/tmp/igneum-fud-mem/steady-before/vmmap/s8b-0.txt"
}
},
"500": {
"t_s": 488,
"blocks_a": 514,
"blocks_b": 514,
"daa_a": 514,
"rss_a": 1342,
"rss_b": 1342,
"cache_builds_a": 9,
"cache_builds_b": 9,
"same_sink": true,
"load": "3.05 18.88 38.73",
"vmmap_a": {
"physical_footprint": "1.3G",
"malloc_total": "0K",
"file": "/tmp/igneum-fud-mem/steady-before/vmmap/s8a-500.txt"
},
"vmmap_b": {
"physical_footprint": "1.3G",
"malloc_total": "0K",
"file": "/tmp/igneum-fud-mem/steady-before/vmmap/s8b-500.txt"
}
},
"1000": {
"t_s": 972,
"blocks_a": 1008,
"blocks_b": 1008,
"daa_a": 1008,
"rss_a": 1355,
"rss_b": 1355,
"cache_builds_a": 18,
"cache_builds_b": 18,
"same_sink": true,
"load": "2.17 6.53 23.68",
"vmmap_a": {
"physical_footprint": "1.3G",
"malloc_total": "0K",
"file": "/tmp/igneum-fud-mem/steady-before/vmmap/s8a-1000.txt"
},
"vmmap_b": {
"physical_footprint": "1.3G",
"malloc_total": "0K",
"file": "/tmp/igneum-fud-mem/steady-before/vmmap/s8b-1000.txt"
}
},
"1500": {
"t_s": 1517,
"blocks_a": 1529,
"blocks_b": 1529,
"daa_a": 1529,
"rss_a": 1371,
"rss_b": 1372,
"cache_builds_a": 27,
"cache_builds_b": 27,
"same_sink": true,
"load": "92.08 33.71 25.42",
"vmmap_a": {
"physical_footprint": "1.3G",
"malloc_total": "0K",
"file": "/tmp/igneum-fud-mem/steady-before/vmmap/s8a-1500.txt"
},
"vmmap_b": {
"physical_footprint": "1.3G",
"malloc_total": "0K",
"file": "/tmp/igneum-fud-mem/steady-before/vmmap/s8b-1500.txt"
}
},
"end": {
"t_s": 1527,
"blocks_a": 1529,
"blocks_b": 1529,
"daa_a": 1529,
"rss_a": 1371,
"rss_b": 1372,
"cache_builds_a": 27,
"cache_builds_b": 27,
"same_sink": true,
"load": "90.06 35.17 26.04",
"vmmap_a": {
"physical_footprint": "1.3G",
"malloc_total": "0K",
"file": "/tmp/igneum-fud-mem/steady-before/vmmap/s8a-end.txt"
},
"vmmap_b": {
"physical_footprint": "1.3G",
"malloc_total": "0K",
"file": "/tmp/igneum-fud-mem/steady-before/vmmap/s8b-end.txt"
}
}
},
"honest": {
"accepted": 1529,
"rejected": 0,
"errors": 0
},
"alive": true
}
}

View file

@ -0,0 +1,65 @@
Process: igneumd [55063]
Path: /Users/USER/*/igneumd
Load Address: 0x100a4c000
Identifier: igneumd
Version: 0
Code Type: ARM64
Platform: macOS
Parent Process: node [53092]
Target Type: live task
Date/Time: 2026-10-05 02:20:03.953 +0100
Launch Time: 2026-10-05 02:19:55.547 +0100
OS Version: macOS 26.6.2 (25G83)
Report Version: 7
Analysis Tool: /usr/bin/vmmap
Physical footprint: 22.8M
Physical footprint (peak): 22.8M
Idle exit: untracked
----
ReadOnly portion of Libraries: Total=898.4M resident=211.2M(24%) swapped_out_or_unallocated=687.2M(76%)
Writable regions: Total=3.3G written=20.8M(1%) resident=20.8M(1%) swapped_out=0K(0%) unallocated=3.2G(99%)
VIRTUAL RESIDENT DIRTY SWAPPED VOLATILE NONVOL EMPTY REGION
REGION TYPE SIZE SIZE SIZE SIZE SIZE SIZE SIZE COUNT (non-coalesced)
=========== ======= ======== ===== ======= ======== ====== ===== =======
IOAccelerator 2.1G 14.2M 14.2M 0K 0K 0K 0K 80
IOAccelerator (reserved) 896.0M 0K 0K 0K 0K 0K 0K 1 reserved VM address space (unallocated)
Kernel Alloc Once 32K 16K 16K 0K 0K 0K 0K 1
MALLOC guard page 3632K 0K 0K 0K 0K 0K 0K 4
MALLOC metadata 880K 480K 480K 0K 0K 0K 0K 4
MALLOC_SMALL 32.0M 2624K 2624K 0K 0K 0K 0K 8 see MALLOC ZONE table below
MALLOC_SMALL (empty) 4096K 32K 32K 0K 0K 0K 0K 1 see MALLOC ZONE table below
MALLOC_TINY 4096K 208K 208K 0K 0K 0K 0K 1 see MALLOC ZONE table below
Memory Tag 22 64.0M 16K 16K 0K 0K 0K 0K 1
STACK GUARD 1424K 0K 0K 0K 0K 0K 0K 89
Stack 154.2M 1760K 1760K 0K 0K 0K 0K 90
Stack Guard 56.0M 0K 0K 0K 0K 0K 0K 1
VM_ALLOCATE 1088K 0K 0K 0K 0K 0K 0K 68
VM_ALLOCATE (reserved) 8576K 0K 0K 0K 0K 0K 0K 67 reserved VM address space (unallocated)
__AUTH 1321K 925K 0K 0K 0K 0K 0K 149
__AUTH_CONST 17.7M 11.5M 0K 0K 0K 0K 0K 340
__CTF 824 824 0K 0K 0K 0K 0K 1
__DATA 4453K 2379K 346K 0K 0K 0K 0K 297
__DATA_CONST 17.6M 12.3M 1344K 0K 0K 0K 0K 339
__DATA_DIRTY 1320K 1056K 351K 0K 0K 0K 0K 284
__FONT_DATA 2352 2352 0K 0K 0K 0K 0K 1
__LINKEDIT 573.7M 32.9M 0K 0K 0K 0K 0K 2
__OBJC_RO 79.2M 59.8M 0K 0K 0K 0K 0K 1
__OBJC_RW 2599K 2375K 39K 0K 0K 0K 0K 1
__TEXT 324.7M 178.3M 0K 0K 0K 0K 0K 348
__TPRO_CONST 128K 112K 48K 0K 0K 0K 0K 2
page table in kernel 1474K 1474K 1474K 0K 0K 0K 0K 1
shared memory 48K 48K 48K 0K 0K 0K 0K 2
unused but dirty shlib __DATA 79K 79K 79K 0K 0K 0K 0K 39
=========== ======= ======== ===== ======= ======== ====== ===== =======
TOTAL 4.3G 322.2M 22.8M 0K 0K 0K 0K 2223
TOTAL, minus reserved VM space 3.4G 322.2M 22.8M 0K 0K 0K 0K 2223
VIRTUAL RESIDENT DIRTY SWAPPED ALLOCATION BYTES DIRTY+SWAP REGION
MALLOC ZONE SIZE SIZE SIZE SIZE COUNT ALLOCATED FRAG SIZE % FRAG COUNT
=========== ======= ========= ========= ========= ========= ========= ========= ====== ======
DefaultMallocZone_0x10345c000 40.8M 3312K 3312K 0K 5443 3008K 304K 10% 12

View file

@ -0,0 +1,65 @@
Process: igneumd [55063]
Path: /Users/USER/*/igneumd
Load Address: 0x100a4c000
Identifier: igneumd
Version: 0
Code Type: ARM64
Platform: macOS
Parent Process: node [53092]
Target Type: live task
Date/Time: 2026-10-05 02:37:18.131 +0100
Launch Time: 2026-10-05 02:19:55.547 +0100
OS Version: macOS 26.6.2 (25G83)
Report Version: 7
Analysis Tool: /usr/bin/vmmap
Physical footprint: 569.6M
Physical footprint (peak): 569.6M
Idle exit: untracked
----
ReadOnly portion of Libraries: Total=898.4M resident=212.5M(24%) swapped_out_or_unallocated=685.8M(76%)
Writable regions: Total=5.8G written=567.6M(10%) resident=567.6M(10%) swapped_out=0K(0%) unallocated=5.2G(90%)
VIRTUAL RESIDENT DIRTY SWAPPED VOLATILE NONVOL EMPTY REGION
REGION TYPE SIZE SIZE SIZE SIZE SIZE SIZE SIZE COUNT (non-coalesced)
=========== ======= ======== ===== ======= ======== ====== ===== =======
IOAccelerator 2.6G 548.1M 548.1M 0K 0K 0K 0K 87
IOAccelerator (reserved) 2.9G 0K 0K 0K 0K 0K 0K 2 reserved VM address space (unallocated)
Kernel Alloc Once 32K 16K 16K 0K 0K 0K 0K 1
MALLOC guard page 3632K 0K 0K 0K 0K 0K 0K 4
MALLOC metadata 880K 544K 544K 0K 0K 0K 0K 4
MALLOC_SMALL 44.0M 14.7M 14.7M 0K 0K 0K 0K 11 see MALLOC ZONE table below
MALLOC_SMALL (empty) 8192K 64K 64K 0K 0K 0K 0K 2 see MALLOC ZONE table below
MALLOC_TINY 4096K 208K 208K 0K 0K 0K 0K 1 see MALLOC ZONE table below
Memory Tag 22 64.0M 16K 16K 0K 0K 0K 0K 1
STACK GUARD 1424K 0K 0K 0K 0K 0K 0K 89
Stack 154.2M 2128K 2128K 0K 0K 0K 0K 90
Stack Guard 56.0M 0K 0K 0K 0K 0K 0K 1
VM_ALLOCATE 1088K 0K 0K 0K 0K 0K 0K 68
VM_ALLOCATE (reserved) 8576K 0K 0K 0K 0K 0K 0K 67 reserved VM address space (unallocated)
__AUTH 1321K 918K 0K 0K 0K 0K 0K 149
__AUTH_CONST 17.7M 11.5M 0K 0K 0K 0K 0K 340
__CTF 824 824 0K 0K 0K 0K 0K 1
__DATA 4453K 2379K 346K 0K 0K 0K 0K 297
__DATA_CONST 17.6M 12.3M 1344K 0K 0K 0K 0K 339
__DATA_DIRTY 1320K 1040K 351K 0K 0K 0K 0K 284
__FONT_DATA 2352 2352 0K 0K 0K 0K 0K 1
__LINKEDIT 573.7M 32.9M 0K 0K 0K 0K 0K 2
__OBJC_RO 79.2M 59.9M 0K 0K 0K 0K 0K 1
__OBJC_RW 2599K 2375K 39K 0K 0K 0K 0K 1
__TEXT 324.7M 179.6M 0K 0K 0K 0K 0K 348
__TPRO_CONST 128K 96K 48K 0K 0K 0K 0K 2
page table in kernel 1779K 1779K 1779K 0K 0K 0K 0K 1
shared memory 48K 48K 48K 0K 0K 0K 0K 2
unused but dirty shlib __DATA 79K 79K 79K 0K 0K 0K 0K 39
=========== ======= ======== ===== ======= ======== ====== ===== =======
TOTAL 6.8G 870.4M 569.6M 0K 0K 0K 0K 2235
TOTAL, minus reserved VM space 4.0G 870.4M 569.6M 0K 0K 0K 0K 2235
VIRTUAL RESIDENT DIRTY SWAPPED ALLOCATION BYTES DIRTY+SWAP REGION
MALLOC ZONE SIZE SIZE SIZE SIZE COUNT ALLOCATED FRAG SIZE % FRAG COUNT
=========== ======= ========= ========= ========= ========= ========= ========= ====== ======
DefaultMallocZone_0x10345c000 56.8M 15.5M 15.5M 0K 5469 14.9M 523K 4% 16

View file

@ -0,0 +1,65 @@
Process: igneumd [55063]
Path: /Users/USER/*/igneumd
Load Address: 0x100a4c000
Identifier: igneumd
Version: 0
Code Type: ARM64
Platform: macOS
Parent Process: node [53092]
Target Type: live task
Date/Time: 2026-10-05 02:45:21.762 +0100
Launch Time: 2026-10-05 02:19:55.547 +0100
OS Version: macOS 26.6.2 (25G83)
Report Version: 7
Analysis Tool: /usr/bin/vmmap
Physical footprint: 584.0M
Physical footprint (peak): 584.0M
Idle exit: untracked
----
ReadOnly portion of Libraries: Total=898.4M resident=212.6M(24%) swapped_out_or_unallocated=685.8M(76%)
Writable regions: Total=5.8G written=582.0M(10%) resident=582.0M(10%) swapped_out=0K(0%) unallocated=5.2G(90%)
VIRTUAL RESIDENT DIRTY SWAPPED VOLATILE NONVOL EMPTY REGION
REGION TYPE SIZE SIZE SIZE SIZE SIZE SIZE SIZE COUNT (non-coalesced)
=========== ======= ======== ===== ======= ======== ====== ===== =======
IOAccelerator 2.6G 555.7M 555.7M 0K 0K 0K 0K 87
IOAccelerator (reserved) 2.9G 0K 0K 0K 0K 0K 0K 2 reserved VM address space (unallocated)
Kernel Alloc Once 32K 16K 16K 0K 0K 0K 0K 1
MALLOC guard page 3632K 0K 0K 0K 0K 0K 0K 4
MALLOC metadata 880K 592K 592K 0K 0K 0K 0K 4
MALLOC_SMALL 56.0M 21.5M 21.5M 0K 0K 0K 0K 14 see MALLOC ZONE table below
MALLOC_SMALL (empty) 8192K 48K 48K 0K 0K 0K 0K 2 see MALLOC ZONE table below
MALLOC_TINY 4096K 208K 208K 0K 0K 0K 0K 1 see MALLOC ZONE table below
Memory Tag 22 64.0M 16K 16K 0K 0K 0K 0K 1
STACK GUARD 1424K 0K 0K 0K 0K 0K 0K 89
Stack 154.2M 2128K 2128K 0K 0K 0K 0K 90
Stack Guard 56.0M 0K 0K 0K 0K 0K 0K 1
VM_ALLOCATE 1088K 0K 0K 0K 0K 0K 0K 68
VM_ALLOCATE (reserved) 8576K 0K 0K 0K 0K 0K 0K 67 reserved VM address space (unallocated)
__AUTH 1321K 925K 0K 0K 0K 0K 0K 149
__AUTH_CONST 17.7M 11.5M 0K 0K 0K 0K 0K 340
__CTF 824 824 0K 0K 0K 0K 0K 1
__DATA 4453K 2379K 346K 0K 0K 0K 0K 297
__DATA_CONST 17.6M 12.3M 1344K 0K 0K 0K 0K 339
__DATA_DIRTY 1320K 1056K 351K 0K 0K 0K 0K 284
__FONT_DATA 2352 2352 0K 0K 0K 0K 0K 1
__LINKEDIT 573.7M 32.9M 0K 0K 0K 0K 0K 2
__OBJC_RO 79.2M 59.9M 0K 0K 0K 0K 0K 1
__OBJC_RW 2599K 2375K 39K 0K 0K 0K 0K 1
__TEXT 324.7M 179.6M 0K 0K 0K 0K 0K 348
__TPRO_CONST 128K 112K 48K 0K 0K 0K 0K 2
page table in kernel 1779K 1779K 1779K 0K 0K 0K 0K 1
shared memory 48K 48K 48K 0K 0K 0K 0K 2
unused but dirty shlib __DATA 79K 79K 79K 0K 0K 0K 0K 39
=========== ======= ======== ===== ======= ======== ====== ===== =======
TOTAL 6.9G 884.9M 584.0M 0K 0K 0K 0K 2238
TOTAL, minus reserved VM space 4.0G 884.9M 584.0M 0K 0K 0K 0K 2238
VIRTUAL RESIDENT DIRTY SWAPPED ALLOCATION BYTES DIRTY+SWAP REGION
MALLOC ZONE SIZE SIZE SIZE SIZE COUNT ALLOCATED FRAG SIZE % FRAG COUNT
=========== ======= ========= ========= ========= ========= ========= ========= ====== ======
DefaultMallocZone_0x10345c000 68.8M 22.3M 22.3M 0K 5530 22.0M 269K 2% 19

View file

@ -0,0 +1,65 @@
Process: igneumd [55063]
Path: /Users/USER/*/igneumd
Load Address: 0x100a4c000
Identifier: igneumd
Version: 0
Code Type: ARM64
Platform: macOS
Parent Process: node [53092]
Target Type: live task
Date/Time: 2026-10-05 02:28:14.170 +0100
Launch Time: 2026-10-05 02:19:55.547 +0100
OS Version: macOS 26.6.2 (25G83)
Report Version: 7
Analysis Tool: /usr/bin/vmmap
Physical footprint: 299.2M
Physical footprint (peak): 299.2M
Idle exit: untracked
----
ReadOnly portion of Libraries: Total=898.4M resident=212.3M(24%) swapped_out_or_unallocated=686.1M(76%)
Writable regions: Total=4.5G written=297.2M(6%) resident=297.2M(6%) swapped_out=0K(0%) unallocated=4.2G(94%)
VIRTUAL RESIDENT DIRTY SWAPPED VOLATILE NONVOL EMPTY REGION
REGION TYPE SIZE SIZE SIZE SIZE SIZE SIZE SIZE COUNT (non-coalesced)
=========== ======= ======== ===== ======= ======== ====== ===== =======
IOAccelerator 2.4G 284.5M 284.5M 0K 0K 0K 0K 84
IOAccelerator (reserved) 1.9G 0K 0K 0K 0K 0K 0K 1 reserved VM address space (unallocated)
Kernel Alloc Once 32K 16K 16K 0K 0K 0K 0K 1
MALLOC guard page 3632K 0K 0K 0K 0K 0K 0K 4
MALLOC metadata 880K 496K 496K 0K 0K 0K 0K 4
MALLOC_SMALL 36.0M 8320K 8320K 0K 0K 0K 0K 9 see MALLOC ZONE table below
MALLOC_SMALL (empty) 4096K 32K 32K 0K 0K 0K 0K 1 see MALLOC ZONE table below
MALLOC_TINY 4096K 208K 208K 0K 0K 0K 0K 1 see MALLOC ZONE table below
Memory Tag 22 64.0M 16K 16K 0K 0K 0K 0K 1
STACK GUARD 1424K 0K 0K 0K 0K 0K 0K 89
Stack 154.2M 2128K 2128K 0K 0K 0K 0K 90
Stack Guard 56.0M 0K 0K 0K 0K 0K 0K 1
VM_ALLOCATE 1088K 0K 0K 0K 0K 0K 0K 68
VM_ALLOCATE (reserved) 8576K 0K 0K 0K 0K 0K 0K 67 reserved VM address space (unallocated)
__AUTH 1321K 925K 0K 0K 0K 0K 0K 149
__AUTH_CONST 17.7M 11.5M 0K 0K 0K 0K 0K 340
__CTF 824 824 0K 0K 0K 0K 0K 1
__DATA 4453K 2379K 346K 0K 0K 0K 0K 297
__DATA_CONST 17.6M 12.3M 1344K 0K 0K 0K 0K 339
__DATA_DIRTY 1320K 1072K 351K 0K 0K 0K 0K 284
__FONT_DATA 2352 2352 0K 0K 0K 0K 0K 1
__LINKEDIT 573.7M 32.9M 0K 0K 0K 0K 0K 2
__OBJC_RO 79.2M 59.8M 0K 0K 0K 0K 0K 1
__OBJC_RW 2599K 2375K 39K 0K 0K 0K 0K 1
__TEXT 324.7M 179.4M 0K 0K 0K 0K 0K 348
__TPRO_CONST 128K 112K 48K 0K 0K 0K 0K 2
page table in kernel 1634K 1634K 1634K 0K 0K 0K 0K 1
shared memory 48K 48K 48K 0K 0K 0K 0K 2
unused but dirty shlib __DATA 79K 79K 79K 0K 0K 0K 0K 39
=========== ======= ======== ===== ======= ======== ====== ===== =======
TOTAL 5.6G 599.7M 299.2M 0K 0K 0K 0K 2228
TOTAL, minus reserved VM space 3.7G 599.7M 299.2M 0K 0K 0K 0K 2228
VIRTUAL RESIDENT DIRTY SWAPPED ALLOCATION BYTES DIRTY+SWAP REGION
MALLOC ZONE SIZE SIZE SIZE SIZE COUNT ALLOCATED FRAG SIZE % FRAG COUNT
=========== ======= ========= ========= ========= ========= ========= ========= ====== ======
DefaultMallocZone_0x10345c000 44.8M 9024K 9024K 0K 5463 9157K 0K 0% 13

View file

@ -0,0 +1,65 @@
Process: igneumd [55718]
Path: /Users/USER/*/igneumd
Load Address: 0x102804000
Identifier: igneumd
Version: 0
Code Type: ARM64
Platform: macOS
Parent Process: node [53051]
Target Type: live task
Date/Time: 2026-10-05 02:22:42.382 +0100
Launch Time: 2026-10-05 02:22:34.566 +0100
OS Version: macOS 26.6.2 (25G83)
Report Version: 7
Analysis Tool: /usr/bin/vmmap
Physical footprint: 22.5M
Physical footprint (peak): 22.5M
Idle exit: untracked
----
ReadOnly portion of Libraries: Total=898.4M resident=210.9M(23%) swapped_out_or_unallocated=687.4M(77%)
Writable regions: Total=4.3G written=20.5M(0%) resident=20.5M(0%) swapped_out=0K(0%) unallocated=4.2G(100%)
VIRTUAL RESIDENT DIRTY SWAPPED VOLATILE NONVOL EMPTY REGION
REGION TYPE SIZE SIZE SIZE SIZE SIZE SIZE SIZE COUNT (non-coalesced)
=========== ======= ======== ===== ======= ======== ====== ===== =======
IOAccelerator 2.3G 14.0M 14.0M 0K 0K 0K 0K 71
IOAccelerator (reserved) 1.8G 0K 0K 0K 0K 0K 0K 2 reserved VM address space (unallocated)
Kernel Alloc Once 32K 16K 16K 0K 0K 0K 0K 1
MALLOC guard page 3984K 0K 0K 0K 0K 0K 0K 4
MALLOC metadata 880K 480K 480K 0K 0K 0K 0K 4
MALLOC_SMALL 32.0M 2560K 2560K 0K 0K 0K 0K 8 see MALLOC ZONE table below
MALLOC_SMALL (empty) 4096K 32K 32K 0K 0K 0K 0K 1 see MALLOC ZONE table below
MALLOC_TINY 4096K 192K 192K 0K 0K 0K 0K 1 see MALLOC ZONE table below
Memory Tag 22 64.0M 16K 16K 0K 0K 0K 0K 1
STACK GUARD 1424K 0K 0K 0K 0K 0K 0K 89
Stack 154.2M 1728K 1728K 0K 0K 0K 0K 90
Stack Guard 56.0M 0K 0K 0K 0K 0K 0K 1
VM_ALLOCATE 1088K 0K 0K 0K 0K 0K 0K 68
VM_ALLOCATE (reserved) 8576K 0K 0K 0K 0K 0K 0K 67 reserved VM address space (unallocated)
__AUTH 1321K 925K 0K 0K 0K 0K 0K 149
__AUTH_CONST 17.7M 11.5M 0K 0K 0K 0K 0K 340
__CTF 824 824 0K 0K 0K 0K 0K 1
__DATA 4453K 2379K 346K 0K 0K 0K 0K 297
__DATA_CONST 17.6M 12.3M 1344K 0K 0K 0K 0K 339
__DATA_DIRTY 1320K 1072K 351K 0K 0K 0K 0K 284
__FONT_DATA 2352 2352 0K 0K 0K 0K 0K 1
__LINKEDIT 573.7M 32.9M 0K 0K 0K 0K 0K 2
__OBJC_RO 79.2M 59.8M 0K 0K 0K 0K 0K 1
__OBJC_RW 2599K 2375K 39K 0K 0K 0K 0K 1
__TEXT 324.7M 178.0M 0K 0K 0K 0K 0K 348
__TPRO_CONST 128K 112K 48K 0K 0K 0K 0K 2
page table in kernel 1474K 1474K 1474K 0K 0K 0K 0K 1
shared memory 48K 48K 48K 0K 0K 0K 0K 2
unused but dirty shlib __DATA 79K 79K 79K 0K 0K 0K 0K 39
=========== ======= ======== ===== ======= ======== ====== ===== =======
TOTAL 5.3G 321.7M 22.6M 0K 0K 0K 0K 2215
TOTAL, minus reserved VM space 3.6G 321.7M 22.6M 0K 0K 0K 0K 2215
VIRTUAL RESIDENT DIRTY SWAPPED ALLOCATION BYTES DIRTY+SWAP REGION
MALLOC ZONE SIZE SIZE SIZE SIZE COUNT ALLOCATED FRAG SIZE % FRAG COUNT
=========== ======= ========= ========= ========= ========= ========= ========= ====== ======
DefaultMallocZone_0x1053e0000 40.8M 3232K 3232K 0K 5445 3009K 223K 7% 12

View file

@ -0,0 +1,65 @@
Process: igneumd [55718]
Path: /Users/USER/*/igneumd
Load Address: 0x102804000
Identifier: igneumd
Version: 0
Code Type: ARM64
Platform: macOS
Parent Process: node [53051]
Target Type: live task
Date/Time: 2026-10-05 02:38:53.727 +0100
Launch Time: 2026-10-05 02:22:34.566 +0100
OS Version: macOS 26.6.2 (25G83)
Report Version: 7
Analysis Tool: /usr/bin/vmmap
Physical footprint: 1.3G
Physical footprint (peak): 1.3G
Idle exit: untracked
----
ReadOnly portion of Libraries: Total=898.4M resident=212.3M(24%) swapped_out_or_unallocated=686.0M(76%)
Writable regions: Total=10.3G written=1.3G(13%) resident=1.3G(13%) swapped_out=0K(0%) unallocated=9.0G(87%)
VIRTUAL RESIDENT DIRTY SWAPPED VOLATILE NONVOL EMPTY REGION
REGION TYPE SIZE SIZE SIZE SIZE SIZE SIZE SIZE COUNT (non-coalesced)
=========== ======= ======== ===== ======= ======== ====== ===== =======
IOAccelerator 3.8G 1.3G 1.3G 0K 0K 0K 0K 83
IOAccelerator (reserved) 6.2G 0K 0K 0K 0K 0K 0K 6 reserved VM address space (unallocated)
Kernel Alloc Once 32K 16K 16K 0K 0K 0K 0K 1
MALLOC guard page 3984K 0K 0K 0K 0K 0K 0K 4
MALLOC metadata 880K 560K 560K 0K 0K 0K 0K 4
MALLOC_SMALL 44.0M 14.3M 14.3M 0K 0K 0K 0K 11 see MALLOC ZONE table below
MALLOC_SMALL (empty) 12.0M 96K 96K 0K 0K 0K 0K 3 see MALLOC ZONE table below
MALLOC_TINY 4096K 192K 192K 0K 0K 0K 0K 1 see MALLOC ZONE table below
Memory Tag 22 64.0M 16K 16K 0K 0K 0K 0K 1
STACK GUARD 1424K 0K 0K 0K 0K 0K 0K 89
Stack 154.2M 2080K 2080K 0K 0K 0K 0K 90
Stack Guard 56.0M 0K 0K 0K 0K 0K 0K 1
VM_ALLOCATE 1088K 0K 0K 0K 0K 0K 0K 68
VM_ALLOCATE (reserved) 8576K 0K 0K 0K 0K 0K 0K 67 reserved VM address space (unallocated)
__AUTH 1321K 925K 0K 0K 0K 0K 0K 149
__AUTH_CONST 17.7M 11.5M 0K 0K 0K 0K 0K 340
__CTF 824 824 0K 0K 0K 0K 0K 1
__DATA 4453K 2379K 346K 0K 0K 0K 0K 297
__DATA_CONST 17.6M 12.3M 1344K 0K 0K 0K 0K 339
__DATA_DIRTY 1320K 1056K 351K 0K 0K 0K 0K 284
__FONT_DATA 2352 2352 0K 0K 0K 0K 0K 1
__LINKEDIT 573.7M 32.9M 0K 0K 0K 0K 0K 2
__OBJC_RO 79.2M 59.9M 0K 0K 0K 0K 0K 1
__OBJC_RW 2599K 2375K 39K 0K 0K 0K 0K 1
__TEXT 324.7M 179.4M 0K 0K 0K 0K 0K 348
__TPRO_CONST 128K 112K 48K 0K 0K 0K 0K 2
page table in kernel 2211K 2211K 2211K 0K 0K 0K 0K 1
shared memory 48K 48K 48K 0K 0K 0K 0K 2
unused but dirty shlib __DATA 79K 79K 79K 0K 0K 0K 0K 39
=========== ======= ======== ===== ======= ======== ====== ===== =======
TOTAL 11.3G 1.6G 1.3G 0K 0K 0K 0K 2236
TOTAL, minus reserved VM space 5.1G 1.6G 1.3G 0K 0K 0K 0K 2236
VIRTUAL RESIDENT DIRTY SWAPPED ALLOCATION BYTES DIRTY+SWAP REGION
MALLOC ZONE SIZE SIZE SIZE SIZE COUNT ALLOCATED FRAG SIZE % FRAG COUNT
=========== ======= ========= ========= ========= ========= ========= ========= ====== ======
DefaultMallocZone_0x1053e0000 60.8M 15.1M 15.1M 0K 5467 14.9M 203K 2% 17

View file

@ -0,0 +1,65 @@
Process: igneumd [55718]
Path: /Users/USER/*/igneumd
Load Address: 0x102804000
Identifier: igneumd
Version: 0
Code Type: ARM64
Platform: macOS
Parent Process: node [53051]
Target Type: live task
Date/Time: 2026-10-05 02:47:59.295 +0100
Launch Time: 2026-10-05 02:22:34.566 +0100
OS Version: macOS 26.6.2 (25G83)
Report Version: 7
Analysis Tool: /usr/bin/vmmap
Physical footprint: 1.3G
Physical footprint (peak): 1.3G
Idle exit: untracked
----
ReadOnly portion of Libraries: Total=898.4M resident=212.3M(24%) swapped_out_or_unallocated=686.0M(76%)
Writable regions: Total=10.3G written=1.3G(13%) resident=1.3G(13%) swapped_out=0K(0%) unallocated=9.0G(87%)
VIRTUAL RESIDENT DIRTY SWAPPED VOLATILE NONVOL EMPTY REGION
REGION TYPE SIZE SIZE SIZE SIZE SIZE SIZE SIZE COUNT (non-coalesced)
=========== ======= ======== ===== ======= ======== ====== ===== =======
IOAccelerator 3.8G 1.3G 1.3G 0K 0K 0K 0K 83
IOAccelerator (reserved) 6.2G 0K 0K 0K 0K 0K 0K 6 reserved VM address space (unallocated)
Kernel Alloc Once 32K 16K 16K 0K 0K 0K 0K 1
MALLOC guard page 3984K 0K 0K 0K 0K 0K 0K 4
MALLOC metadata 880K 592K 592K 0K 0K 0K 0K 4
MALLOC_SMALL 52.0M 21.5M 21.5M 0K 0K 0K 0K 13 see MALLOC ZONE table below
MALLOC_SMALL (empty) 12.0M 96K 96K 0K 0K 0K 0K 3 see MALLOC ZONE table below
MALLOC_TINY 4096K 192K 192K 0K 0K 0K 0K 1 see MALLOC ZONE table below
Memory Tag 22 64.0M 16K 16K 0K 0K 0K 0K 1
STACK GUARD 1424K 0K 0K 0K 0K 0K 0K 89
Stack 154.2M 2144K 2144K 0K 0K 0K 0K 90
Stack Guard 56.0M 0K 0K 0K 0K 0K 0K 1
VM_ALLOCATE 1088K 0K 0K 0K 0K 0K 0K 68
VM_ALLOCATE (reserved) 8576K 0K 0K 0K 0K 0K 0K 67 reserved VM address space (unallocated)
__AUTH 1321K 925K 0K 0K 0K 0K 0K 149
__AUTH_CONST 17.7M 11.5M 0K 0K 0K 0K 0K 340
__CTF 824 824 0K 0K 0K 0K 0K 1
__DATA 4453K 2379K 346K 0K 0K 0K 0K 297
__DATA_CONST 17.6M 12.3M 1344K 0K 0K 0K 0K 339
__DATA_DIRTY 1320K 1056K 351K 0K 0K 0K 0K 284
__FONT_DATA 2352 2352 0K 0K 0K 0K 0K 1
__LINKEDIT 573.7M 32.9M 0K 0K 0K 0K 0K 2
__OBJC_RO 79.2M 59.9M 0K 0K 0K 0K 0K 1
__OBJC_RW 2599K 2375K 39K 0K 0K 0K 0K 1
__TEXT 324.7M 179.4M 0K 0K 0K 0K 0K 348
__TPRO_CONST 128K 112K 48K 0K 0K 0K 0K 2
page table in kernel 2211K 2211K 2211K 0K 0K 0K 0K 1
shared memory 48K 48K 48K 0K 0K 0K 0K 2
unused but dirty shlib __DATA 79K 79K 79K 0K 0K 0K 0K 39
=========== ======= ======== ===== ======= ======== ====== ===== =======
TOTAL 11.4G 1.6G 1.3G 0K 0K 0K 0K 2238
TOTAL, minus reserved VM space 5.1G 1.6G 1.3G 0K 0K 0K 0K 2238
VIRTUAL RESIDENT DIRTY SWAPPED ALLOCATION BYTES DIRTY+SWAP REGION
MALLOC ZONE SIZE SIZE SIZE SIZE COUNT ALLOCATED FRAG SIZE % FRAG COUNT
=========== ======= ========= ========= ========= ========= ========= ========= ====== ======
DefaultMallocZone_0x1053e0000 68.8M 22.4M 22.4M 0K 5528 22.0M 333K 2% 19

View file

@ -0,0 +1,65 @@
Process: igneumd [55718]
Path: /Users/USER/*/igneumd
Load Address: 0x102804000
Identifier: igneumd
Version: 0
Code Type: ARM64
Platform: macOS
Parent Process: node [53051]
Target Type: live task
Date/Time: 2026-10-05 02:30:49.931 +0100
Launch Time: 2026-10-05 02:22:34.566 +0100
OS Version: macOS 26.6.2 (25G83)
Report Version: 7
Analysis Tool: /usr/bin/vmmap
Physical footprint: 1.3G
Physical footprint (peak): 1.3G
Idle exit: untracked
----
ReadOnly portion of Libraries: Total=898.4M resident=212.1M(24%) swapped_out_or_unallocated=686.3M(76%)
Writable regions: Total=10.3G written=1.3G(13%) resident=1.3G(13%) swapped_out=0K(0%) unallocated=9.0G(87%)
VIRTUAL RESIDENT DIRTY SWAPPED VOLATILE NONVOL EMPTY REGION
REGION TYPE SIZE SIZE SIZE SIZE SIZE SIZE SIZE COUNT (non-coalesced)
=========== ======= ======== ===== ======= ======== ====== ===== =======
IOAccelerator 3.8G 1.3G 1.3G 0K 0K 0K 0K 83
IOAccelerator (reserved) 6.2G 0K 0K 0K 0K 0K 0K 6 reserved VM address space (unallocated)
Kernel Alloc Once 32K 16K 16K 0K 0K 0K 0K 1
MALLOC guard page 3984K 0K 0K 0K 0K 0K 0K 4
MALLOC metadata 880K 528K 528K 0K 0K 0K 0K 4
MALLOC_SMALL 36.0M 8304K 8304K 0K 0K 0K 0K 9 see MALLOC ZONE table below
MALLOC_SMALL (empty) 12.0M 80K 80K 0K 0K 0K 0K 3 see MALLOC ZONE table below
MALLOC_TINY 4096K 192K 192K 0K 0K 0K 0K 1 see MALLOC ZONE table below
Memory Tag 22 64.0M 16K 16K 0K 0K 0K 0K 1
STACK GUARD 1424K 0K 0K 0K 0K 0K 0K 89
Stack 154.2M 2048K 2048K 0K 0K 0K 0K 90
Stack Guard 56.0M 0K 0K 0K 0K 0K 0K 1
VM_ALLOCATE 1088K 0K 0K 0K 0K 0K 0K 68
VM_ALLOCATE (reserved) 8576K 0K 0K 0K 0K 0K 0K 67 reserved VM address space (unallocated)
__AUTH 1321K 925K 0K 0K 0K 0K 0K 149
__AUTH_CONST 17.7M 11.5M 0K 0K 0K 0K 0K 340
__CTF 824 824 0K 0K 0K 0K 0K 1
__DATA 4453K 2379K 346K 0K 0K 0K 0K 297
__DATA_CONST 17.6M 12.3M 1344K 0K 0K 0K 0K 339
__DATA_DIRTY 1320K 1072K 351K 0K 0K 0K 0K 284
__FONT_DATA 2352 2352 0K 0K 0K 0K 0K 1
__LINKEDIT 573.7M 32.9M 0K 0K 0K 0K 0K 2
__OBJC_RO 79.2M 59.8M 0K 0K 0K 0K 0K 1
__OBJC_RW 2599K 2375K 39K 0K 0K 0K 0K 1
__TEXT 324.7M 179.2M 0K 0K 0K 0K 0K 348
__TPRO_CONST 128K 112K 48K 0K 0K 0K 0K 2
page table in kernel 2211K 2211K 2211K 0K 0K 0K 0K 1
shared memory 48K 48K 48K 0K 0K 0K 0K 2
unused but dirty shlib __DATA 79K 79K 79K 0K 0K 0K 0K 39
=========== ======= ======== ===== ======= ======== ====== ===== =======
TOTAL 11.3G 1.6G 1.3G 0K 0K 0K 0K 2234
TOTAL, minus reserved VM space 5.1G 1.6G 1.3G 0K 0K 0K 0K 2234
VIRTUAL RESIDENT DIRTY SWAPPED ALLOCATION BYTES DIRTY+SWAP REGION
MALLOC ZONE SIZE SIZE SIZE SIZE COUNT ALLOCATED FRAG SIZE % FRAG COUNT
=========== ======= ========= ========= ========= ========= ========= ========= ====== ======
DefaultMallocZone_0x1053e0000 52.8M 9072K 9072K 0K 5461 9157K 0K 0% 15

View file

@ -71,6 +71,7 @@ leaves the test network stopped. Exit code is non-zero if any scenario failed.
| 5 | Malformed and boundary inputs on every p2p message and RPC method the fork touches | live + p2p | fork-divergence header and RPC rows; ledger M15: rejected without a crash or a cache build |
| 6 | Resource exhaustion (50x template, submit and mempool floods from one peer) | live | honest template p95 under 200 ms, node under its memory bound; numbers recorded |
| 7 | Fast-miner flood (50x joins at once, the devnet event) | live + sim | node stays responsive; controller trajectory recorded for the difficulty branch |
| 8 | Steady state: one honest miner at 1 block/s, no flood, 1,500 blocks (ledger M30 follow-up) | live | recorded only: RSS of the mining node and the follower at 0, 500, 1,000 and 1,500 blocks, cache builds, `vmmap -summary` at each milestone (`IGNEUM_STEADY_BLOCKS`, `IGNEUM_STEADY_MAX_MIN`) |
Scenario 5 overlaps the `r3-fixes` branch (ledger M15): that branch runs the cheap checks before the lottery
engine, caps cache builds and bans the peer. On this node branch (HEAD, `d62708a8`, before r3-fixes) the engine

View file

@ -27,6 +27,7 @@ const SCENARIOS = {
s5: () => import('./scenarios/s5-malformed.mjs'),
s6: () => import('./scenarios/s6-exhaustion.mjs'),
s7: () => import('./scenarios/s7-flood.mjs'),
s8: () => import('./scenarios/s8-steady.mjs'), // steady state, not in the priority order (25 min, no criterion)
};
const PRIORITY = ['s5', 's2', 's1', 's3', 's6', 's4', 's7'];

View file

@ -0,0 +1,77 @@
// Scenario 8: steady state, no flood (ledger M30 follow-up, 5 October 2026). Node A takes one honest virtual miner
// at 1 block/s; node B follows. Every 60 s: RSS of both nodes, the block count, the count of "PoW cache built" lines
// in each node log, and (at the block milestones) `vmmap -summary` of both nodes, so malloc-held memory can be told
// from mapped. Runs until `blocks` chain blocks (IGNEUM_STEADY_BLOCKS, default 1,500) or `maxMinutes`
// (IGNEUM_STEADY_MAX_MIN, default 40), whichever first. No pass criterion: the row records RSS at 0, 500, 1,000 and
// 1,500 blocks, so the ledger can state MB per 1,000 blocks before and after a change.
import { Node, stopAll, dagInfo, log, sleep, assertBinaries, TMP } from '../lib/net.mjs';
import { Miner } from '../lib/miner.mjs';
import { saveResult } from '../lib/report.mjs';
import { execSync } from 'node:child_process';
import { mkdirSync, writeFileSync } from 'node:fs';
const MILESTONES = [0, 500, 1000, 1500];
function vmmapSummary(node, tag) {
if (!node.alive()) return null;
try {
const out = execSync(`vmmap -summary ${node.proc.pid}`, { timeout: 60000, stdio: ['ignore', 'pipe', 'ignore'] }).toString();
mkdirSync(`${TMP}/vmmap`, { recursive: true });
writeFileSync(`${TMP}/vmmap/${node.name}-${tag}.txt`, out);
const pick = (re) => { const m = out.match(re); return m ? m[1].trim() : null; };
return {
physical_footprint: pick(/Physical footprint:\s+([^\n]+)/),
malloc_total: pick(/\nMALLOC\s+[^\n]*?\s(\S+)\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s*\n/) || pick(/TOTAL\s+([^\n]+)/),
file: `${TMP}/vmmap/${node.name}-${tag}.txt`,
};
} catch (e) { return { error: String(e.message).slice(0, 120) }; }
}
export async function run({ blocks = parseInt(process.env.IGNEUM_STEADY_BLOCKS || '1500', 10), maxMinutes = parseInt(process.env.IGNEUM_STEADY_MAX_MIN || '40', 10) } = {}) {
assertBinaries();
const a = await new Node(0, { name: 's8a' }).start();
const b = await new Node(1, { name: 's8b', connect: [a.p2p] }).start();
await sleep(5000);
const builds = (n) => n.grepLog(/PoW cache built/).length;
const samples = []; const milestones = {};
const t0 = Date.now();
const sample = async (tag) => {
const ia = await dagInfo(a); const ib = await dagInfo(b);
const s = { t_s: Math.round((Date.now() - t0) / 1000), blocks_a: ia.blockCount, blocks_b: ib.blockCount, daa_a: ia.virtualDaaScore ?? null, rss_a: a.rssMb(), rss_b: b.rssMb(), cache_builds_a: builds(a), cache_builds_b: builds(b), same_sink: ia.sink === ib.sink, load: (() => { try { return execSync('uptime').toString().match(/load averages?: ([\d. ]+)/)?.[1].trim(); } catch { return ''; } })() };
samples.push(s);
log(`s8 ${s.t_s}s: blocks ${s.blocks_a}/${s.blocks_b} rss ${s.rss_a}/${s.rss_b} MB cache builds ${s.cache_builds_a}/${s.cache_builds_b} same=${s.same_sink} load ${s.load}`);
if (tag) { s.vmmap_a = vmmapSummary(a, tag); s.vmmap_b = vmmapSummary(b, tag); milestones[tag] = s; }
return s;
};
await sample('0');
const honest = new Miner({ node: a, share: 1, label: 'honest-s8' }); await honest.start();
let nextMilestone = 1;
while (Date.now() - t0 < maxMinutes * 60000) {
await sleep(60000);
const s = await sample(null);
while (nextMilestone < MILESTONES.length && s.blocks_a >= MILESTONES[nextMilestone]) {
const tag = String(MILESTONES[nextMilestone]); s.vmmap_a = vmmapSummary(a, tag); s.vmmap_b = vmmapSummary(b, tag); milestones[tag] = s; nextMilestone++;
}
if (s.blocks_a >= blocks) break;
}
honest.stop();
const end = await sample('end');
const alive = a.alive() && b.alive();
await stopAll();
const at = (k) => milestones[k] ? `${milestones[k].rss_a}/${milestones[k].rss_b} MB at ${milestones[k].blocks_a} blocks (${milestones[k].cache_builds_a}/${milestones[k].cache_builds_b} builds)` : 'not reached';
const row = {
scenario: '8 steady state, one honest miner at 1 block/s, no flood (RSS per 1,000 blocks)',
criterion: 'recorded: RSS of the mining node / the follower at 0, 500, 1,000 and 1,500 blocks, cache builds',
result: `0: ${at('0')}; 500: ${at('500')}; 1000: ${at('1000')}; 1500: ${at('1500')}; end ${end.blocks_a} blocks in ${end.t_s} s: ${end.rss_a}/${end.rss_b} MB; honest accepted ${honest.accepted} rejected ${honest.rejected} errors ${honest.errors}; alive ${alive}`,
pass: null,
};
saveResult('s8-steady', { rows: [row], data: { samples, milestones, honest: { accepted: honest.accepted, rejected: honest.rejected, errors: honest.errors }, alive } });
return { rows: [row], data: { samples, milestones } };
}
if (import.meta.url === `file://${process.argv[1]}`) {
const r = await run({});
console.log(JSON.stringify(r.rows, null, 2));
process.exit(0);
}