WSL2 上的 Swappiness 重置为 60

Dee*_*and 4 swap system-settings windows-subsystem-for-linux

我最近尝试在 Windows (WSL2) 上安装 Ubuntu。我尝试了该free命令,并且使用了很少的交换内存块。vm.swappiness=10我想减少交换性,所以我在 中添加了条目/etc/sysctl.conf。我尝试重新加载sysctl.conf,似乎有效,但是当我尝试关闭 WSL 并启动新会话时,swappiness 被重置为默认值 60。

WSL2 上的 Ubuntu 是否会覆盖此设置以使其再次变为 60?

Not*_*1ds 6

/etc/sysctl.conf通常在 Ubuntu 中启动时由 Systemd 解析(我相信是通过systemd-sysctl.service)。由于 WSL不使用 Systemd,因此当您关闭并重新启动 WSL 子系统时,它不会得到“处理”。这与我在Stack Overflow 问题的回答中所描述的类似(现在无需阅读,但如果您需要,它有更多详细信息)。

解决方案(也正如我在该特定答案中所描述的那样)是使用kernelCommandLineWSL2 内核的设置:

  • 在您的 Windows%userprofile%目录(通常)中使用以下内容C:\Users\<username>创建或编辑文件:.wslconfig

    [wsl2]
    kernelCommandLine = "sysctl.vm.swappiness=10"
    
    Run Code Online (Sandbox Code Playgroud)
  • 在 WSL(以及任何其他 WSL 实例)上退出 Ubuntu

  • wsl --shutdown从 PowerShell、CMD 或开始菜单发出

  • 重新开始

您应该发现vm.swappiness现在仍然存在。请注意,由于所有 WSL2 会话共享相同的内核,因此该选项将全局生效。无论您如何设置交换性(或任何内核参数),情况都是如此。

另请注意,该 Stack Overflow 问题的 OP 至少早在 Windows 10 build 18363 就已经对此进行了测试。


其他替代方案

我相信该.wslconfig选项可能最适合此目的,但您也可以:

  • /etc/wsl.conf与Windows 11 上的部分一起使用[boot]以强制sysctl在每次启动时运行。
  • 使用您的用户配置文件手动运行它。如果您选择这条路线,请使用类似的方法wsl.exe -u root sysctl --system来避免输入密码或配置sudoers