Limiting WSL 2 Memory Usage to Prevent Vmmem Resource Exhaustion

Chris Child | 2022-12-06 | 2 min read

If you use Windows Subsystem for Linux (WSL 2) for development, you've likely noticed a process called Vmmem taking up a massive amount of RAM in Task Manager.

By default, WSL 2 can consume up to 80% of your total system memory. While this is great for performance within Linux, it can leave your Windows environment feeling sluggish, especially if you're running memory-heavy tools like Docker, IDEs, and multiple browser tabs simultaneously.

The Problem: The Memory Hog

WSL 2 uses a lightweight utility VM. Unlike traditional VMs, it doesn't always release memory back to the host OS immediately after the Linux processes have finished. This led to a well-known issue in the WSL repository where users report Vmmem consuming gigabytes of RAM even when WSL appears idle.

The Solution: .wslconfig

Fortunately, Microsoft provides a way to globally configure WSL 2 settings via a file called .wslconfig.

1. Create the configuration file

Open your Windows User Profile directory (you can type %UserProfile% in the File Explorer address bar). Look for a file named .wslconfig. If it doesn't exist, create a new text file and name it exactly .wslconfig (ensure there is no .txt extension).

2. Add memory limits

Open the file in a text editor like Notepad or VS Code and add the following configuration:

[wsl2]
# Limit the memory used by the WSL 2 VM to 4GB (adjust as needed)
memory=4GB 

# Limit the number of virtual processors to 2
processors=2

# Enable or disable swap (optional)
swap=8GB

3. Restart WSL

For these changes to take effect, you must shut down WSL completely. Open PowerShell or a Command Prompt and run:

wsl --shutdown

The next time you open a WSL terminal, the Vmmem process will be constrained by the limits you defined.

Which Limit Should You Choose?

A common recommendation is to set the memory limit to 50% of your system RAM or a fixed value like 4GB or 8GB, depending on your specific needs (e.g., if you are running large Kubernetes clusters or heavy compilation tasks).

Conclusion

By taking a few minutes to configure .wslconfig, you can prevent WSL 2 from starving your host machine of resources, ensuring a smoother development experience on both Windows and Linux.

Comments

Related Posts

nextsycl is a Rust + SYCL runtime for Intel Arc that runs a 63 GB MoE on one 32 GB Arc Pro B70 — the experts that don't fit live in pinned host RAM, the PLE table is streamed from disk, and MTP drafts double the single stream. What it took to get 1,200 tok/s prompt read and ~78 tok/s decode, including the prompt-cache bug that made every agent turn pay a full re-read.

RubyMine WSL2 Mappings

Chris Child | 2021-01-21 | 1 min readComments

For my Ruby development I have been using Visual Studio Code and WSL 2. I wanted to move to a more Ruby friendly IDE... RubyMine. I used this guide from the RubyMine Documentation: [https://www.jetb...