即使我有大量可用RAM,为什么仍要使用swap?


208

我认为交换的全部本质是在RAM满时充当临时存储安全网,但是即使有时我有3GB的可用RAM,交换分区也一直在使用。这正常吗?


3
请分享以下命令/文件的内容或输出,以更好地帮助我们解决您的问题此答案中的说明free -mtop -b 1
ish 2012年

明天将使用这些命令的pastebins更新问题。现在是凌晨12点:(
Mysterio

我应该编辑标题以添加“ ...但是我现在太困了,无法照顾,所以你们也要睡个午觉”:P
ish 2012年

Answers:


188

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

Ubuntu的Swap FAQ中

什么是交换性,我该如何更改?

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

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

  2. swappiness = 0指示内核尽可能避免将进程从物理内存中交换出去。对于内核版本3.5和更高版本,它将禁用可交换性。

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

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

检查交换值

cat /proc/sys/vm/swappiness

更改swappiness值可以进行临时更改(重新引导时丢失),其值为10。

sudo sysctl vm.swappiness=10

要使更改永久生效,请使用您喜欢的编辑器编辑配置文件:

gksudo gedit /etc/sysctl.conf

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

vm.swappiness=10

保存文件并重新启动。

您也可以签出:https : //askubuntu.com/a/103916/54187


1
闲置推测:这实际上可能对性能有所帮助-可以将一段时间内未访问的页面复制到交换空间,这使OS可以在需要内存时将其快速撤出,但页面内容仍保留在内存中。
西蒙·里希特

7
@SimonRichter是的,就是这个主意。不过,在现代系统上,Swappiness值60可能太激进了,因为这意味着当您仍然有几GB的可用内存时,您就开始换掉了。
布伦丹·朗

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

92

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

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

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

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

理想情况下,您有足够的内存来存储所有应用程序,并且仍然需要数百Mb的缓存空间。在这种情况下,只要您的应用程序不增加其内存使用量,并且系统不为获取足够的缓存空间而努力,就无需进行任何交换。

一旦应用程序要求更多的RAM,它就会进入缓存使用的某些空间,从而缩小缓存。取消分配缓存既便宜又容易,只需简单地实时完成-位于缓存中的所有内容只是磁盘上已有内容的第二个副本,因此可以立即释放,或者我们可以无论如何,不得不在接下来的几秒内刷新到磁盘。

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

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

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

一旦您用完了足够的内存以至于没有足够的内存来平滑运行的缓存,Linux可能会决定从RAM重新分配一些未使用的应用程序内存以进行交换。

它不会根据明确的界限执行此操作。这不是您达到一定的分配比例,然后Linux开始交换。它具有相当“模糊”的算法。它考虑了很多事情,最好用“内存分配有多少压力”来描述。如果分配新内存的压力很大,那么将增加交换一些内存以腾出更多空间的机会。如果“压力”较小,则将减少这些机会。

您的系统具有“ swappiness”设置,可帮助您调整“压力”的计算方式。通常不建议您完全更改它,我也不建议您更改它。交换总体而言是一件好事-尽管在某些极端情况下,交换会损害性能,但是如果您查看系统的整体性能,则对许多任务来说都是净收益。如果您减少了交换性,则可以使高速缓存的存储量比原先的压缩量稍微减少一点,即使它可能确实有用。对于您在交换时遇到的任何问题,这是否是一个足够好的折衷方案,完全取决于您自己。您应该只知道自己在做什么,仅此而已。

有一种众所周知的情况,即交换确实会损害台式机系统上的感知性能,即在长时间闲置并在IO中处理大量后台进程(例如,隔夜备份)运行。这是非常明显的迟缓,但不足以证明完全关闭交换是合理的,并且在任何操作系统中都很难防止。关闭交换,可能不会发生备份/病毒扫描后这种最初的缓慢现象,但系统可能会整天运行缓慢。这也不是仅限于Linux的情况。

在选择要交换到磁盘的内容时,系统会尝试选择实际未使用的内存-读取或写入。它有一个非常简单的算法来计算此参数,大多数情况下,算法效果很好。

如果您有一个拥有大量RAM的系统(在撰写本文时,对于典型的Linux发行版来说8GB是一个巨大的数量),那么您将很少遇到根本需要交换的情况。您甚至可以尝试关闭交换。我从不建议这样做,只是因为您不知道什么时候有更多的RAM可以使您免于某些应用程序崩溃的麻烦。但是,如果您知道自己将不需要它,则可以做到。

但是如何交换可以加快我的系统速度?难道不减慢速度吗?

将数据从RAM传输到交换的操作很慢,但是只有在内核完全确定总体收益将超过此收益时才采取此操作。例如,如果您的应用程序内存已增加到几乎没有缓存的状态,并且由于这个原因您的I / O效率非常低,那么实际上通过释放一些内存,甚至可以使系统速度大大提高,甚至交换数据以释放数据的初始费用后。

如果您的应用程序实际请求的内存比您实际拥有的更多,这也是最后的选择。在这种情况下,必须进行交换以防止出现内存不足的情况,这种情况通常会导致应用程序崩溃或被强制终止。

交换仅与系统性能不佳的时间相关,因为它发生在可用RAM耗尽的时候,即使没有交换,这也会减慢系统速度(或使其不稳定)。因此,为了简化起见,发生交换是因为您的系统陷入了瘫痪,而不是相反。

交换数据后,什么时候可以再次输出?

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


5
+1详细说明。我还喜欢在计算机上保留2GiB交换。如果出现问题-内存泄漏等,则可以看到交换上升,并在出现内存不足之前查找问题。它既是安全网又是性能工具。
2012年

1
在只有2GB RAM的上网本上,我保留了4GB的交换空间。这是因为我使用上网本的目的远不止于此,并且我的程序经常需要超过2GB的内存。由于Linux在内存不足的情况下表现很差,因此我更喜欢拥有大型安全网。而且我有足够的磁盘空间。
Scott Severance,2012年

如果您的程序经常需要超过2GB的内存,那么我会考虑在其中占用更多的RAM(这非常便宜!),因为耗尽RAM会损害性能。为了其他读者的利益:请确保您不仅在查看应该占用可用RAM的缓存,还请参见参考free -m
thomasrutter

2
@neon_overload:根据HP,我应该注意,我的上网本的最大RAM是1GB。我现在有2GB的存储空间,互联网资源显示2GB是实际的最大存储空间。因此,需要这些解决方法。
Scott Severance,2012年

@thomasrutter:对于大型服务器,您的答案有何变化?我的其中一个拥有1TB(是一个完整的TB)的ram,但仍在使用swap;您将建议什么交换设置和什么大小的交换分区?
chrisinmtown 2015年

24

设置swappiness值并非在每种情况下都有效。如果它适合您,那就太好了。如果没有,我编写了一个脚本,通过将其关闭然后重新打开来定期清除交换。

如果不小心,切换交换会有点冒险。如果你没有足够的可用内存来保存在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不足,它将拒绝切换交换。我已经使用该脚本将近五年没有问题了。


为脚本+1。您可能需要通过将输出中的MB更改为MiB来对其进行一些现代化。我写了一个类似的脚本,但没有包含所有(良好)安全测试。在我的旧笔记本电脑上,该笔记本电脑经常使用交换功能,这需要一段时间才能运行-一两分钟,但没有造成任何伤害。偶尔会失败,因为没有足够的可用内存来运行它,但这并没有引起任何其他问题。发生这种情况时,我必须重新启动以清除问题。它与传输中看似内存泄漏的原因有关(我相信,自从修复以来,它只有2GiB内存)。
2012年

6
如果将某些东西移到交换位置并保留在交换位置,那通常是一件好事-这意味着数据实际上并未被使用,并且它释放了一些RAM用于其他东西,从而潜在地提高了速度。是什么让您相信该数据不应该交换,而应该占用更多有价值的RAM?通常,内核非常擅长知道哪些未使用,哪些可以安全地保留在交换中以释放RAM。
thomasrutter

@neon:请记住,我的机器分别具有2GB和3GB的RAM,这些天来已经很少了。证据在表现。例如,由于交换,调出菜单或切换程序的速度可能很慢,Compos visoal效果也是如此。通过切换交换可以消除这种缓慢性,从而证明至少在某些情况下内核的优化算法不是最佳的。我再也无法反驳。
Scott Severance

ew!这只是使交换率降到了0%。...我没有太多时间研究这个完整的问题及其答案,但是我喜欢在有空闲时间时阅读它。
AzkerM 2014年

您为什么不将swappiness设置为较低的值?这似乎和您的脚本做同样的事情,但是以一种受控得多的方式。
jhfrontz

4

通常,在当今的系统上,交换未使用。以我的经验,长时间运行而无需大量操作的进程被linux转换为交换。
这会使一些受影响的程序运行缓慢。
:如果你有大量的RAM的自由,你可以通过运行命令切换交换关闭
swapoff -av(你需要sudo的权利吧。)
如果你不喜欢掉了,你可以打开它,使用对称的命令:
swapon -av(再次sudo要求)。


12
由于swapiness = 0会做同样的事情,但完全安全地关闭交换功能却是多余的,但是更安全(如果您确实在内存中存储了过多的内容,则会在交换操作中抛出某些错误)。
布伦丹·朗

@BrendanLong公平的点..谢谢教我。:)
drake01 2012年

3

一旦将交换用于程序,在程序的整个生命周期中它往往会保持映射状态。许多程序具有很少使用的代码(和数据)。一旦内存被换出,就不太可能被换入。

强制这些页面进入内存的一种方法是关闭交换设备。如果有两个,则可以关闭其中一个,然后重新打开,然后关闭第二个。如果确实需要交换,它将在设备之间移动。您可以只关闭交换设备(或文件),但是如果您确实需要交换空间,则可能会发生麻烦。

除了内存中的常规内容外,tempfs还使用交换空间,并且将像其余的内存一样交换出去。如果您运行需要大量临时磁盘的内容,则可能会强制换出页面。一旦创建,临时文件可能会在几分钟后不再使用,并且很适合移动到交换设备。

您可以在紧急情况下将文件用作交换设备。如果您暂时需要额外的交换空间,这将很有用。


2

我编辑了Scott Severance的脚本以匹配较新的free版本,其中已经包含总可用内存字段。

#!/bin/bash

free_mem="$(free | grep 'Mem:' | awk '{print $7}')"
used_swap="$(free | grep 'Swap:' | awk '{print $3}')"

echo -e "Free memory:\t$free_mem kB ($((free_mem / 1024)) MiB)\nUsed swap:\t$used_swap kB ($((used_swap / 1024)) MiB)"
if [[ $used_swap -eq 0 ]]; then
    echo "Congratulations! No swap is in use."
elif [[ $used_swap -lt $free_mem ]]; then
    echo "Freeing swap..."
    sudo swapoff -a
    sudo swapon -a
else
    echo "Not enough free memory. Exiting."
    exit 1
fi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.