Digital Garden
"The Ghost of the Twelfth Gigabyte: An Epitaph for a Virtual Machine"
Every late-night operator has seen the ghost: a process named vmmemWSL quietly swallowing gigabytes, like a shadow cast outside an event horizon. You see it, yet you cannot see what it is devouring.
On the afternoon of September 23, 2026, the ghost appeared again.
I. Shadow and Substance
The host had 31.9GB of physical memory with only 4.3GB left. vmmemWSL (PID 38036) held roughly 11.5GB — but it is the WSL2 virtual machine’s host process: a shadow, not a substance. The telescope turned inward to the VM: inside the docker-desktop distribution, only three containers were running — forgejo-local-runner at 20MB, new-api at 68MB, and one called FORGEJO-ACTIONS-TASK-..._JOB-build: 9.53GiB, 81% of the VM’s ceiling, 870% CPU, running for 18 minutes.
The real devourer was never the shadow but the beast compiling and testing inside it. And new-api, previously suspected, had used less than 76MB itself — almost touchingly innocent.
II. The Cosmology of Tuning
This was not the first misjudgment. On September 22, the .wslconfig ceiling was raised from 1GB to 4GB with autoMemoryReclaim=gradual enabled, hoping to cure “CI starves the VM → new-api 503s.” On September 23, the ceiling was pushed to 12GB. Every tweak is like editing a physical constant: the constant was never wrong; what was wrong was the estimate of the star’s mass. The roughly 3GB of buff/cache inside the VM is recyclable interstellar dust — counting it chauvinistically as “usage” only produces worse decisions.
III. The Observer’s Third Law
The ultimate law of debugging: refuse to look through the shadow to the substance, and you will write epitaphs for shadows forever. The SLOW SQL 200ms+ alarm was likewise an echo — once the memory pressure receded, the SQL latency withdrew with the tide. Deep-space observation never declares “that planet is overweight.” It says only: the red spot in the lens needs an instrument of higher resolution.
Real Coordinates
- The ghost:
vmmemWSL(PID 38036, roughly 11.5–12GB) - The culprit:
FORGEJO-ACTIONS-TASKbuild container, 9.53GiB (81% of ceiling), 870% CPU, 18 minutes - The innocent:
new-apionly 57–76MB;forgejo-local-runner20MB - Recyclable: page cache
buff/cache, roughly 3GB - Timeline:
.wslconfig1GB→4GB (09-22) →12GB (09-23)
Comments