Docker Desktop 启动后会占用大量的系统内存,因为它默认会调用 Windows 下的 Linux 子系统即 WSL 。
占用内存的实际上是 WSL ,如果不安装 Docker Desktop,WSL 默认会用掉 600M 左右的内存。安装 Docker 服务后,内存默认会用到2G左右。Vmmem 进程会占用大量的系统资源,默认会将 CPU 所有的核数都会分给虚拟环境,内存会分出去 80%。
这里的资源分配方案是指 linux 最大可使用的系统资源,实际用多少算多少,分配的是一个限额。分配的资源信息可以进到 WSL 中在 linux 环境下进行查看。
如何修改这个默认限额?
在微软官方文档中已经给出了配置文件的示例,通过配置文件可以限制虚拟环境占用系统资源的数额。
WSL配置文件的位置为:
C:\Users\<UserName>\.wslconfig
官网配置文件示例:
# Settings apply across all Linux distros running on WSL 2 [wsl2] # Limits VM memory to use no more than 4 GB, this can be set as whole numbers using GB or MB memory=4GB # Sets the VM to use two virtual processors processors=2 # Specify a custom Linux kernel to use with your installed distros. The default kernel used can be found at https://github.com/microsoft/WSL2-Linux-Kernel kernel=C:\\temp\\myCustomKernel # Sets additional kernel parameters, in this case enabling older Linux base images such as Centos 6 kernelCommandLine = vsyscall=emulate # Sets amount of swap storage space to 8GB, default is 25% of available RAM swap=8GB # Sets swapfile path location, default is %USERPROFILE%\AppData\Local\Temp\swap.vhdx swapfile=C:\\temp\\wsl-swap.vhdx # Disable page reporting so WSL retains all allocated memory claimed from Windows and releases none back when free pageReporting=false # Turn off default connection to bind WSL 2 localhost to Windows localhost localhostforwarding=true # Disables nested virtualization nestedVirtualization=false # Turns on output console showing contents of dmesg when opening a WSL 2 distro for debugging debugConsole=true
示例文件中的后几项都是 Win11 才支持的,我们这里只用了解 Win10 下的功能。听说 Win11 的 WSL 已经支持图形化了,可以跑 Linux 下的图形界面程序,我没有 Win11 的环境就暂不深究了。
把配置文件简化一下,简化后的适用于我的环境的配置如下:
[wsl2] processors=2 memory=512MB swap=8GB localhostForwarding=true swapfile=D:\\temp\\wsl-swap.vhdx
我担心虚拟环境占用我的主机资源,虚拟机跑的是 linux 应用,慢点可以接受。所以我们内存限制在 512M,内存不够可以用 SSD 硬盘来凑,swap 缓存的大小给到了 8G,不担心内存不够程序会崩溃。
其中 swapfile 的目录路径需要提前创建,不然 swap 分区不会启用:
上图显示 swap 分区大小为 0,是异常情况。文件不用提前创建,但目录必须存在。
当 swap 分区没有启用时,内存分配过低是有风险的,下面这个例子就是 python 程序模拟占于 100M 、200M、280M 内存时,当占用到接近空闲内容的最大值时会触发 linux 系统杀内存的操作。可以看到 python 交互程序被 kill 掉了。
当然如果一次就请求超量的内存,会直接触发内存错误:MemoryError,即动态分配内存失败,此时程序并没有被 killed,相当于我们 C 语言中的 malloc() 调用失败。
所以要提前创建好swap分区的目录,再启动 wsl ,然后检查 swap 分区大小是否是我们设定的大小,并且swap分区的分区文件是否在对应目录生成。
swap分区文件会自动创建,并且当在配置文件中切换位置后也会自动删除。并且文件大小是自增长的,用多少会增长多少。
swap 和 swapfile 两个参数就介绍完了,其内 processors 是 CPU 的 核数,memory 是内存大小,单位可以是 MB,也可是 GB。我这里只给了 512M,属于极限操作。如果你不知道系统资源不够会出现什么后果,还是将资源给大一点。
参考(官网wsl配置说明)
https://learn.microsoft.com/en-us/windows/wsl/wsl-config
评论