Windows Subsystem For Linux 2 的内存占用问题
注:这篇文章关注 WSL2,并非 WSL1。
电脑就开了几个浏览器窗口 + wsl2,内存占用就要爆了——资源管理器一看,是一个叫做 Vmmem 的进程。
在 WSL2 的 repo 里一照,最高票的 issue 也是这个问题。那么有什么办法可以解决呢?
方法一:及时清除占用
如果只是偶尔发生,那么可以通过运行这行命令解决:
echo "sync && echo 3 > /proc/sys/vm/drop_caches" | sudo sh
方法二:限制总内存占用
在你的用户文件夹下(即 %UserProfile%
)创建一个叫做 .wslconfig
的文件,并写入以下内容:
[wsl2]
memory=8GB
swap=4GB
localhostForwarding=true
memory 和 swap 的大小可以自己调整。这个方法一个潜在的问题是,如果某个程序持续的占用内存但内存却不够了,可能会被 Kill 掉。
方法三:cron + 方法一
在 root 的 crontab 内输入:
* * * * * echo 3 > /proc/sys/vm/drop_caches; touch /root/drop_caches_last_run
这样的话,就是每分钟清除一次占用。不过在设置之后,需要在 .bashrc
内添加 [ -z "$(ps -ef | grep cron | grep -v grep)" ] && sudo /etc/init.d/cron start &> /dev/null
,并且执行 visudo
添加 %sudo ALL=NOPASSWD: /etc/init.d/cron start
。
通过这个命令,你可以测试是否在自动运行:
sudo stat -c '%y' /root/drop_caches_last_run
ArchLinux on WSL2 不支持这个方法。我正在想一个用 genie 支持的方法,但是 ArchLinux 官方的 dotnet sdk 还没有更新。 Update (2021-04-17): 通过给 ArchLinux 弄一个 systemd 的方法(方法二),在启用
cronie
之后就能正常执行 root 的 cron 任务了。
但终究,看起来修复还需要等待好一段时间。
如果想试一试效果,目前可以参考这里,使用的是这个命令:
dd if=/dev/zero of=./dump.bin bs=4k iflag=fullblock,count_bytes count=20G
注:我不对您的电脑负责,请先了解一下是什么再执行。
顺便,WSL2 还有其它小问题……例如不会自动释放空间,不过这应该是 Hyper-V 的毛病吧。
如果喜欢本文,欢迎点击下方的「鼓掌」按钮!
如果上面没有加载出任何东西,可以点击这里。
如果喜欢本文,欢迎点击下方的「鼓掌」按钮!
如果上面没有加载出任何东西,可以点击这里。