当RAM中有足够的可用空间时,为什么要使用swap?


124

使用交换空间代替RAM会大大降低 PC的速度

那么,为什么当我有足够多的可用RAM时,我的Linux系统(Arch)是否使用交换?

在下面查看我的conky输出:

conky输出

另外,这可能是我遇到的速度和系统响应性问题的原因吗?

输出free -m

$ free -m
             total       used       free     shared    buffers     cached
Mem:          1257       1004        252          0         51        778
-/+ buffers/cache:        174       1082
Swap:          502        144        357

5
我敢肯定,随着SSD成为常态,此问题的动态已经发生了很大变化。虽然您的普通消费者SSD仍然比RAM慢很多,但现在要便宜些-RAM $ / GB或SSD $ / GB。较慢的SSD便宜很多,而且在大多数情况下足够快,因此即使交换也不会像使用旋转媒体那样严重干扰用户体验。
lkraav

7
有时,如果过去由于内存已满而使用交换功能,则可能会遇到以前交换的数据留在那里的情况,因为该数据目前尚无用。
Totor

1
正如Totor所说。有时系统会出于某种原因将页面调出。如果稍后将该页面移回内存以进行读取操作,则不会删除交换空间中的副本。如果以后再次将同一页调出而不作任何更改,则可以这样做而无需再次写入磁盘。那里的副本已经是最新的。换句话说,页面可以占用交换空间和主内存中的空间。
izak

Answers:


93

即使仍有可用的RAM ,Linux系统使用一些交换也是正常的。Linux内核将切换到很少使用的内存页面(例如,getty仅使用X11 的实例以及其他一些非活动的守护程序)。

仅当没有足够的可用RAM时,交换空间的使用才成为问题内核被迫不断地移动内存页面以交换并返回RAM,以保持应用程序运行。在这种情况下,系统监视器应用程序将显示大量磁盘I / O活动。

为了进行比较,我的Ubuntu 10.04系统有两个用户都通过X11会话登录,都运行GNOME桌面,使用〜600MB的交换空间和〜1GB的RAM(不计算缓冲区和fs缓存),所以我想说一下您的交换数据用法看起来很正常。


39
通过换出不活动的程序,您将有更多的内存用于文件缓存。这样可以加快速度。
jmanning2k 2010年

91

可以通过设置以下值来配置此行为:

/proc/sys/vm/swappiness

默认值为60。将其设置为0表示在仍然有RAM且100尽快交换内存时从不使用swap。

要临时更改该值(重启后丢失):

sudo sysctl vm.swappiness=10

要永久更改值,请编辑文件:

/etc/sysctl.conf

以root用户身份(例如sudo nano /etc/sysctl.conf)并更改或添加(如果不存在)以下行:

vm.swappiness

达到所需值。如果此文件不存在(例如,在Arch Linux中),请尝试/etc/sysctl.d/99-sysctl.conf

关于用可用的可用内存交换是好是坏,一直存在一些争论,但是Ubuntu帮助确实建议将Desktop系统的值设为10。另请参阅有关Digital Ocean for CentOS的本教程


27
请注意,降低swappiness并没有一定意味着性能或响应增加。我已经看到有关交换性提高的报告,这转化为更好的性能。不要相信您阅读的任何不包含基准的内容,并检查基准是否使用了与您相似的工作负载。
吉尔斯(Gilles)2010年

这在重启后是否仍然存在?我以为/ proc在每次引导时都会重新生成。
HandyGandy 2010年

@HandyGandy:我在答案中添加了如何永久更改的信息。
Marcel Stimberg

@HandyGandy:要学究一点,/ proc不会在每次引导时重新生成,而是proc是一个虚拟文件系统,因此在您访问它们时才“生成”。它根本不存在于磁盘上。
Lie Ryan

swappiness值对我的系统没有影响。即使将其设置为0,当仍然有2GB可用内存时,仍将继续移动关键且经常使用的页面(例如,IDE的索引)进行交换。
Chefarov '18

46

在RAM填满之前,Linux开始交换。这样做是为了提高性能和响应能力:

  • 由于有时将RAM更好地用于磁盘缓存而不是用于存储程序存储器,因此可以提高性能。因此,最好换掉一个处于非活动状态一段时间的程序,而将经常使用的文件保留在缓存中。

  • 通过在系统空闲时(而不是在内存已满并且某些程序正在运行时)请求换出页面,并请求更多RAM来完成任务,来提高响应速度。

交换当然会降低系统的速度,但是交换的替代方案不是交换,而是交换更多的RAM或使用更少的RAM。


因此,从某种意义上说,交换是一种情况下的措施?那和冬眠的东西?
tshepang 2011年

@Tshepang:有足够的交换空间来容纳您的虚拟内存并不是“万一”,这是有必要的(否则您的程序将由于内存不足而崩溃)。
吉尔斯

1
@Tschepang:OOM杀手是它们崩溃的原因。(从技术上讲,您可以没有OOM杀手,而不能分配任何东西,但这很有可能会锁定系统; OOM杀手使管理员更有可能登录并以确保重要的流程持续运行。)
Gilles

1
我理解您的观点是“在系统空闲时而不是在内存已满时交换页面”,但是这个家伙几乎没有使用15%的RAM。远未满,不是吗?尽管之前由满RAM引起的交换可能已离开这种情况……
Totor

1
什么时候“ Linux在RAM填满之前开始交换”?恰好
Yousha Aleayoub

11

这是一篇旧文章,但是,我仍然可以在这里发表自己的想法。

从下开始,Linux首先将内存划分为页面(在x86_64系统上通常为每页面4K)。此后,创建虚拟内存,使用MMU(内存管理单元)对物理内存进行映射。

进程是从虚拟内存区域分配的内存,因此请注意,当您看到/ proc / meminfo时,您将看到VMalloc *作为虚拟内存的详细信息。

假设您有一个请求内存的进程(例如300MB-Web浏览器)。该过程将从虚拟内存中分配300MB,但是,不必将其映射到内存(即映射到物理内存)。存在用于内存管理的“写时复制”的概念,据此,如果您的进程实际上使用了从虚拟内存分配的内存(即它在内存上进行了一些写操作),则仅将其映射到物理内存。这有助于内核有效地在多进程环境中正常工作。

什么是缓存?

进程使用的大量内存是共享的。可以说,几乎所有进程都使用glibc库。当每个进程可以访问相同的内存位置并完成工作时,在内存中保留glibc的多个副本的意义何在?这种经常使用的资源被保留在高速缓存中,以便在进程需要时可以将它们引用到相同的内存位置。这有助于加快进程,因为从磁盘上一次又一次地读取glibc(etc。)会很耗时。

上面说的是共享库,文件读取也是如此。如果您是第一次读取大型文件(例如100-200MB),则将花费大量时间。但是,当您尝试再次读取相同内容时,速度会更快。数据已缓存在内存中,并且并未对所有块进行重新读取。

什么是缓冲区?

就缓冲区而言,当进程执行文件I / O时,它依靠内核的缓冲区将数据写入磁盘。进程,请求内核完成这项工作。因此,内核代表进程将数据写入其“缓冲区”,并告知进程写入已完成。内核将以异步方式继续将此缓冲区中的数据同步到磁盘。这样,进程依靠内核来选择正确的时间将数据同步到磁盘,并且进程可以继续进行下去。请记住,这是常规进程正在执行的常规I / O。但是,需要确认磁盘上实际完成I / O的专用过程可以使用其他机制在磁盘上进行I / O。一些开源实用程序是libaio。此外,还有一些方法可以调用显式同步到在流程上下文中打开的FD,

那是什么页面错误?

考虑一个示例,当您启动一个进程(例如Web浏览器)时,其二进制文件约为300MB。但是,完整的300MB Web浏览器二进制文件无法立即开始工作。该过程在其代码中不断地从功能转移到功能。如前所述,虚拟内存将消耗300MB,但并非所有内存都映射到物理内存(RSS-常驻内存会更少,请参见顶部输出)。当代码执行到达某个点时,实际上并没有实际映射内存,就会出现页面错误。内核会将内存映射为物理内存,并将内存页面与您的进程相关联。这种页面错误称为“次要页面错误”。类似地,当进程正在执行文件I / O时,会引发主要页面错误。

何时以及为何发生掉期交易?

情况一:

与上面的细节一致,让我们考虑一种情况,当大量内存成为内存映射时。现在,启动了一个进程,该进程需要内存。如上所述,内核将执行一些内存映射。但是,没有足够的物理RAM来映射内存。现在,内核将首先查看缓存,它将具有一些未使用的旧内存页面。它将这些页面刷新到一个单独的分区(称为SWAP)上,释放一些页面,并将释放的页面映射到即将到来的新请求。由于磁盘写入要比固态RAM慢得多,因此此过程要花费大量时间,因此可以看到速度变慢。

情况2:

假设您看到系统中有很多可用内存。即使那样,您仍然看到有很多交换发生。可能存在内存碎片的问题。考虑一个进程,该进程需要内核提供50MB的连续内存。(请牢记相邻)。显然,内核会随机地将页面分配给不同的进程,并释放其中的一些进程。但是,当我们需要连续的内存时,它将不得不寻找能够满足流程需求的块。如果无法获得此类内存,则必须换出一些旧的内存页面,然后分配连续的页面。即使在这种情况下,也会发生掉期。从2.6或更高版本的内核开始,此类碎片问题已大大减少。但是,如果系统长时间运行,则可能仍然会出现此类问题。

请参见此示例(vmstat输出

2016-10-29 03:55:32 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
2016-10-29 03:55:32  r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
2016-10-30 03:56:04 19 23 2914752 4692144 3344908 12162628 1660    1  8803 12701 4336 37487 14  7 40 38  0
2016-10-30 03:56:34  3 20 2889296 4977580 3345316 12026752 2109    2  8445 14665 4656 36294 12  7 46 34  0
2016-10-30 03:57:04  1 11 3418868 4939716 3347804 11536356  586 4744  2547  9535 3086 24450  6  3 59 33  0  <<<-----
2016-10-30 03:57:34  3 19 3456252 5449884 3348400 11489728 3291 13371  6407 17957 2997 22556  6  4 66 24  0
2016-10-30 03:58:04  7  6 4194500 5663580 3349552 10857424 2407 12240  3824 14560 2295 18237  4  2 65 29  0
2016-10-30 03:58:34  2 16 4203036 5986864 3348908 10838492 4601 16639  7219 18808 2575 21563  6  4 60 31  0
2016-10-30 03:59:04  3 14 4205652 6059196 3348760 10821448 6624 1597  9431  4357 1750 20471  6  2 60 31  0
2016-10-30 03:59:34  2 24 4206968 6053160 3348876 10777216 5221 2067 10106  7377 1731 19161  3  3 62 32  0
2016-10-30 04:00:04  0 13 4205172 6005084 3348932 10785896 6236 1609 10330  6264 1739 20348  4  2 67 26  0
2016-10-30 04:00:34  4 11 4206420 5996396 3348976 10770220 6554 1253 10382  4896 1964 42981 10  5 58 27  0
2016-10-30 04:01:04  6  4 4177176 5878852 3348988 10825840 8682  765 10126  2716 1731 32949  8  4 69 19  0

@ 2016-10-30 03:57:04,我们看到仍然有大量的可用RAM。但是,即使这样换出还是发生了。在这一点上,我们检查了进程树,但没有看到需要占用如此大量内存(比可用内存更多)的进程。明显的怀疑是上述情况2。我们在上面检查了buddyinfo和zoneinfo日志(使用echo m> / proc / sysrq-trigger进行检查,输出进入syslogs)。

对于我们的普通系统,区域信息的比较是这样的。并且下面还提到了缓存/空闲/低内存的图表

区域信息

交换免费低免费

查看信息,很显然在节点0和节点1正常中存在内存碎片(节点是基于NUMA的计算机,因此有多个节点(请参阅numactl以检查系统信息))。

内存碎片也是即使在有可用内存的情况下交换使用量仍会增加的原因。


2
您应该澄清在“情况2”中,苛刻的过程是否正在分配物理内存,这是不常见的情况。大多数进程仅处理几乎不相关的虚拟内存。您可能还想更好地解释如何从显示的数字和图表中断言内存碎片,因为乍一看并不明显。哦,顺便说一句,您实际上是在谈论连续内存,希望不是传染性内存;-)
jlliagre

@jlliagre:感谢您的输入。我正在编辑“连续”错误。
Anugraha Sinha

5

有更多可用内存

就像大家都说的那样,yes交换将帮助您摆脱未使用的内存,因此可以帮助您拥有更多的可用内存。

冬眠

但是swap也可以用于休眠,这在您拥有笔记本电脑或想节省能源并在下班前将计算机置于休眠状态时非常有用。因此,您可以在第二天早上更快地开始。

拥有休眠功能是当今我们仍然建议至少具有用于交换的RAM大小的主要原因之一。这样,系统可以将所有已用的RAM放入交换区并进入休眠状态。

缺点

请注意,一旦交换了一个过程数据,即使关闭后也可以在交换中读取它,除非交换是加密的(当然)。

休眠状态下使用加密交换并不适用于所有发行版。您需要使用固定的加密密钥(某些设置在每次引导时随机生成交换空间加密密钥)和initrd / initramfs来激活加密的卷,然后再继续。


3

许多现代程序都是基于肿的框架构建的,这些框架会拖入运行该程序实际上并不需要的大量垃圾。将那些未使用的页面交换出去,将RAM释放给可以实际使用该RAM的缓存和程序。

我从痛苦的个人经历中讲。

去年,我将自己的网站之一切换到了基于Firefox的有前途的新Web服务器框架。在诸如Firefox之类的以客户端为中心的程序之上构建服务器端系统听起来很奇怪,但是它具有一些巨大的好处。Firefox非常强大,提供了一些令人印象深刻的内部服务,并且减少了服务器和客户端之间的阻抗不匹配,以使它们都运行类似的平台。

但是有一个缺点:Firefox很大。真的很大 这是一个1.x版的项目,因此他们还没有解决删除GUI支持的问题。[*]我的网站不需要任何东西,但是因为托管服务提供商使用的VPS技术不需要不允许交换空间,GUI代码以及我未使用的Firefox其他所有部分都占用了实际RAM。我最终只需要最少 512 MB RAM 即可运行该站点,而不会因为内存耗尽而使其崩溃。如果我的VPS有一些交换空间,那么我大概可以采用256 MB的计划。

[*] 甚至可能都不希望从框架中删除GUI代码,因为该平台的优势之一是高保真度的Web抓取,因为服务器端框架可以从另一个站点下载网页,并且您可以对其进行操作就像在客户端一样。考虑混搭。如果您无法将网页“呈现”到某些图形上下文中,那么很多事情都会中断。

顺便说一下,这个Web框架现在基本上已经死了,所以没有名称可耻。最好只是将更广泛的教训牢记在心:是的,即使您有大量的可用RAM,交换仍然有用。


3

从Marcel链接到的Ubuntu Swap FAQ

作为最低要求,强烈建议交换空间应等于物理内存(RAM)的数量。另外,建议交换空间是物理内存(RAM)的两倍,具体取决于硬盘的数量

我认为您应该增加系统中的交换空间。交换允许丢弃已分页的数据,从而加快了RAM内存的分配。


6
我仍然觉得这难以置信。为什么我的4GB永不休眠系统需要8 GB的交换空间?我的64GB计算节点是否真的需要128GB交换空间?除非有特殊的原因,否则我通常分配不超过1GB的交换空间。
大卫·麦金托什

2
它为在闪电般快速的RAM中缓存慢速硬盘留出了更多空间。(此外,某些休眠方案将RAM的副本保存到swapspace中)
Arafangion 2010年

6
@ David,@ Jader:swap = 2 * ram数字是一个古老的栗子,在原始的正当性变得无关紧要之后幸存了下来-现在人们试图找到一种方法来为这个数字辩护,而不是为他们的系统提出合适的数字。看看为什么我们需要将交换空间设置为物理内存的两倍?
吉尔斯(Gilles)2010年

1
@Gilles我坚持我的立场,因为我曾经见过关于该主题的权威论文,这与许多专家相矛盾,我不知道他们的知识有多深。
Jader Dias

4
如果您还记得参考文献,请分享。
吉尔斯(Gilles)2010年

2

我认为“ Gilles”已经提到了一个事实,即尽管您可能拥有足够的RAM,但是在某些“缺点”期间交换对您很有用,甚至在关机后也可以持久保存一些数据-否则我认为是错误的吗?(由于重新启动后RAM会被清除掉),我的系统上有12GB的RAM,我之前也曾想过这个问题。有一次,当我禁用所有交换并且仅依靠我的RAM时,在尝试关闭系统后调试某些系统错误或崩溃等故障时,我遇到了痛苦的经历。从那时起,我重新启用了交换分区。

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.