it-swarm.cn

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

使用swap空间而不是RAM可以极大降低速度 PC。

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

在下面查看我的conky输出:

conky output

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

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
132
Stefan

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

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

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

96
Riccardo Murri

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

/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代替。

关于用可用的可用内存交换是好还是坏,一直存在一些争论,但是 buntu帮助的确建议桌面系统的值建议为1 。另请参阅 有关Digital CentOS的本教程

96
Marcel Stimberg

Linux在RAM)被填充之前开始交换。这样做是为了提高性能和响应速度:

  • 由于有时RAM)更好地用于磁盘缓存而不是存储程序内存,因此可以提高性能。缓存。

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

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

46

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

从下开始,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时,会引发主要页面错误。

何时以及为何发生交换?

情况1:

与上面的细节保持一致,让我们考虑一种情况,当大量内存成为内存映射时。现在,启动了一个进程,该进程需要内存。如上所述,内核将执行一些内存映射。但是,没有足够的物理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。

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

zone info

swap free low free

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

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

15
Anugraha Sinha

具有更多可用内存

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

休眠中

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

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

短消息

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

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

5
Huygens

buntu交换F.A.Q。 表示Marcel链接到

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

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

3
Jader Dias

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

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

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

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

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

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

3
Warren Young

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

2
ILMostro_7