如何自动将交换移回 RAM?

如何自动将交换移回 RAM?

我最初遇到的 swap(piness) 问题是它交换得太频繁(甚至使用swappiness=1! )。

我还以为 0 会关闭 swappiness - 这是一个误解
即使你设置了sudo sysctl -w vm.swappiness=0:-)
(要永久设置、编辑/etc/sysctl.conf和添加/更新vm.swappiness = 0- 对于 GUI 文本编辑器,我推荐使用“linux notepad”“gedit”,然后您可以执行sudo gedit /etc/sysctl.conf

只有使用 swappiness,0它的行为才会更像人们所期望的那样(交换从大约 98% 的 RAM 满载开始),但我仍然遇到一个问题 - 当实际上再次释放足够的 RAM 时,交换不会自动返回到 RAM,即使随着时间的推移也不会。

当然,您可以sudo swapoff -a; sudo swapon -a每次手动关闭交换,最终强制将交换清空到 RAM,然后再次启动交换。

然而,这很不方便,原因有二:a)交换会暂时关闭 b)需要手动额外检查/运行

有没有办法实现这一点,最好是“本国的“, 方式自动地

答案1

据我所知,没有可用的设置来改变将交换页面返回到 RAM 的趋势。如果您愿意,可以使用一个脚本来检查 RAM 和 SWAP,并在安全时关闭/重新打开交换。在内存有限的系统上,这可能永远不会发生:清除交换内存的唯一选择是关闭拥有它们的进程。

目前还不清楚在可能的情况下立即将 SWAP 移回 RAM 会带来什么好处。Linux 会自动管理交换。如果它不释放已占用的交换,那是因为交换的内存不再需要,因此可以放心地保留在磁盘上直到需要为止。这样,RAM 和处理器时间就可以节省下来,供重要的应用程序使用。由于交换操作被最小化,因此磁盘得到了节省。

交换启动的速度取决于您的swappiness设置,但也取决于您拥有的 RAM 数量。您没有提到您拥有的 RAM 数量。根据您的经验,可以假设您的 RAM 很少(可能 2 GB 或更少),或者您正在使用具有不寻常内存需求的特定应用程序。

在第一种情况下,您可能需要改变计算机使用习惯以适应低 RAM 的限制,直到您可以升级物理 RAM。交换绝不是 RAM 的替代品,它只是在 RAM 有限的系统上稍微扩展它并允许更多内存的一个技巧。

在第二种情况下,就不要管它:你的系统将以最佳方式运行,换出未使用的 RAM,将其留给占用大量内存的工作。

答案2

如果你必须这么做,那么这swapoff就是你要走的路。你可以通过执行如下 bash 脚本来自动化此过程:

#!/bin/bash

sysctl -w vm.swappiness=0

while true
do
    total_m=$(free | awk '/Mem:/{print $2}')
    free_m=$(free | awk '/Mem:/{print $7}') 
    used_s=$(free | awk '/Swap:/{print $3}')
    total_m_percent=$(("$total_m" / 100))
    free_m_percent=$(("$free_m" / "$total_m_percent"))
    # Deactivate the swap and move pages to RAM if there is enough room in RAM and free RAM is more than 30%
    [ "$used_s" -gt 0 ] && [ "$used_s" -lt "$free_m" ] && [ "$free_m_percent" -gt 30 ] && swapoff -a
    # Activate the swap if the remaining free RAM becomes less than 5%
    [ "$used_s" -eq 0 ] && [ "$free_m_percent" -lt 5 ] && swapon -a
    # Sleep for 10 seconds to avaoid straining the system
    sleep 10
done

运行该脚本sudo bash scriptfile.sh或者添加systemd服务以便在系统启动时自动运行该脚本。

相关内容