我有一个交换分区/dev/sda1
。它的2GB
大小为,我只想用它来休眠。我的系统有4GB
RAM。当我的 RAM 不足时,内核开始交换,我甚至无法切换到 tty 来终止应用程序。我只希望交换用于休眠,而不是在 OOM 条件下。所以我想让 OOM 终止程序终止一些应用程序,而不是一直交换。我已经设置了,vm.swappiness=0
但它没有帮助。有什么解决办法吗?
答案1
尽管解决方案并不直接符合您的要求,但您可以尝试以下几种方法。
正如我在评论中所说,设置vm.swappiness=0
只会让内核在使用交换之前尽可能长时间地等待,而不是完全关闭它。我没有证据证明这一点,但我认为通过设置vm.swappiness=0
你会让你的问题变得更糟。
我认为这种情况的原因是,当发生某些事情迫使内核开始交换时,它可能不得不非常快速地交换所有内容,这是硬盘工作速度无法做到的。如果让内核选择何时交换,它将在较早的时间开始交换较少使用的数据,而不必在情况变得糟糕时立即将大量数据从 RAM 移到交换区。一般来说,这将提高内核效率。
您还可以编写一个脚本,该脚本将在触发休眠时使用swapon
并swapoff
激活为此特定原因生成的交换分区或交换文件。大多数窗口管理器都可以自定义为在其不同部分被激活时执行脚本,例如休眠按钮。如何执行此操作取决于您使用的窗口管理器。
第三个选项是让交换始终处于活动状态,而是减少在激活 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