From f681867692f575b078f46afaf07060faed457461 Mon Sep 17 00:00:00 2001 From: "Somhairle H. Marisol" Date: Tue, 29 Sep 2026 04:23:26 +0800 Subject: p59: Sim 多世界并存后台压测(内存/GC 增长曲线证据单,只读) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 目标:量化「多世界并存 × 天数」的内存/GC 增长,收口 P49 范围外项。 口径:新增 Headless `--profile-multiworld `, N 个 Sim 世界同时存活,每轮 Parallel.For 各推进 sampleEveryDays 天并采样一行 (worlds/events/rumors/annals/memory_entries/gc_live_mb/working_set_rss_mb/elapsed_s, 行尾 flush);未改 Kernel/Sim 任何语义(Sim.initialWorldN / Sim.step 原样调用)。 标定:1 世界 × 2 天探针 = 34.2s(与 overnight-status 的 34.6s 一致),据此定 N=10 × 20 天。 运行:独立 systemd --user transient unit living-village-multiworld.service (scripts/profile-multiworld.sh,StandardOutput=append: + exec 2>&1,state.json 记 pid/unit/log/commit/参数/起止/exit)。主运行 wall=1024.4s(17.1min < 40min),exit=0。 结论(artifacts/perf-multiworld/20260928T195839Z/README.md): - 随世界数近似线性,未超线性:N=1 vs N=10(同日 D=20)annals/memory_entries 恰 10×、 rumors 9.67×、gc_live 8.81×(每世界 1.23MB,共享运行时开销摊薄)。 - RSS 有界无泄漏:N=10 39→峰值123(day8)→稳定104~112MB;每 2 天一轮墙钟恒 101~105s。 原因是历史集合有界(rumorRetentionDays=3 / rumorCapacity=16384 / maxAnnalEntries=128 / Mind.Memory 上限),约 day4 后进入稳态。 - 两轮世界0 digest 一致(2364CB74…)→ 并存+并行不改变单世界语义。 - 数字未越界 → 明确「不修」;只读本 slice 不修 Kernel/Sim。 回归:Desktop 304/304 + Kernel 119/119;--performance-baseline ×3 digest 953775FAEB2F… 不变,performance_determinism=PASS。未 push。 --- src/LivingVillage.Desktop.Tests/M3BatchOutputTests.fs | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'src/LivingVillage.Desktop.Tests') diff --git a/src/LivingVillage.Desktop.Tests/M3BatchOutputTests.fs b/src/LivingVillage.Desktop.Tests/M3BatchOutputTests.fs index b1822c7..963d571 100644 --- a/src/LivingVillage.Desktop.Tests/M3BatchOutputTests.fs +++ b/src/LivingVillage.Desktop.Tests/M3BatchOutputTests.fs @@ -31,6 +31,13 @@ type M3BatchOutputTests () = Assert.AreEqual("[world 7] progress day=5/15 elapsed=61.2s", BatchOutput.progressLine 7 5L 15L 61.2) Assert.AreEqual("[world 0] progress day=15/15 elapsed=260.0s", BatchOutput.progressLine 0 15L 15L 260.0) + [] + member _.MultiworldLineReportsCountsGcRssAndElapsed () = + let line = BatchOutput.multiworldLine 8 4L 20L 1600L 32000L 64L 5120L (1048576L * 96L) (1048576L * 240L) 31.5 + Assert.AreEqual( + "multiworld_sample worlds=8 day=4/20 events=1600 rumors=32000 annals=64 memory_entries=5120 gc_live_mb=96.00 working_set_rss_mb=240.00 elapsed_s=31.5", + line) + [] member _.SummaryLineKeepsOldFieldsAndAppendsWallClock () = let line = BatchOutput.summaryLine 4 3 1 4 1.100 9.900 0.010 0.400 4 610.5 -- cgit v1.2.3