如果有可用 RAM,如何清空交换空间?

如果有可用 RAM,如何清空交换空间?

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

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

例如,现在,关闭 VirtualBox 大约两个小时后,我有 1.6GB 的可用 RAM 并且仍有 770MB 的交换空间。

我怎样才能告诉 Ubuntu 停止使用该交换并恢复使用 RAM?

答案1

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

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

sudo swapoff -a
sudo swapon -a

或者作为一行

sudo swapoff -a; sudo swapon -a

执行此操作时要小心,因为这可能会使系统不稳定,尤其是在 RAM 不足的情况下。请确保系统中有足够的可用 RAM,否则您可能无法释放交换空间,并且 OOM-Killer 最终会终止您的某些进程。

请注意,这swapoff可能需要一段时间。如果您有大量交换空间需要交换,则尤其如此。

答案2

分配了交换空间并不意味着它正在被“使用”。虽然系统监视器和 top 等程序会显示部分交换空间已被分配(在您的示例中为 770MB),但这并不意味着系统正在积极地进行交换。

要查看是否有任何内容正在交换,您可以使用该vmstat命令。让它运行几秒钟,然后观察si(swapin) 和so(swapout) 列。如果没有发生任何事情,则无需担心。

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

procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 0  0  78588 230788   9596  72196    0    0     0     0  543  652 12  6 78  0
 0  0  78588 230780   9596  72196    0    0     0     0  531  410  1  0 99  0
 0  0  78588 230796   9596  72196    0    0     0     0  300  335  1  1 97  0
 1  0  78588 230788   9608  72224    0    0    40     0  737  762  4  4 84  8
 5  0  78588 230788   9608  72224    0    0     0     0  415  385  9  3 84  0
 0  0  78588 230540   9616  72224    0    0     0    44  611  556 55  5 31  0
 0  0  78588 230532   9616  72224    0    0     0     0  574  662  1  6 89  0

然而在这里top你可以看到我已经分配了交换空间:-

Mem:    475236k total,   245076k used,   230160k free,     9720k buffers
Swap:   491512k total,    78588k used,   412924k free,    72476k cached

答案3

您还可以将“swappiness”值从默认值 60 改为其他值,这样交换量一开始就不会变得太大。为什么推荐值为 10,而运输默认值却设置为 60,这让我很困惑。来自 Ubuntu SwapFAQ

Ubuntu 中的默认设置是 swappiness=60。降低 swappiness 的默认值可能会提高典型 Ubuntu 桌面安装的整体性能。建议使用 swappiness=10,但请随意尝试。

通过将此值更改为 10 甚至 0,您可以为驱动器较慢的旧系统增加显著且可察觉的速度提升。将此值设置为 0 不会关闭 Linux 内核 3.4 及以下版本的交换,但对于 3.5+ 版本,它会关闭交换,因此如果您想将其保持在最低设置,则需要使用值 1*。

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

来自 Ubuntu SwapFAQ

swappiness 参数控制内核将进程从物理内存移出并移至交换磁盘的趋势。由于磁盘比 RAM 慢得多,因此如果进程过于频繁地移出内存,这会导致系统和应用程序的响应时间变慢。

  1. swappiness 的值可以在 0 到 100 之间
  2. swappiness=0 告诉内核尽可能避免将进程交换出物理内存
  3. swappiness=100 告诉内核积极地将进程从物理内存中交换出来,并将其移至交换缓存

以下是检查交换能力、清空交换能力以及将交换能力更改为 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:

  1. sudoedit /etc/sysctl.conf
  2. 添加此行vm.swappiness = 0
  3. sudo shutdown -r now# 重启系统

* 在内核版本 3.5+ 中,将 swappiness 设置为 0 会将其完全关闭;如果您想要最低的 swappiness 算法,建议将其设置为 1。来源:https://www.percona.com/blog/2014/04/28/oom-relation-vm-swappiness0-new-kernel/

答案4

在搞砸了交换性几天来,我得出的结论是,内核应该由它自己决定。它知道自己在做什么,并且经过优化,可以为您提供最佳体验。

除非你真的有充分的理由想要回那个磁盘,否则我会把它留在那里。

相关内容