如果有空闲RAM如何清空交换

16次阅读

共计 2562 个字符,预计需要花费 7 分钟才能阅读完成。

当我打开一个 RAM 密集型应用程序(VirtualBox 设置为 2GB RAM)时,通常会使用一些交换空间,具体取决于我当时打开的其他内容。

但是,当我退出最后一个应用程序时,2GB 的 RAM 被释放,但仍然使用相同的交换空间。

例如,就在关闭 VirtualBox 大约两个小时后,我有 1.6GB 的可用内存,仍然有 770MB 的交换空间。

如何告诉 Ubuntu 停止使用该交换并恢复使用 RAM?

仅仅因为分配了交换,并不意味着它被“使用”。虽然系统监视器和顶部等程序会显示一些交换空间被分配(在您的示例中为 770MB),但这并不意味着系统正在主动交换 / 转出。

要查明是否有任何内容正在交换,您可以使用该 vmstat 命令。让它运行几秒钟以稳定并观察 si(swapin)和 so(swapout)列。如果什么也没发生,那就没有理由担心。

这是运行的输出 vmstat 1,在那里你可以看到我的机器根本没有交换。

Ubuntu 底层的 Linux 内核会根据需要自动将这些页面从磁盘“交换”到 RAM 中,所以一般来说我会说让它自然发生。

但是,如果你真的觉得你需要强制它,(我可以看到你想知道系统将在稍后响应的情况)你可以暂时禁用并重新启用交换

sudo swapoff -a
sudo swapon -a

或者作为单行

swapoff -a; swapon -a


您还可以将默认值设置为“swappiness”值,这样交换开始时就不会变得如此之大。当建议值为 10 时,为什么出货默认设置为 60。来自 Ubuntu SwapFAQ:

Ubuntu 中的默认设置是 swappiness = 60。减少 swappiness 的默认值可能会提高典型 Ubuntu 桌面安装的整体性能。建议使用 swappiness = 10 的值,但可以随意进行实验。

通过将此值更改为 10 或甚至 0,您可以为具有慢速驱动器的旧系统添加显着且可感知的速度提升。将此值设置为 0 不会为 Linux 内核 3.4 及更低版本关闭掉掉,但是如果要将其保持在最低设置 *,则需要使用 3.5+。

我认为没有理由不将其设置为 0,因为任何击中磁盘的东西都比 RAM 慢。我有 8 个虚拟内核,一个快速 SSD 和 8 GB 内存,我的交换设置为 0. 到目前为止,我有 3 台虚拟机正在运行,我的内存使用量为 7.1 GB,我使用的交换仅为 576KB 952MB,所有系统都运行顺畅!

来自 Ubuntu SwapFAQ:

swappiness 参数控制内核将进程从物理内存移出到交换磁盘上的趋势。因为磁盘比 RAM 慢得多,所以如果进程过于积极地移出内存,这可能会导致系统和应用程序的响应时间变慢。

swappiness 的值可以介于 0 到 100 之间
swappiness = 0 告诉内核尽可能长时间地避免将进程交换出物理内存
swappiness = 100 告诉内核积极地将进程交换出物理内存并将它们移动到交换缓存
以下是检查 swappiness,清空交换以及将 swappiness 更改为 0 的基本说明:

要检查 swappiness 值:

cat /proc/sys/vm/swappiness

暂时将交换设置为 0(如 SpamapS 所示):

这将清空您的交换并将所有交换转移回内存。首先通过查看 gnome-system-monitor 的资源选项卡确保您有足够的可用内存,您的可用内存应该大于您使用的交换。此过程可能需要一段时间,请使用 gnome-system-monitor 来监视和验证进度。

sudo swapoff --all

要将新值设置为 0:

sudo sysctl vm.swappiness=0 

重新打开交换:

sudo swapon --all

要将 swappiness 永久设置为 0:

sudoedit /etc/sysctl.conf

添加行 vm.swappiness = 0

sudo shutdown -r now #re restart 系统

* 使用内核版本 3.5+ 设置 swappiness 为 0 确实完全关闭它,如果你想要最低的 swappiness 算法,建议设置为 1。来源:https://www.percona.com/blog/2014/04/28/oom-relation-vm-swappiness0-new-kernel/

我发现清空交换对于磁盘速度慢且 RAM 有限的系统有很大帮助。当然,正如已经提到的,执行此操作的方法是运行sudo swapoff -a; sudo swapon -a。这里的问题是,如果没有足够的 RAM,这样做会导致各种各样的问题。

我写了一个我称之为toggle_swap, 过去几年对我有用的脚本。在实际禁用交换之前,它会检查足够的可用 RAM。如下:

#!/bin/bash

free_data="$(free)"
mem_data="$(echo"$free_data"| grep'Mem:')"
free_mem="$(echo"$mem_data"| awk'{print $4}')"
buffers="$(echo"$mem_data"| awk'{print $6}')"
cache="$(echo"$mem_data"| awk'{print $7}')"
total_free=$((free_mem + buffers + cache))
used_swap="$(echo"$free_data"| grep'Swap:'| awk'{print $3}')"

echo -e "Free memory:\t$total_free kB ($((total_free / 1024)) MB)\nUsed swap:\t$used_swap kB ($((used_swap / 1024)) MB)"
if [[$used_swap -eq 0]]; then
    echo "Congratulations! No swap is in use."
elif [[$used_swap -lt $total_free]]; then
    echo "Freeing swap..."
    sudo swapoff -a
    sudo swapon -a
else
    echo "Not enough free memory. Exiting."
    exit 1
fi

在使用 swappiness 几天后,我得出的结论是应该让内核自己的管理设备。它知道它在做什么,它经过优化,可以为您提供最佳体验。

除非你有充分的理由想要恢复该磁盘,否则我会留下它。

https://help.ubuntu.com/commu…

正文完
 0