为什么即使我有足够的可用 RAM 仍会使用交换空间?

为什么即使我有足够的可用 RAM 仍会使用交换空间?

我以为交换分区的本质就是在 RAM 已满时充当临时存储安全网,但我的交换分区一直在使用,尽管有时我有多达 3GB 的可用 RAM。这是正常的吗?

答案1

您可以尝试更改“swappiness”值:

来自Ubuntu 的 Swap 常见问题解答

什么是 swappiness 以及如何改变它?

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

  1. swappiness 的值可以在 0 到 100 之间

  2. swappiness=0 告知内核尽可能避免将进程交换出物理内存。对于内核版本 3.5 及更新版本,它会禁用 swappiness。

  3. swappiness=100 告诉内核积极地将进程从物理内存中交换出来,并将其移至交换缓存

Ubuntu 中的默认设置是 swappiness=60。降低 swappiness 的默认值可能会提高典型 Ubuntu 桌面安装的整体性能。建议使用 swappiness=10,但您可以随意尝试。注意:Ubuntu 服务器安装与桌面系统的性能要求不同,默认值 60 可能更合适。

检查 swappiness 值

cat /proc/sys/vm/swappiness

更改 swappiness 值可以使用以下方法进行临时更改(重启后丢失),将 swappiness 值设置为 10

sudo sysctl vm.swappiness=10

使改变永久化,用你喜欢的编辑器编辑配置文件:

gksudo gedit /etc/sysctl.conf

搜索 vm.swappiness 并根据需要更改其值。如果 vm.swappiness 不存在,请将其添加到文件末尾,如下所示:

vm.swappiness=10

保存文件并重新启动。

sudo sysctl --load=/etc/sysctl.conf编辑文件后运行以应用更改

您还可以查看:https://askubuntu.com/a/103916/54187

答案2

您的问题有几个不同的方面。

首先,你对“免费”的定义是什么。实际上,在 Linux(或任何现代操作系统)中,它并不像听起来那么简单。

Linux 如何使用 RAM(非常简化)

每个应用程序都可以使用部分内存。Linux 使用所有未占用的内存(最后几 Mb 除外)作为“缓存”。这包括页面缓存、inode 缓存等。这是一件好事 - 它有助于加快堆的速度。通过缓存,写入磁盘和从磁盘读取的速度都大大加快。

理想情况下,您有足够的内存供所有应用程序使用,并且还有几百 MB 的内存用于缓存。在这种情况下,只要您的应用程序不增加内存使用量,并且系统没有为获取足够的缓存空间而苦苦挣扎,就不需要任何交换。

一旦应用程序要求更多 RAM,它就会进入缓存使用的部分空间,从而缩小缓存。取消分配缓存既便宜又简单,只需实时完成即可 - 缓存中的所有内容要么只是磁盘上已有内容的第二个副本,因此可以立即取消分配,要么就是我们必须在接下来的几秒钟内刷新到磁盘的内容反正

这不是 Linux 特有的情况 - 所有现代操作系统都以这种方式工作。不同的操作系统可能只是以不同的方式报告可用 RAM:有些将缓存作为它们认为的“可用”的一部分,有些则不包含。

当你谈论空闲的内存时,更有意义的是包括缓存,因为它实际上是空闲的 - 任何应用程序请求它时它都是可用的。在 Linux 上,该free命令以两种方式报告 - 第一行在已用 RAM 列中包含缓存,第二行在空闲列中包含缓存(和缓冲区)。

Linux 如何使用交换(更加简化)

一旦使用了足够的内存,以至于剩余的内存不足以支持平稳运行的缓存,Linux 可能会决定将一些未使用的应用程序内存从 RAM 重新分配到交换区。

它不会根据明确的截止点来执行此操作。并不是说您达到一定的分配百分比,然后 Linux 就开始交换。它有一个相当“模糊”的算法。它考虑了很多因素,可以用“内存分配的压力有多大”来最好地描述。如果分配新内存的“压力”很大,那么它将增加一些内存被交换以腾出更多空间的机会。如果“压力”较小,那么它将减少这些机会。

您的系统有一个“swappiness”设置,可帮助您调整此“压力”的计算方式。通常不建议对此进行任何更改,我也不建议您更改它。交换总体上是一件非常好的事情 - 尽管在少数极端情况下它会损害性能,但如果您查看整体系统性能,它会为各种任务带来净收益。如果您降低 swappiness,即使缓存内存量确实有用,也会比平时减少一点。对于您在交换方面遇到的任何问题,这是否是一个足够好的权衡取决于您。您应该知道自己在做什么,仅此而已。

有一种众所周知的情况是交换确实会损害桌面系统的可感知性能,即应用程序在长时间闲置并运行大量 IO 的后台进程(例如夜间备份)后再次响应用户输入的速度。这是一种非常明显的迟缓现象,但不足以成为关闭交换的正当理由,而且在任何操作系统中都很难避免。关闭交换后,备份/病毒扫描后的这种初始迟缓现象可能不会发生,但系统可能会全天运行得稍微慢一些。这种情况也并不仅限于 Linux。

在选择将哪些内容交换到磁盘时,系统会尝试选择实际上未使用的内存(读取或写入)。它有一个非常简单的算法来计算这一点,大多数时候都能做出正确的选择。

如果你的系统有大量的 RAM(在撰写本文时,8GB 对于典型的 Linux 发行版来说已经是很大的容量了),那么你很少会遇到需要交换的情况。你甚至可以尝试关闭交换。我从不建议这样做,只是因为你永远不知道什么时候更多的 RAM 可以让你避免某些应用程序崩溃。但是如果你知道你不需要它,你可以去做吧。

但是交换如何能加速我的系统呢?交换不会减慢系统速度吗?

将数据从 RAM 传输到交换区的操作很慢,但只有当内核确信整体收益大于此时才会执行此操作。例如,如果您的应用程序内存已上升到几乎没有缓存的程度,并且您的 I/O 也因此而效率低下,那么您可以通过释放一些内存来提高系统速度,即使在最初为了释放内存而交换数据之后,这样做也会带来一些开销。

如果你的应用程序确实需要更多的内存比实际拥有的内存要多。在这种情况下,交换是必要的,以防止内存不足的情况,这种情况通常会导致应用程序崩溃或必须强制终止。

交换只是联系有时您的系统性能不佳,因为这种情况发生在您用完可用 RAM 的时候,即使您没有交换,这也会降低系统速度(或使其不稳定)。因此,为了简化事情,交换发生在因为您的系统变得停滞不前,而不是相反。

一旦数据被交换,什么时候会再次出来?

将数据从交换区移出(至少对于传统硬盘而言)与将数据放入交换区一样耗时。因此,可以理解的是,您的内核同样不愿意从交换区移除数据,尤其是当数据实际上未被使用(即读取或写入)时。如果您在交换区中有数据并且未被使用,那么将其保留在交换区中实际上是一件好事,因为它会为其他事情留下更多内存正在使用,可能会加快您的系统速度。

答案3

设置 swappiness 值并非在所有情况下都有效。如果它对你有用,那就太好了。如果不行,我编写了一个脚本来定期清除交换,方法是关闭并重新打开它。

如果不小心,切换交换会有点危险。如果你没有足够的可用 RAM 来容纳 RAM 中的所有内容交换中的所有内容,尝试禁用交换将导致您的系统无响应。我的脚本首先检查是否有足够的可用 RAM(这需要一点时间,因为实际的可用 RAM 量与free报告的可用 RAM 量不同),然后仅在有的情况下才切换交换。但是,如果您的 RAM 有点不足,请不要在脚本运行时启动另一个主要进程。它在这里:

#!/bin/bash

# Make sure that all text is parsed in the same language
export LC_MESSAGES=en_US.UTF-8
export LC_COLLATE=en_US.UTF-8
export LANG=en_US.utf8
export LANGUAGE=en_US:en
export LC_CTYPE=en_US.UTF-8

# Calculate how much memory and swap is free
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)"

# Do the work
if [[ $used_swap -eq 0 ]]; then
    echo "Congratulations! No swap is in use."
elif [[ $used_swap -lt $total_free ]]; then
    echo "Freeing swap..."
    swapoff -a
    swapon -a
else
    echo "Not enough free memory. Exiting."
    exit 1
fi

您必须以 root 身份运行此脚本(例如,使用sudo)。此脚本不会让您的系统无响应;如果您的 RAM 不足,它将拒绝切换交换。我已经使用此脚本近五年了,没有出现任何问题。

答案4

通常,在当今的系统上,交换空间是闲置的。根据我的经验,长时间运行且没有密集操作的进程会被 Linux 转移到交换空间。
这会使一些受影响的程序运行缓慢。
如果您有大量可用内存,您可以通过运行以下命令关闭交换空间:(
swapoff -av您需要sudo权限)。
如果您不喜欢关闭交换空间,您可以使用对称命令将其打开:(
swapon -av同样sudo需要)。

相关内容