如果有空闲 RAM,如何清空交换区?

jfo*_*her 411 performance ram-usage swap

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

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

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

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

Spa*_*apS 588

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

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

sudo swapoff -a
sudo swapon -a
Run Code Online (Sandbox Code Playgroud)

或者作为单行

sudo swapoff -a; sudo swapon -a
Run Code Online (Sandbox Code Playgroud)

这样做时要小心,因为您可能会使您的系统不稳定,尤其是当它的 RAM 已经很低时。

  • 实际上,交换基本上是复制到 ram,或者更准确地说,在禁用交换之前,将页面从磁盘交换回 RAM。 (65认同)
  • 只有当某些进程仍然需要这些页面时,这些页面才会被复制到 RAM 中。有时一个交换的页面属于一个已经完成的进程,内核并不关心立即从交换中删除这些页面。 (16认同)
  • 交换未复制到 RAM。它只是被禁用了。在执行此操作之前,您应该确保盒子没有交换。如果这样做,内核将看到内存消失,OOM-Killer 可能会开始任意杀死应用程序。您没有理由需要像这样“清除”交换。(见我的其他评论):) (13认同)
  • 这应该是正确的答案,因为它是将交换的页面返回到 RAM 然后清空交换内存的方法 (11认同)
  • 这样做就成功了,交换被复制到了 ram。我想你只需要确保在运行 swapoff 之前至少有足够的交换空间用作空闲内存,对吗? (10认同)
  • 这是实际回答问题的唯一答案,应该是公认的答案! (7认同)
  • 我正在考虑创建一个 Nagios 警报,在系统开始交换时向我们发出警告。例如,此时我有一个使用 8/16G 交换的系统,但只使用了 36/128G RAM。如果 Nagios 发出警报,我想清除掉交换,让它安静下来。我知道目前没有使用交换,但 Nagios 没有。所以这里有一个用例,能够“刷新”交换空间会很方便……就像一个简单的簿记练习。 (2认同)
  • 根据我的经验,swapoff 可能需要很长时间才能完成将交换文件排回 RAM。不知道为什么。 (2认同)
  • 恕我直言,应该*不*使用`&&`而是使用分号(`swapoff -a; swapon -a`)代替!为什么?假设您有*多个*交换设备。`swapoff` 可能在一台设备上成功,但在另一台设备上失败。在这种情况下,`swapoff` 命令将返回一个非零退出代码,导致 `swapon -a` 命令不会被执行,因此最终交换空间比以前*少*! (2认同)

pop*_*pey 205

仅仅因为交换被分配,并不意味着它被“使用”。虽然像 system monitor 和 top 这样的程序会显示你的一些交换空间被分配(在你的例子中是 770MB),但这并不意味着系统正在积极地换入/换出。

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

这是 running 的输出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
Run Code Online (Sandbox Code Playgroud)

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

Mem:    475236k total,   245076k used,   230160k free,     9720k buffers
Swap:   491512k total,    78588k used,   412924k free,    72476k cached
Run Code Online (Sandbox Code Playgroud)

  • 这篇文章没有回答这个问题。 (281认同)
  • “没有理由担心”,直到我继续使用一些被换掉的应用程序。然后所有的地狱都崩溃了。 (54认同)
  • 运行内存密集型应用程序后,我的其他应用程序在我切换到它们时没有响应,大概是因为被交换了。告诉系统尽可能多地取消交换数据(然后是咖啡休息时间)的某种方式比每次按 Alt+Tab 时都必须等待 20 秒要好。 (52认同)
  • 我没有看到误解,我看到了关于“使用”的含义的分歧。您的意思是“使用”来指代主动换入/换出,而最初的问题似乎是由“使用”提出的,表示存在已换出的数据,稍后可能需要换回。有在交换出大量其他内存的事件之后想要刷新交换的正当理由,本质上是预先清空用户知道稍后将发生的活动交换(特别是如果稍后的“去交换”很可能发生而由于其他原因磁盘负载不足)。 (48认同)
  • 这个问题的前提是基于误解。这篇文章解决了这些误解。 (23认同)
  • 问题的标题专门询问清空交换。例如,如果可用交换空间少于 500 MB,Oracle 安装程序将不会运行某些(任何)命令,如果有 200+GB 的可用 RAM,则无关紧要。无论交换是否正在被积极使用,坐在那里的东西都在使用它。在大多数情况下,不活动的交换使用*可能*会使切换任务变慢,而其他情况下它会破坏功能。 (4认同)
  • 这没有回答问题! (3认同)
  • “如果什么都没有发生,那么就没有理由担心。”,我觉得这很难相信。我有内存密集型计算强制使用交换区,在终止计算并再次拥有多余的 RAM 后,交换区保持填充状态,而 Firefox 响应缓慢。杀死firefox清空了很多swap,重新启动firefox后又快了。我希望操作系统在交换方面并不总是有效地运行。 (2认同)

Eli*_*ynn 172

您还可以将“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.7 GB 中的 7.1,我使用的交换仅为 576KB 952MB,所有系统运行流畅!

来自 Ubuntu SwapFAQ

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

  1. swappiness 的值可以在 0 到 100 之间
  2. swappiness=0 告诉内核尽可能长时间地避免将进程交换出物理内存
  3. swappiness=100 告诉内核主动从物理内存中交换进程并将它们移动到交换缓存

以下是检查swappiness、清空swappiness并将swappiness更改为0的基本说明:

要检查 swappiness 值:

cat /proc/sys/vm/swappiness
Run Code Online (Sandbox Code Playgroud)

暂时将 swap 设置为 0(如 SpamapS 所建议的):

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

sudo swapoff --all
Run Code Online (Sandbox Code Playgroud)

要将新值设置为 0:

sudo sysctl vm.swappiness=0 
Run Code Online (Sandbox Code Playgroud)

要重新打开交换:

sudo swapon --all
Run Code Online (Sandbox Code Playgroud)

要将 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/

  • 我不确定当作者最初发布答案时这是否可用,但是对于 ubuntu 服务器安装,swappiness 值为“60”,因为该环境具有一组不同的性能规范。https://help.ubuntu.com/community/SwapFaq#What_is_swappiness_and_how_do_I_change_it.3F (3认同)
  • 我刚刚更新了答案,以包含设置swappiness的永久方式。不知道它是如何获得如此高的票数的,我猜没有人测试过它。 (2认同)
  • 此设置在控制交换的大小方面非常有效。我的系统有 16G RAM 和 16G 交换。有时我运行到 VM 并且我的一些应用程序被换出。当我关闭 VM 时,RAM 使用率下降,但交换使用率保持不变,我的系统在更改应用程序时滞后。更改交换率提高了我的性能。 (2认同)
  • 这确实应该是公认的答案。对问题及其解决方案的彻底解释,以及保留交换内存的链接和解决方案,但首先有助于控制它。很棒的东西。谢谢。:) (2认同)

Sco*_*nce 56

我发现清空交换对磁盘速度慢且 RAM 有限的系统有很大帮助。当然,如前所述,执行此操作的方法是运行sudo swapoff -a; sudo swapon -a. 这里的问题是,如果内存不足,这样做会导致各种问题。

我写了一个我称之为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
Run Code Online (Sandbox Code Playgroud)

  • 我已经更新了代码并创建了一个基于 gist 的 https://gist.github.com/Jekis/6c8fe9dfb999fa76479058e2d769ee5c (2认同)

Eri*_*ami 26

在与swappiness 折腾了几天之后,我得出的结论是内核应该留给它自己的设备。它知道自己在做什么,并且经过优化,可为您提供最佳体验。

除非您有充分的理由想要取回该磁盘,否则我会保留它。

  • 我在交换中有一些东西,vmstat 向我展示了交换和交换正在发生,Chrome 滞后,而我的 CPU 几乎没有使用。足够好的理由,不是吗? (7认同)