仅在休眠时使用交换区

仅在休眠时使用交换区

我有一个交换分区/dev/sda1。它的2GB大小为,我只想用它来休眠。我的系统有4GBRAM。当我的 RAM 不足时,内核开始交换,我甚至无法切换到 tty 来终止应用程序。我只希望交换用于休眠,而不是在 OOM 条件下。所以我想让 OOM 终止程序终止一些应用程序,而不是一直交换。我已经设置了,vm.swappiness=0但它没有帮助。有什么解决办法吗?

答案1

尽管解决方案并不直接符合您的要求,但您可以尝试以下几种方法。

正如我在评论中所说,设置vm.swappiness=0只会让内核在使用交换之前尽可能长时间地等待,而不是完全关闭它。我没有证据证明这一点,但我认为通过设置vm.swappiness=0你会让你的问题变得更糟。

我认为这种情况的原因是,当发生某些事情迫使内核开始交换时,它可能不得不非常快速地交换所有内容,这是硬盘工作速度无法做到的。如果让内核选择何时交换,它将在较早的时间开始交换较少使用的数据,而不必在情况变得糟糕时立即将大量数据从 RAM 移到交换区。一般来说,这将提高内核效率。

您还可以编写一个脚本,该脚本将在触发休眠时使用swaponswapoff激活为此特定原因生成的交换分区或交换文件。大多数窗口管理器都可以自定义为在其不同部分被激活时执行脚本,例如休眠按钮。如何执行此操作取决于您使用的窗口管理器。

第三个选项是让交换始终处于活动状态,而是减少在激活 OOM 管理器并开始终止进程​​之前可以使用的 RAM 量。这是可以做到的,但我不知道该怎么做。

最后,考虑到现在 RAM 的成本,如果您的 RAM 还没有达到最大值,那么增加计算机的 RAM 数量也是一个可行的选择。

答案2

我使用了解决方法,将以下内容添加到 root 的 crontab 中

*/5 * * * * /sbin/swapoff -a  && /sbin/swapon -a

这不是最好的解决方案,但可以将交换使用量保持在最低水平。自从我尝试使用其他解决方案以来,它给了我最好的结果。

另一种方法是使用自定义脚本进行挂起/唤醒,但我没有找到如何使其与 ubuntu 一起工作(唤醒时 swapoff,休眠前 swapon)

答案3

我遇到了同样的问题。“打开和关闭交换”适合我的情况。但是,swapon/off -a对我来说不起作用,因为我使用的是 ZRam。以下是打开和关闭 中列出的交换设备的功能/etc/fstab

turn_swaps(){
    # Usage: "turn_swaps on" or "turn_swaps off"
    local state="$1"
    while read -r swp; do
        echo "Turning $swp $state"
        /sbin/swap${state} $swp
done <<< $(grep swap /etc/fstab | awk '{print $1}' | sed 's/^#//')
}

注释掉 中的交换条目/etc/fstab,这样它们就不会在启动时挂载。上述函数仍然能够启用和禁用 中列出的设备/etc/fstab

我没有尝试,但以下建议也可以考虑:https://askubuntu.com/a/299190/371730

相关内容