Linux:如何显式地取消所有可能的交换?

kol*_*pto 63 linux memory swap

我推出了一些占用大量内存的东西,现在一切都滞后了很多。我猜想所有应用程序的内存都已交换,以便为内存密集型进程释放一些空间,现在所有内容在访问时都慢慢返回到 RAM。

有没有办法明确地将所有可能的东西从交换移回 RAM?或者也许不是一切,而只是一些特定的过程数据?

Dou*_*der 64

我建议在实际使用的东西中允许正常的 Linux 内存控制交换,因为它们被使用。

我唯一能想到的就是关闭交换,然后再打开

sudo swapoff -a
sudo swapon -a
Run Code Online (Sandbox Code Playgroud)

假设您有足够的备用物理内存来包含交换中的所有内容...

  • 小心这个解决方案,它会强行将所有东西从交换中取出……如果它不适合物理内存,内核将启动致命的 OOM 杀手。我不知道有什么好的“尝试将所有内容移动到 RAM,但如果不可能,请优雅地失败”命令。 (8认同)
  • 它有效,但速度很慢:) 谢谢!但我仍然相信有一个更优雅的解决方案:) (4认同)
  • 似乎 swapoff 命令执行诸如“不允许新写入交换”之类的操作,而任何其他正在运行的进程(曾经/正在使用交换)仍然可以“释放交换”。这可能就是它看起来如此缓慢的原因。它似乎并没有像另一个人所说的那样导致 OOM(我使用的是 Ubuntu Bionic)——可能只有在“附加(或现有)进程开始使用新内存”(即真正的 OOM)时才会出现这种情况。所以总而言之,swapoff/swap 似乎是一个很好的解决方案。温和/稳重。这假设您没有使用进程启动更多内存(或增加运行进程的消耗)。 (4认同)
  • 我不确定杀死 swapoff 是否真的会停止操作。取决于它是如何实现的。 (3认同)

小智 14

您可以将其调整为将 0 到 100 之间的某个数字回显为/proc/sys/vm/swappiness.

此控件用于定义内核交换内存页面的积极程度。较高的值会增加攻击性,较低的值会减少 swap 的数量。值 0 指示内核在空闲和文件支持的页面数量小于区域中的高水位线之前不启动交换。

默认值为 60。

  • 不要直接使用 /proc/sys,而是使用 `sysctl` 命令。在这种情况下,它是`sysctl vm.swappiness=x`。 (14认同)
  • 我认为即使是零交换也不会导致已经交换的页面被显式引入主内存? (8认同)
  • @Juliano 那不是真的。procfs 是公共内核接口的一部分。官方文档称它是内核内部的接口:https://www.kernel.org/doc/Documentation/filesystems/proc.txt 另外 sysctl 仅将值转发到 procfs 路径。请参阅:https://github.com/thlorenz/procps/blob/master/deps/procps/sysctl.c#L354 (2认同)