为什么当我有足够的可用RAM时,我的Linux系统(Arch)是否使用交换功能?
在下面检查我的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
#1 楼
即使仍有可用的RAM,对于Linux系统来说,使用一些交换也是正常的。 Linux内核将移动到交换很少使用的内存页面(例如,仅使用X11时使用getty
实例,以及其他一些不活动的守护程序)。交换空间的使用仅在存在该问题时才成为问题没有足够的可用RAM,并且内核被迫连续移动内存页面以交换并返回RAM,只是为了保持应用程序运行。在这种情况下,系统监控器应用程序将显示大量磁盘I / O活动。
作为比较,我的Ubuntu 10.04系统使用了约600MB的内存,该系统的两个用户都通过X11会话登录,并且都运行GNOME桌面。交换和大约1GB的RAM(不计算缓冲区和fs缓存),因此我认为您的交换使用数据看起来很正常。
评论
通过换出不活动的程序,您将有更多的内存用于文件缓存。这样可以加快速度。
– jmanning2k
2010-10-7 17:39
#2 楼
可以通过设置以下值来配置此行为:/proc/sys/vm/swappiness
默认值是60。将其设置为0意味着在剩余RAM和100正在尽快换出内存。
要临时更改值(重新启动后丢失):
sudo sysctl vm.swappiness=10
更改值永久地,编辑文件:
/etc/sysctl.conf
以根用户身份(例如
sudo nano /etc/sysctl.conf
)并更改或添加(如果不存在)行:vm.swappiness
达到所需值。如果该文件不存在(例如,在Arch Linux中),请尝试使用
/etc/sysctl.d/99-sysctl.conf
。对于桌面系统,建议将值设置为10。另请参阅有关Digital CentOS的本教程。评论
请注意,降低交换性并不一定意味着性能或响应能力的提高。我见过关于交换性提高转化为更好性能的报道。不要相信您阅读的任何不包含基准的内容,并检查基准是否使用了与您相似的工作负载。
–吉尔斯'所以-不再是邪恶的'
2010-10-3 23:05
这在重启后是否仍然存在?我以为/ proc在每次引导时都会重新生成。
–HandyGandy
2010-10-5 2:10
@HandyGandy:我在答案中添加了如何永久更改的信息。
– Marcel Stimberg
2010-10-5 6:56
@HandyGandy:要学究一点,/ proc不会在每次引导时重新生成,而是proc是一个虚拟文件系统,因此在您访问它们时才“生成”。它根本不存在于磁盘上。
– Lie Ryan
18年4月12日在23:56
swappiness值对我的系统没有影响。即使将其设置为0,当仍然有2GB可用内存时,仍将继续移动重要且经常使用的页面(例如我的IDE索引)进行交换。
–chefarov
18年8月5日在10:19
#3 楼
在RAM填满之前,Linux开始交换。这样做是为了提高性能和响应速度:可以提高性能,因为有时将RAM用于磁盘缓存比用于存储程序存储器更好。因此,最好换出一个处于非活动状态一段时间的程序,然后将经常使用的文件保留在缓存中。通过在系统空闲时(而不是在内存已满时)换出页面来提高响应速度。一些程序正在运行,并请求更多RAM来完成任务。
交换确实会减慢系统速度,但交换的替代方案不是交换,而是交换更多的RAM或使用更少的RAM 。
评论
那么,从某种意义上说,交换是一种情况下的措施?那和冬眠的东西?
– tshepang
2011年1月13日,11:58
@Tshepang:有足够的交换空间来容纳您的虚拟内存并不是“万一”,这是有必要的(否则您的程序将由于内存不足而崩溃)。
–吉尔斯'所以-不再是邪恶的'
2011年1月13日19:14
@Tschepang:OOM杀手是它们崩溃的原因。 (从技术上讲,您可以没有OOM杀手,而不能分配任何东西,但这很有可能会锁定系统; OOM杀手使管理员更有可能登录并让重要的流程继续运行。)
–吉尔斯'所以-不再是邪恶的'
2011年1月13日19:21
我理解您的观点“在系统空闲时而不是在内存已满时交换页面”,但是这个家伙几乎没有使用15%的RAM。远未满,不是吗?尽管先前由于内存已满而导致的交换可能已离开这种情况...
– Tortor
13年3月21日在23:43
什么时候“ Linux在RAM填满之前开始交换”?究竟
– Yousha Aleayoub
17-10-14在12:22
#4 楼
这是一篇旧文章,但是,我仍然可以保留自己的想法。从下开始,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)。
对于我们的普通系统来说,区域信息的比较就是这样。
下面还提到了用于缓存/空闲/低内存的图形
查看信息,很显然在节点0和节点1正常中存在内存碎片(节点是基于NUMA的计算机,因此有多个节点(请参阅numactl来检查信息)对于您的系统而言))。
内存碎片也是即使在有可用内存的情况下,交换使用也会增加的原因。
评论
您应该澄清在“情况2”中,苛刻的过程是否正在分配物理内存,这是不常见的情况。大多数进程只处理几乎不相关的虚拟内存。您可能还想更好地解释如何从显示的数字和图表中断言内存碎片,因为乍一看并不明显。哦,顺便说一句,您实际上是在谈论连续记忆,希望不是传染性记忆;-)
– jlliagre
16 Dec 8'在0:58
@jlliagre:感谢您的输入。我正在编辑“连续”错误。
– Anugraha Sinha
16年12月8日在1:36
#5 楼
拥有更多的可用内存就像每个人都说的那样,是的swap可以帮助您摆脱未使用的内存,因此可以帮助您拥有更多的可用内存。
休眠
但是交换也可以用于休眠,这在您拥有笔记本电脑或想节省能源并在下班前将计算机置于休眠状态时非常有用。因此,您可以在第二天早上更快地开始。
具有休眠功能是我们今天仍然看到建议至少具有用于交换的RAM大小的主要原因之一。这样,系统可以将所有已用的RAM放入交换区并进入休眠状态。
短消息
请注意,一旦交换了过程数据,就可以在交换区中读取数据。即使关闭后,除非对交换进行了加密(当然)。
将加密的交换与休眠一起使用并不能在所有发行版中都立即可用。您需要使用固定的加密密钥(某些设置在每次引导时随机生成交换空间加密密钥)和initrd / initramfs才能激活加密的卷,然后再继续操作。
#6 楼
许多现代程序都建立在ated肿的框架上,这些框架会拖累许多您实际上不需要的垃圾来运行该程序。将那些未使用的页面交换出去可以释放RAM来缓存和可以真正使用该RAM的程序。我从痛苦的个人经历中讲到。
去年,我换了一个将我的网站扩展到一个基于Firefox的有前途的新Web服务器框架。在诸如Firefox之类的以客户端为中心的程序之上构建服务器端系统可能听起来很奇怪,但是它具有一些巨大的好处。 Firefox非常强大,提供了一些非常令人印象深刻的内部服务,并且减少了服务器和客户端之间的阻抗不匹配,使两者都运行类似的平台。
但是有一个缺点:Firefox很大。真的很大这是一个1.x版的项目,因此他们还没有解决删除GUI支持的问题。[*]我的网站不需要任何东西,但是因为托管服务提供商使用的VPS技术不需要为了留出交换空间,我没有使用的GUI代码和Firefox的所有其他部分都吃了真正的RAM。我最终只需要最少512 MB RAM即可运行该站点,而不会因为内存耗尽而使其崩溃。如果我的VPS有一些交换空间,那么我可能可以采用256 MB的计划。
[*]从框架中删除GUI代码甚至可能不是所希望的,因为其中一项好处是该平台的功能是高保真度的Web抓取,因为服务器端框架可以从另一个站点下载网页,并且您可以像在客户端一样操作它们。考虑混搭。如果您无法将网页“呈现”到某些图形上下文中,那么很多事情都会中断。
顺便说一句,这个Web框架现在已经死了,所以没有点名称并假装。最好只是将更广泛的教训牢记在心:是的,即使您有大量的可用RAM,交换仍然有用。
#7 楼
从Ubuntu Swap F.A.Q. Marcel链接到的作为基本最低要求,强烈建议交换空间应等于物理内存(RAM)的数量。另外,建议交换空间是物理内存(RAM)的两倍,具体取决于硬盘的数量。我认为您应该增加系统中的交换空间。交换允许丢弃已分页的数据,从而加快了RAM内存分配。
评论
我仍然觉得这难以置信。为什么我的4GB永不休眠系统需要8 GB的交换空间?我的64GB计算节点是否真的需要128GB交换空间?除非有特殊原因,否则我通常分配不超过1GB的交换空间。
–大卫·麦金托什(David Mackintosh)
2010-10-4 18:45
它为在闪电般的快速RAM中缓存慢速硬盘留出了更多空间。 (此外,某些休眠方案将RAM的副本保存到交换空间中)
–阿拉方安
2010-10-5 13:36
@ David,@ Jader:swap = 2 * ram数字是一个古老的栗子,在原始的证明变得无关紧要后幸存了下来-现在人们试图找到一种证明该数字的方法,而不是为他们的系统提出合适的数字。看看为什么我们需要将交换空间设置为物理内存的两倍?
–吉尔斯'所以-不再是邪恶的'
2010年11月12日13:05
@Gilles我坚持我的立场,因为我曾经见过关于该主题的权威论文,与许多专家相矛盾,我不知道他们的知识有多深。
–贾德·迪亚斯(Jader Dias)
2010-11-13在1:47
如果您还记得该参考,请分享。
–吉尔斯'所以-不再是邪恶的'
2010-11-13 10:46
#8 楼
我认为,“ Gilles”已经提到了一个事实,即尽管您可能拥有足够的RAM,但是在某些“缺点”期间交换对您很有用,甚至在关机后也可以永久保存一些数据-否则我认为是错误的吗?( (由于RAM在重新启动后会被冲刷掉),我的系统上有12GB的RAM,我也曾考虑过这个问题。有一次,当我禁用所有交换并且仅依靠我的RAM时,在尝试关闭系统后调试某些系统错误或崩溃等故障时,我遇到了痛苦的经历。从那时起,我重新启用了交换分区。#9 楼
关于交换空间是物理内存(RAM)两倍的建议不再更新https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/storage_administration_guide/ch-swapspace#tb-推荐系统交换空间,但仅对于系统中的少量内存才适用。评论
这是对其他答案的评论吗?它似乎没有解决这个问题。
– Kusalananda♦
20/12/30在12:11
评论
我敢肯定,随着SSD成为常态,此问题的动态已经发生了很大变化。虽然您的普通消费者SSD仍然比RAM慢很多,但是现在要便宜些-RAM $ / GB或SSD $ / GB。速度较慢的SSD便宜得多,而且在大多数情况下足够快,因此即使交换也不会像使用旋转媒体时那样严重干扰用户体验。有时,如果过去由于内存已满而使用了swap,则可能会遇到以前交换的数据留在那里的情况,因为这对当前数据没有用。
正如托尔所说。有时,系统会出于某种原因而将页面调出。如果稍后将该页面移回内存以进行读取操作,则不会删除交换空间中的副本。如果以后再次翻页相同的页面而不作任何更改,则可以这样做而无需再次写入磁盘。那里的副本已经是最新的。换句话说,页面可以占用交换空间和主内存中的空间。