我最近尝试在 Windows (WSL2) 上安装 Ubuntu。我尝试了该free
命令,并且使用了几个交换内存块。我想减少 swappiness,所以我vm.swappiness=10
在 中添加了条目/etc/sysctl.conf
。我尝试重新加载sysctl.conf
,它似乎有效,但是当我尝试关闭 WSL 并启动新会话时,swappiness 被重置为默认值 60。
WSL2 上的 Ubuntu 是否会覆盖此设置并使其再次变为 60?
答案1
/etc/sysctl.conf
通常在 Ubuntu 启动时由 Systemd 解析(我相信是通过systemd-sysctl.service
)。由于 WSL不使用 Systemd,当您关闭并重新启动 WSL 子系统时,它不会得到“处理”。这与我在回答中描述的情况类似这个 Stack Overflow 问题(现在不需要阅读,但如果您需要的话,它有更多详细信息)。
解决方案(也正如我在那个特定答案中所描述的)是使用kernelCommandLine
WSL2 内核的设置:
在您的 Windows
%userprofile%
目录中(通常C:\Users\<username>
)创建或编辑.wslconfig
以下内容:[wsl2] kernelCommandLine = "sysctl.vm.swappiness=10"
退出 WSL 上的 Ubuntu(以及任何其他 WSL 实例)
wsl --shutdown
从 PowerShell、CMD 或“开始”菜单发出重新开始
您应该发现vm.swappiness
现在已持久化。请注意,由于所有 WSL2 会话都共享同一个内核,因此此选项将全局生效。无论您如何设置 swappiness(或任何内核参数),情况都是如此。
还请注意,该 Stack Overflow 问题的 OP 至少在 Windows 10 build 18363 中对此进行了测试。
其他选择
我相信这个.wslconfig
选项可能是最好的,但你也可以:
/etc/wsl.conf
与使用[boot]
Windows 11 上的部分强制sysctl
在每次启动时运行。- 使用您的用户配置文件手动运行它。如果您选择这种方式,请使用类似的方法
wsl.exe -u root sysctl --system
来避免输入密码或配置sudoers
。