一、限制 WSL2 性能

WSL2 理论上可用获取 Windows系统内管理的所有 CPU、内存资源,但这带来一个问题。

有时候我们使用 WSL2只是作为一个终端窗口使用,并不会使用太多 CPU或内存,但由于 Linux内核的内存管理机制,它会尽量缓存一些已经读取过的文件页,在很长一段时间内是不会释放的。并且这部分文件页也不会被 Windows回收,导致 WSL2占用过多内存,而Windows反而没有内存可用的情况。

针对这种场景,可以在 %UserProfile% 下创建一个.wslconfig文件来进行配置:

1
2
3
4
[wsl2]
processors=2
memory=2GB
swap=2GB
  • processors限制CPU核心数(会体现在/proc/cpuinfo等节点上)
  • memory可使用的内存总大小(会体现在/proc/meminfo等节点上)
  • swap交换空间的总大小(会体现在/proc/meminfo等节点上)

保存修改后关闭 WSL,并重新打开窗口启动

1
wsl --shutdown Ubuntu

查看是否生效:

1
2
3
4
5
6
7
8
9
10
loki@Lenovo-Tk:~$ cat /proc/cpuinfo | grep processors
loki@Lenovo-Tk:~$ cat /proc/cpuinfo | grep processor
processor : 0
processor : 1
loki@Lenovo-Tk:~$ cat /proc/meminfo | grep Total
MemTotal: 1964764 kB
SwapTotal: 2097152 kB
VmallocTotal: 34359738367 kB
HugePages_Total: 0
loki@Lenovo-Tk:~$

1.jpg

二、.wslconfig是什么文件 ?

.wslconfig 文件用于在 WSL 2 上运行的所有已安装分发版 全局 配置设置

正在运行的 WSL 版本会影响配置设置。WSL 2 作为轻型虚拟机 (VM) 运行,因此使用虚拟化设置来控制使用 (使用的内存量或处理器量,如果使用 Hyper-V 或 VirtualBox) ,则可能很熟悉这些内存或处理器量。

wslconfig

  • 存储在您的 %UserProfile% 目录中。
  • 用于在WSL 2版本运行的所有已安装Linux发行版中全局配置设置。
  • 只能用于由WSL 2运行的分发。作为WSL 1运行的分发不会受到此配置的影响,因为它们不是作为虚拟机运行的。
  • 要访问您的%UserProfile%目录,请在PowerShell中使用cd ~访问您的主目录(通常是您的用户配置文件C:\Users\<UserName>)或者您可以打开Windows文件资源管理器并在地址栏中输入 %UserProfile% 。目录路径应该类似于: C:\Users\<UserName>\.wslconfig

WSL将检测这些文件的存在,读取内容,并在每次启动WSL时自动应用配置设置。如果文件丢失或格式不正确(标记格式不正确),WSL将继续正常启动,而不应用配置设置。

第 8 秒的规则

您必须等到运行Linux发行版的子系统完全停止运行并重新启动,才能显示配置设置更新。这通常在关闭分发shell的所有实例后需要8秒左右。

如果您启动了一个发行版(即Ubuntu),请修改配置文件,关闭该发行版,然后重新启动它。您可以假设您的配置更改已立即生效。目前情况并非如此,因为子系统可能仍在运行。在重新启动之前,您必须等待子系统停止,以便有足够的时间提取您的更改。通过使用PowerShell和命令wsl--list--running,可以检查Linux发行版(shell)在关闭后是否仍在运行。如果没有正在运行的分发,您将收到响应:“没有正在运行的分发。”现在,您可以重新启动发行版以查看应用的配置更新。

命令wsl--shutdown是重新启动wsl 2发行版的快速途径,但它将关闭所有正在运行的发行版,因此请明智地使用。

.wslconfig 的配置设置

.wslconfig 文件全局配置使用 WSL 2 运行的所有 Linux 分发版的设置。

更新 .wslconfig 文件后需要使用命令 wsl –shutdown 重启 WSL 2 VM,让其生效

标签部分: [wsl2]

key value default notes
kernel string 在此提供了Microsoft构建的内核 自定义Linux内核的绝对Windows路径
memory size Windows总内存的50%或8GB,以较小者为准;在20175之前的版本上:Windows上总内存的80% 分配给WSL 2虚拟机的内存量
processors number 与Windows上的处理器数量相同 要分配给WSL 2虚拟机的处理器数量
localhostForwarding boolean true 一个布尔值,用于指定绑定到 WSL 2 VM 中的通配符或 localhost 的端口是否应可通过 localhost:port 从主机连接
kernelCommandLine string 其他内核命令行参数
swap size Windows 上 25% 的内存大小四舍五入到最接近的 GB 要向WSL 2虚拟机添加多少交换空间,0表示无交换文件。交换存储是在内存需求超过硬件设备限制时使用的基于磁盘的RAM
swapFile string %USERPROFILE%\AppData\Local\Temp\swap.vhdx 交换虚拟硬盘的绝对Windows路径
pageReporting boolean true 默认设置true允许Windows回收分配给 WSL 2 虚拟机的未使用的内存
guiApplications boolean true 一个布尔值,用于在 WSL 中打开或关闭对 GUI 应用程序 (WSLg) 的支持。 仅适用于Windows 11
debugConsole boolean false 一个布尔值,用于在 WSL 2 发行版实例启动时打开显示 dmesg内容的输出控制台窗口。 仅适用于Windows 11
nestedVirtualization boolean true 用于打开或关闭嵌套虚拟化的布尔值,使其他嵌套 VM 能够在 WSL 2 中运行。 仅适用于Windows 11
vmIdleTimeout number 60000 VM 在关闭之前处于空闲状态的毫秒数。 仅适用于Windows 11

示例 .wslconfig 文件

下面的.wslconfig示例文件演示了一些可用的配置选项。 在此示例中,文件路径为 C:\Users\<UserName>\.wslconfig

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 设置适用于运行在WSL 2上的所有Linux发行版
[wsl2]

# 限制虚拟机内存使用不超过4gb,可以设置为使用GB或MB的整数
memory=4GB

# 将VM设置为使用两个虚拟处理器
processors=2

# 指定用于安装发行版的自定义 Linux内核。使用的默认内核可以在 https://github.com/microsoft/WSL2-Linux-Kernel上找到
kernel=C:\\temp\\myCustomKernel

# 设置额外的内核参数,在本例中启用旧的Linux基本映像,如Centos 6
kernelCommandLine = vsyscall=emulate

#将交换存储空间设置为8GB,默认为可用RAM的25%
swap=8GB

# 设置交换文件路径位置,默认为 %USERPROFILE%\AppData\Local\Temp\swap.vhdx
swapfile=C:\\temp\\wsl-swap.vhdx

# 禁用页面报告,以便WSL保留从Windows请求的所有已分配内存,在空闲时不释放任何内存
pageReporting=false

# 关闭默认连接,将WSL 2 localhost绑定到 Windows localhost
localhostforwarding=true

# 禁用嵌套虚拟化
nestedVirtualization=false

# 打开WSL 2发行版进行调试时,打开显示dmesg内容的输出控制台
debugConsole=true