WSL2 (二) .wslconfig 限制性能
一、限制 WSL2 性能
WSL2 理论上可用获取 Windows系统内管理的所有 CPU、内存资源,但这带来一个问题。
有时候我们使用 WSL2只是作为一个终端窗口使用,并不会使用太多 CPU或内存,但由于 Linux内核的内存管理机制,它会尽量缓存一些已经读取过的文件页,在很长一段时间内是不会释放的。并且这部分文件页也不会被 Windows回收,导致 WSL2占用过多内存,而Windows反而没有内存可用的情况。
针对这种场景,可以在 %UserProfile%
下创建一个.wslconfig
文件来进行配置:
1 | [wsl2] |
- processors限制CPU核心数(会体现在/proc/cpuinfo等节点上)
- memory可使用的内存总大小(会体现在/proc/meminfo等节点上)
- swap交换空间的总大小(会体现在/proc/meminfo等节点上)
保存修改后关闭 WSL,并重新打开窗口启动
1 | wsl --shutdown Ubuntu |
查看是否生效:
1 | loki@Lenovo-Tk:~$ cat /proc/cpuinfo | grep processors |
二、.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 | # 设置适用于运行在WSL 2上的所有Linux发行版 |