为什么即使将 swapiness 设置为 1,并且有大量的 RAM 可用,但仍然会使用 swap?

为什么即使将 swapiness 设置为 1,并且有大量的 RAM 可用,但仍然会使用 swap?

htop 的结果

交换性:

cat /proc/sys/vm/swappiness
1

自由的:

 root@server07:~# free

              total        used        free      shared  buff/cache   available

Mem:       16256132     4155932      553748      145196    11546452    10514464

Swap:      19721212     8327508    11393704

所有 RAM 都被缓存消耗了吗?

为什么?我怎样才能从 RAM 中释放缓存并将交换 RAM 移至真实 RAM?

答案1

每天运行一次此脚本:

#!/bin/sh

sync
echo 1 >/proc/sys/vm/drop_caches
sync
echo 2 >/proc/sys/vm/drop_caches
sync
echo 3 >/proc/sys/vm/drop_caches

mem=$(LC_ALL=C free  | awk '/Mem:/ {print $4}')
swap=$(LC_ALL=C free | awk '/Swap:/ {print $3}')

echo $mem
echo $swap

if [ $mem -lt $swap ]; then
    echo "ERROR: not enough RAM" >&2
    exit 1
fi

swapoff -a &&
swapon -a

答案2

交换并不坏,禁用交换才是. 阅读“为什么我需要交换”段落。

话虽如此,运行此命令来关闭交换然后重新打开它,本质上就是清除交换。

sudo swapoff -a && sudo swapon -a

您可以编写脚本定期执行此操作

创建文件

sudo nano /usr/local/sbin/swap2ram.sh

粘贴此代码

#!/bin/sh

mem=$(LC_ALL=C free  | awk '/Mem:/ {print $4}')
swap=$(LC_ALL=C free | awk '/Swap:/ {print $3}')

if [ $mem -lt $swap ]; then
    echo "ERROR: not enough RAM to write swap back, nothing done" >&2
    exit 1
fi

swapoff -a &&
swapon -a

使可执行

sudo chmod +x /usr/local/sbin/swap2ram.sh

此时,您可以运行以下命令将交换转储回内存(如果有足够的可用内存)

执行脚本

sudo /usr/local/sbin/swap2ram.sh

创建一个 cronjob 每小时运行一次(选择自己的偏好)

sudo crontab -e
@hourly /usr/local/sbin/swap2ram.sh

查看日志

grep CRON /var/log/syslog

参考

我的建议

减少交换对于台式电脑来说并不是一个很好的解决方案,尽管许多网站会建议您在设置后首先执行此操作。

我建议将 swappiness 恢复为默认值 60 并启用 Zswap。它将压缩并将旧页面存储在内存中,而不是直接保存在交换中。您可以看到这个一步一步的指导

我已经启用它,这是我的内存消耗(使用 android studio、android 模拟器、chrome、atom 运行)

系统监视器

相关内容