我最初遇到的 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
服务以便在系统启动时自动运行该脚本。