Windows 下限制 Docker Desktop 的资源

小初seo 学习笔记2,177字数 2252阅读7分30秒阅读模式

Docker Desktop 启动后会占用大量的系统内存,因为它默认会调用 Windows 下的 Linux 子系统即 WSL 。

占用内存的实际上是 WSL ,如果不安装 Docker Desktop,WSL 默认会用掉 600M 左右的内存。安装 Docker 服务后,内存默认会用到2G左右。Vmmem 进程会占用大量的系统资源,默认会将 CPU 所有的核数都会分给虚拟环境,内存会分出去 80%。

Windows 下限制 Docker Desktop 的资源

这里的资源分配方案是指 linux 最大可使用的系统资源,实际用多少算多少,分配的是一个限额。分配的资源信息可以进到 WSL 中在 linux 环境下进行查看。

Windows 下限制 Docker Desktop 的资源

如何修改这个默认限额?

在微软官方文档中已经给出了配置文件的示例,通过配置文件可以限制虚拟环境占用系统资源的数额。

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

Windows 下限制 Docker Desktop 的资源

我担心虚拟环境占用我的主机资源,虚拟机跑的是 linux 应用,慢点可以接受。所以我们内存限制在 512M,内存不够可以用 SSD 硬盘来凑,swap 缓存的大小给到了 8G,不担心内存不够程序会崩溃。

其中 swapfile 的目录路径需要提前创建,不然 swap 分区不会启用:

Windows 下限制 Docker Desktop 的资源

上图显示 swap 分区大小为 0,是异常情况。文件不用提前创建,但目录必须存在。

当 swap 分区没有启用时,内存分配过低是有风险的,下面这个例子就是 python 程序模拟占于 100M 、200M、280M 内存时,当占用到接近空闲内容的最大值时会触发 linux 系统杀内存的操作。可以看到 python 交互程序被 kill 掉了。

Windows 下限制 Docker Desktop 的资源

当然如果一次就请求超量的内存,会直接触发内存错误:MemoryError,即动态分配内存失败,此时程序并没有被 killed,相当于我们 C 语言中的 malloc() 调用失败。

Windows 下限制 Docker Desktop 的资源

所以要提前创建好swap分区的目录,再启动 wsl ,然后检查 swap 分区大小是否是我们设定的大小,并且swap分区的分区文件是否在对应目录生成。

Windows 下限制 Docker Desktop 的资源

swap分区文件会自动创建,并且当在配置文件中切换位置后也会自动删除。并且文件大小是自增长的,用多少会增长多少。

Windows 下限制 Docker Desktop 的资源

swap 和 swapfile 两个参数就介绍完了,其内 processors 是 CPU 的 核数,memory 是内存大小,单位可以是 MB,也可是 GB。我这里只给了 512M,属于极限操作。如果你不知道系统资源不够会出现什么后果,还是将资源给大一点。

参考(官网wsl配置说明)

https://learn.microsoft.com/en-us/windows/wsl/wsl-config

  • 本文由 发表于 2023年1月29日 12:16:13
  • 转载请务必保留本文链接:https://www.pkak.cn/9376.html