当 CPU 使用率较低时,有没有办法强制 Linux 取消交换?

当 CPU 使用率较低时,有没有办法强制 Linux 取消交换?

在我的机器上工作一天多后,swap 变成了大约 1GB。我的一些面板插件会进行交换,因此它们变得缓慢。此外,在我做到这一点之前,系统不会取消交换swapoff -all;swapon --all。 Linux 内核中是否有在负载较低或类似情况下取消交换的机制?

swapoff -all;swapon --all有时 RAM 的使用量达到 90%,因此编写每小时执行一次的脚本是一个坏主意。

答案1

可能您的默认交换值是 60。将其减少到 10,以减少交换对内存的偏好,然后监视此后的行为。

echo 10 > /proc/sys/vm/swappiness

要使其永久化(即在重新启动后继续存在),请编辑/etc/sysctl.conf并添加此行

vm.swappiness = 10

有关此参数的更多信息可以在以下位置找到维基百科:交换性

答案2

当Linux需要寻找RAM来存储某些内容时,它会查找RAM中最长时间未使用的页面。如果这些页面属于文件,它们将被释放。如果这些页面是进程内存,它们将被移至交换区。

Linux 不知道哪些页面将很快被使用,并且不知道哪些页面将很快被需要(例如,交互式程序是反应性的)。我认为没有任何方法可以为特定进程提供保留在 RAM 中的优先级。页面可以锁定到 RAM(这需要 root 或适当的功能),但不建议将内容锁定到 RAM,因为这样会减少其余部分的空间。

您可以通过以下方式强制将特定进程加载到 RAM 中读取它的内存— 看我的unswap脚本

你可以减少交换倾向通过设置vm.swappinesssysctl 参数。但是,请注意,减少交换性并不能保证让您的系统变得更快。这并不奇怪:如果您的系统交换量较少,它会花费更多时间从文件(例如程序代码)加载数据。

如果您有相对较大的内存,我发现在 3.0–3.16+ 内核中默认情况下没有很好调整的一个设置是另一种设置vm sysctl 参数: vm.vfs_cache_pressure。该参数有点类似于 swappiness,但涉及内核对象,特别是 inode 和 dentry 缓存。增加该值可有效减少专用于该缓存的内存量。您可以使用slabtop或 with查看 inode 和 dentry 缓存使用了多少内存

</proc/slabinfo awk '{print $1, $3*$4}' |sort -k2n | tail

如果您发现早上系统运行缓慢,这可能是因为夜间 cron 作业(例如updatedb用 inode 缓存条目填充了内存)。尝试类似的东西sysctl vm.swappiness=500。您可以对缓存进行一次性刷新echo 2 >|/proc/sys/vm/drop_caches(不要定期执行此操作,因为它会降低性能)。

相关内容