据我了解,Linux 交换分区的目的是从RAM中释放一些“不那么频繁访问”的信息,并将其移至硬盘驱动器上的特定分区(以使其读取或写入速度较慢为代价) ),从本质上允许活动应用程序使用更多的“高速内存”。
当您在具有少量RAM的计算机上并且如果用完时不希望遇到问题时,这非常有用。但是,如果您的系统具有16 GB或32 GB的RAM,并且假设您没有在StackExchange上运行MySQL数据库或在Linux中编辑1080p全长电影,那么是否应该使用交换分区?
/tmp
)。
据我了解,Linux 交换分区的目的是从RAM中释放一些“不那么频繁访问”的信息,并将其移至硬盘驱动器上的特定分区(以使其读取或写入速度较慢为代价) ),从本质上允许活动应用程序使用更多的“高速内存”。
当您在具有少量RAM的计算机上并且如果用完时不希望遇到问题时,这非常有用。但是,如果您的系统具有16 GB或32 GB的RAM,并且假设您没有在StackExchange上运行MySQL数据库或在Linux中编辑1080p全长电影,那么是否应该使用交换分区?
/tmp
)。
Answers:
您绝对应该始终启用交换功能,除非有非常令人信服的令人讨厌的原因(例如,根本没有磁盘,或者仅存在网络磁盘)。您是否应该按照通常建议的荒谬大小(例如,两倍于RAM的数量)进行交换?好吧,不。
原因是,交换不仅在您的应用程序消耗的内存大于物理RAM的内存时才有用(实际上,在这种情况下,交换根本不是很有用,因为它会严重影响性能)。当今进行交换的主要动机不是将16GiB的RAM神奇地变成32 GiB,而是更有效地利用已安装的可用RAM。
在现代计算机上,RAM不会被闲置。未使用的RAM是您可能不应该购买并节省的钱。因此,任何你加载或任何因其他内存映射,任何可能可能被任何人任何时间后,再使用(通过安全条件的限制)被缓存。机器启动后不久,所有物理RAM都将用于某事。
每当您从操作系统请求新的内存页时,内存管理器都必须做出明智的决定:
选项#4和#5是非常不可取的,只有在操作系统完全没有其他选择时才会发生。选项#1和#2意味着您扔掉了一些可能很快就会需要的东西。这会对性能产生负面影响。
选项#3表示您将(可能)很快不需要的东西移到了慢速存储上。很好,因为现在您需要的东西可以使用快速RAM。
通过删除选项#3,您实际上已将操作系统限制为只能执行#1或#2。从磁盘重新加载页面与从交换重新加载页面相同,除了通常不太可能需要从交换重新加载页面(由于做出了正确的分页决策)。
换句话说,通过禁用交换功能,您一无所获,但会限制操作系统处理内存请求时有用选项的数量。这可能不是,但很可能会是一个不利的(也永远不会是一个优势)。
认真阅读mmap
联机帮助页(特别是的说明)的读者MAP_NORESERVE
会注意到另一个很好的理由,即使在具有“足够”物理内存的系统上,交换也有一定的必要性:
“当没有保留交换空间时,如果没有物理内存可用,则可能在写入时得到SIGSEGV。”
-等一下,这是什么意思?
如果您映射文件,则可以直接访问文件的内容,就好像该文件以某种方式魔术般地位于程序的地址空间中。对于只读访问,原则上操作系统只需要一个物理内存页面即可,每次访问不同的虚拟页面时,它可以用不同的数据重新填充(出于效率方面的考虑,这当然不行,但是原则上,您可以通过单页物理内存访问价值TB的数据。现在如果你还写入文件映射?在这种情况下,操作系统必须具有一个物理页面(或交换空间),以准备写入的每个页面。在脏页写回过程完成工作之前(这可能需要几秒钟),没有其他方法可以保留数据。因此,操作系统会保留(但不一定要提交)交换空间,因此,如果您正在写映射而又没有物理页面未使用(这是很可能的,并且是正常情况),重新保证它仍然可以工作。
现在,如果没有交换该怎么办?这意味着不能保留任何交换(duh!),这意味着一旦没有可用的物理页面,而您正在写到页面,就会以过程接收的形式令人惊喜细分错误,有可能被杀死。
但是,传统的建议是将交换空间增大为RAM的两倍。尽管磁盘空间很便宜,但分配这么多的交换空间没有意义。浪费便宜的东西仍然是浪费,而且您绝对不希望不断地换入和换出几百兆(或更大)大小的工作集。
没有单一的“正确”交换大小(“正确”交换大小与用户和意见一样多)。无论RAM大小如何,我通常都分配一个固定的512MiB,这对我来说非常有效。背后的原因是为512MiB的东西,你可以随时买得起的今天,即使在一个小的磁盘。另一方面,添加几GB的交换再好不过了。您不会使用它们,除非出现严重错误。
即使在SSD上,由于总线带宽和延迟的原因,交换的速度也要比RAM慢几个数量级,并且虽然很可能不需要再次进行交换(尽管很可能不需要),但是移动某些东西还是可以接受的再次交换它,因此您的可用页面池将有效地免费扩展),如果您确实需要大量交换(即,您的应用程序使用例如50GiB数据集),则您会迷路了。
一旦您的计算机开始交换进出千兆字节的页面,所有内容都会进行爬网。因此,对于大多数人(包括我)来说,这不是一个选择,因此进行大量交换是没有意义的。
我将不同意我在这里所说的一些观点。我仍然会创建SWAP分区,尤其是在生产环境中。我也为我的家用计算机和虚拟机执行此操作。
这些天,我将它们的大小调整为1-1.5倍的内存。2倍的记忆曾经是经验法则。交换磁盘是“便宜的”,因为它不需要备份或保护。
如果您的内存不足,那么交换空间将为您提供一点时间和缓冲来解决该问题。
意识到/ tmp之类的东西可以驻留在交换空间中。
交换区域可以保存部分内核转储,以便可以在下次重新引导时将其还原。这对于您将来需要进行的某些调试紧急情况可能会很好。
也许:
我已经对该主题进行了很多思考,并且看到观点出现在论证两边的次数超出了我的估计。我的方法是开发一种找出答案的方法。
从您认为足够大的活动交换分区开始。
然后,在工作区中打开终端并发出命令free -hs 1
,该命令将每秒报告一次使用情况。
(可选)切换到其他工作区。
做您可能会做的每件事,然后再做更多。一次运行所有常用应用程序,浏览多个选项卡,然后拼命尝试为系统提供实际锻炼,这可能意味着在运行编译操作并检查电子邮件或其他内容时重新编码1/2打视频。让我们面对现实,这一切都与您如何使用系统有关。
当您感到系统处于高负载(或您可能获得的最高负载)之后,请查看终端并检查结果。或者最好通过添加>output.txt
到命令来将输出重定向到文件,以便您可以检查完整运行。如果您使用的掉期从未超过Mem free,则不需要交换。如果可以,那么您可以。
我不需要交换 也许你会。为什么不找出来?
就规模交换而言,经验法则通常被高估,因为这是基于使用的问题。
swap
可以在任何时候通过脚本向上递增交换free
吗?
注意:这是在特定的异常情况下发生的。如果要解决问题,这可能会很有用。我并不是说所有机器都必须交换。
也许!
过去,我在构建“设备”时遇到了问题,该设备在Linux上运行-在紧凑型闪存设备上运行,我不想使用swap来磨损CF,并且有足够的内存供应用程序使用。
这些电器大多数都能正常工作,但是在一个特别忙碌的盒子上,我遇到了一个问题:
内存碎片
没有交换空间,内存逐渐变得越来越分散,尤其是在长时间运行的进程中(即使我有很多可用内存,但内存都很小)。我放入了一些交换空间,并告诉Linux除非必要,否则不要使用它。这完全解决了问题。
除其他所有功能外,交换空间还使内存可以移动并对其进行碎片整理。如果内存碎片,并且需要一个大块,则碎片将被换出;当它们被换回时,它们会有效地进行碎片整理。
看看/ proc / buddyinfo-我的现在看起来像这样:
Node 0, zone DMA 9 5 3 4 2 3 2 2 3 3 1
Node 0, zone DMA32 33901 1149 0 0 0 0 0 0 0 0 1
Node 0, zone Normal 2414 1632 259 22 3 0 2 0 1 1 0
数字代表不同大小的块;每个大小是下一个块大小的一半,从左侧的4mb块到右侧的4kb(即4mb,2mb,1mb等)。新启动的计算机应在左侧保留所有块,而在右侧保留很少的块(=未分段)。还要记住,相同的内存量(例如4mb)在各列中将被表示为不同的数字-最左边一列为1块,最右边一列为1024。
从尽可能远的池中分配内存;例如,如果您的程序想要一次存储12kb的内存,它将从16kb的列中获取它;其余的将出现在4kb列中。如果没有16kb的块,则它将取自32kb的块,从而剩下16kb和4kb,依此类推。
如果没有足够大的内存块,并且您有交换空间,那么例如,如果您需要16kb的内存,它将找到使用最少的16kb块(例如,可能包含4kb的已用块,4kb的可用块,和另外2个已使用的4kb块),仅移动USED部分进行交换,然后将释放的内存分配给新应用程序。
在崩溃的盒子中,我有成千上万的4kb和8kb块,除此之外没有多少。
我尽力告诉(崩溃的机器去!)内核将从内存移动到交换,再交换到内存,但是永远不会在内存之间移动。
交换分区具有重要的价值,而不仅仅是在用完时充当一些额外的RAM。
首先,Linux使用尽可能多的内存来缓存文件和IO操作,如果进行一些交换,您可能会发现更多的内存用于缓存IO并使其更快(通过最小化磁盘访问并减少SSD的磨损)保留某些程序已分配但每12小时仅使用一次的数据,某些守护程序可能就是这种情况。
另外,Linux使用一种乐观的内存分配策略,即使不确定它是否具有实际的内存来填充页面,也可以通过该策略名义上分配页面。这比进行适当的检查和映射每个分配更为有效,并且通常不会造成任何问题。但是,内核用来确定允许分配是否合理的启发式方法包括系统上可用的交换级别,因此,即使系统使用的交换量不多,如果系统具有大量交换,分配可能会更快。
这些因素加在一起,使我个人认为最好在几乎所有普通系统上进行一些交换,但是对于较大的内存大小,我会忽略ram * 2规则,而只需将交换空间限制为4-8GB(取决于磁盘的大小) )。
您的交换空间绝不能超过等待内核进行交换的最大容量。否则,您只是在为系统创建新的故障模式(交换时陷入无法恢复的泥潭)。请注意,尽管现代驱动器能够以GB / sec的数量级进行传输,但是Linux通常只能以每秒几百kB或最多几MB的速率移动交换。因此,巨大的交换可能会使您的系统在几分钟,几小时甚至几天内无法使用。
如果您有足够的物理内存来执行操作,则交换的理想大小是使其与正在运行但从未使用的“垃圾数据”进程数量相匹配。此范围可能在几兆到几百兆之间。这种策略允许您将所有物理内存用于缓存有用的信息,而不是永久存储那些可能永远不会再使用的数据。
如果没有足够的物理内存,则需要评估是否可以忍受大量交换带来的严重速度下降。如果是这样,那么最多有1-2 GB的交换空间可能是有意义的,如果您的驱动器非常快,则可能有多达4 GB的空间。但是,除此之外,还只会使系统的故障模式变得更糟,您应该考虑购买更多的RAM。
没有通用而明确的答案,因为这取决于您将要执行的任务。如果您要运行数据库,HTTP,虚拟化或高速缓存服务器,则无论您拥有多少内存,都永远不要启用任何类型的交换。如果您拥有台式机或混合任务主机,并且具有16 Gb以上的快速RAM,请在此处查看:zRam
无法知道是否需要交换空间,如果我们知道的唯一参数是安装的RAM数量。
在任何情况下,都有一个常见的误解,认为拥有交换空间会对系统性能产生负面影响。这是不正确的。只要您有足够的RAM,无论大小大小都有交换区都不会损害性能。影响性能的原因是RAM不足,无法有效使用交换空间。
情况1:如果您没有交换空间并且碰巧没有RAM,Linux内核将选择一个或多个它认为是不错的候选程序并将其杀死。
情况2:如果您有交换空间并且内存不足,内核将选择较少使用的内存页面,并将它们放在交换区域中以释放RAM。这将减慢系统速度,但不会影响您的应用程序。
我总是喜欢第2种情况,因为我感到无法分散的部分或全部工作是因为内核认为我的应用程序值得杀死。而且,由于当前的平均磁盘大小在TB范围内,因此保留几个百分比的交换应该不是问题。
我在任何系统中应用交换的规则是对此有答案:
当我得到此信息的答案时,将相应地调整系统大小。在过去的几年中,我一直遵循Sun Microsystem的经验法则。高达16 GB的SWAP RAM的两倍,从16 GB到相同数量的RAM。但是另一方面,如果您有足够的RAM可用空间并且应用程序不强制使用SWAP,则可以忽略交换。如果需要,只需放置新磁盘或lun并配置SWAP。Sun的规则之所以适用,主要是因为在Solaris上,如果发生“内核崩溃”,内存将全部转储以交换以进行进一步分析。
如果没有足够的RAM来运行所有程序, 则需要交换。
您说您没有执行任何需要大量RAM的操作。因此,您确实有足够的RAM。
然后,您不需要交换空间。
但是,如果您认为在某个时候,尽管您在问题中暗示了什么,您的程序仍将使用RAM的一半(或三分之二)(经验法则),那么请阅读另一篇“赞成交换”答案。您不需要交换,但是它可以提高系统性能。
是的,您总是需要交换,只是在不太可能的情况下,应用程序甚至不会打扰映射内存,而是直接映射虚拟内存。
将交换文件设置为:
RAM+round(sqrt(RAM))
如果您使用休眠round(sqrt(RAM))
如果你不 swappiness
在台式机(而不是服务器)上将您的密码设置为10 !
过去25年使用的经验法则是最小1xRAM,最大2xRAM,因此您会一直引用该规则。
这个最小值是在我十几岁的时候进入石器时代的,当时恐龙仍在地球上漫游,因为RAM太昂贵了,您绝对需要交换空间才能完成任何事情。
之所以在那时设置最大值是因为收益递减:必须交换这么多的内存太慢了,因为HDD访问比RAM慢了1000倍:在紧急情况下很好,但对于日常使用而言却并不好!那时,当您用完交换空间时,该增加更多RAM了!(今天仍然如此)。
如果你不使用的休眠和你的内存超过1GB的拇指的新规定round(sqrt(RAM))
,其中RAM
显然是在GB您的内存大小。
如果使用休眠方式,则需要能够将全部RAM +已交换的RAM交换到磁盘,因此公式变为: RAM+round(sqrt(RAM))
收益递减的规则今天仍然保持最大,但是除非您测试实际使用率,否则使用2xRAM只会浪费磁盘空间,因此请不要使用最大值,除非使用其他方法耗尽交换空间。
所有这些都为您提供了下表:(最后3列表示交换空间)
RAM No hibernation With Hibernation Maximum
1GB 1GB 2GB 2GB
2GB 1GB 3GB 4GB
3GB 2GB 5GB 6GB
4GB 2GB 6GB 8GB
5GB 2GB 7GB 10GB
6GB 2GB 8GB 12GB
8GB 3GB 11GB 16GB
12GB 3GB 15GB 24GB
16GB 4GB 20GB 32GB
24GB 5GB 29GB 48GB
32GB 6GB 38GB 64GB
64GB 8GB 72GB 128GB
128GB 11GB 139GB 256GB
256GB 16GB 272GB 512GB
512GB 23GB 535GB 1TB
1TB 32GB 1056GB 2TB
以上只是一个经验法则; 这不是引力定律!
你可以,如果打破这种规则(不像万有引力定律)的特定用途的情况是不同的!
专家提示: 始终在HDD开始时分配SWAP,因为磁头需要在磁盘内部移动得更少。
是的:在SSD上,放置交换区域的位置实际上不再重要,因为它们使用量子隧道代替移动磁头,并且现代SSD使用其所有存储单元(甚至未分配的空间)来防止量子退化。
只需执行:
for szFile in /proc/*/status ; do
awk '/VmSwap|Name/{printf $2 "\t" $3}END{ print "" }' $szFile
done | sort --key 2 --numeric --reverse | more
这将为您列出所有被交换出的正在运行的程序(其中一个使用交换空间最多的程序)
如果您使用的空间更多,则增加几个KB:将大小调整为最小的大小,否则,不要打扰...
如果您使用的是台式机/笔记本电脑客户端(而不是服务器),则希望GUI尽可能灵敏,仅在真正需要时才进行交换。Ubuntu已经经过优化,早期交换服务器使用,但是你的客户你想编辑一个巨大的250兆像素的原始图片中gimp
是快速的,所以设置你的swappiness
〜10将保持内核从交换太早,同时确保它不”太晚交换:
sudo nano /etc/sysctl.conf
并添加:
# change "swappiness" from default 60 to 10
# (theoretically only swap when RAM usage reaches around 80 or 90 percent)
vm.swappiness = 10
到文件末尾,保存文件(在nano中为Ctrl+ XY+ Enter)并执行:
sysctl --system
要重新加载该参数或仅出于旧时考虑,请使用Window $方法并重新启动... :-)
妥协答案:这取决于“应该”的含义。
如果您在描述的操作条件下没有交换分区,是否需要某种交换分区?没有。
明智的做法是,有一个交换分区,以防万一您意外地产生了一批记忆猪,因此您有机会在OOM杀手踢进来之前将其杀死?是。
如果您的物理RAM“大大”超过了您将始终同时运行的所有程序的数据内存使用量,那么进行交换不会带来性能优势。如果超过,但不是“很大”,如果OS能够交换出很少使用的内存以将更频繁访问的“文件数据”保留在内存中,则可能会带来性能上的好处。
总而言之,您拥有16GB RAM真是太好了。但是,如果您还有一个1TB的磁盘,是否不能保留其中的16GB进行交换?它只是磁盘的1.5%。