限制wsl2占用过多内存

本文主要记录使用wsl2长时间开启后占用过多系统内存的解决办法。

1、前言

前几天笔记本一直没有关机,后面发现系统内存已经被占满了,我的笔记本扣掉核显内存占用之后可用容量大概还有15G多一点,用任务管理器里面查看发现是Vmmem这个进程占用了大量的内存,这个就是wsl对应的虚拟机进程。

查询了相关资料发现这并不是个例,wsl2本身的机制似乎会不断地拿宿主机的内存来给自己当cache使用,并且拿了还不还,之前使用台式机的时候有关机的习惯因此并不会太明显,现在使用笔记本长时间不关机就触发了这个问题。目前来说主要有以下几个解决方案:

  • 重启wsl2
  • 使用.wslconfig文件限制资源
  • 调整内核参数定期释放cache内存

2、重启wsl2

如果我们直接关闭wsl2的窗口并不会关闭该wsl2的虚拟机,它依旧会在后台运行,需要关闭wsl2的话我们可以打开powershell,在里面使用wsl --shutdown命令就可以关闭全部的wsl2虚拟机了。之后再随意打开一个wsl2的窗口就会再次开启虚拟机。

这种方式释放内存最彻底,效果和物理机内存不足卡死然后直接重启是一样的。

3、限制wsl2内存使用

这个解决方案来自github,简单来说就是创建一个%UserProfile%\.wslconfig文件来限制wsl使用的内存总量。比如说我在Windows中使用的用户是tinychen,那么我就在C:\Users\tinychen中创建了一个.wslconfig文件,在里面加入以下内容来限制wsl2的内存总大小:

1
2
3
4
5
[wsl2]
processors=8
memory=8GB
swap=8GB
localhostForwarding=true

注意修改完成之后需要重启wsl2才能生效。更多详细的配置可以查看官方文档

4、定期释放cache内存

Linux内核中有一个参数/proc/sys/vm/drop_caches,是可以用来手动释放Linux中的cache缓存,如果发现wsl2的cache过大影响到宿主机正常运行了,可以手动执行以下命令来释放cache:

1
echo 3 > /proc/sys/vm/drop_caches

当然也可以设置成定时任务,每隔一段时间释放一次。