CentOS 16GB RAM需要多少SWAP?


11

您将在具有16GB RAM的双Quad Core XEON上给CentOS安装多少SWAP,它将运行带有mysql后端的php网站-中/重负载?

centos  swap 

Answers:


20

不超过一两场演出-您希望可以进行一点交换,以防万一,并且因为它可以使事情更好地工作,但是如果您到了要进行大量交换的地步,那么机器就可以了变得毫无用处-在真正的灾难性情况下,使用较小的交换空间实际上会更好,因为这样一来,您就会(而不是稍后)触发OOM杀手。


7
请记住,如果需要,可以随时通过腾出一些空间并创建新卷(如果使用LVM)或使用文件作为交换来添加更多交换空间,例如dd if=/dev/zero of=swap.file bs=1024 count=1048576; mkswap swap.file; swapon swap.file
David Spillett

3
附带说明,您可以通过调整/ proc / sys / vm / swappiness值来控制交换程度。
大卫,2009年

2
我不得不不同意这里的几点。。。首先,磁盘很便宜,您不妨扔掉几个GB。其次,如果您不走运,O​​OM杀手可以将整个箱子丢掉。以任何方式依赖它或考虑更好地触发OOM杀手是一个非常糟糕的主意。认为潜在的软管盒比潜在的减速器更好的想法也是一个坏主意。唯一合理的时间是您是否针对这种情况计划了非常具体的设置。
Christopher Cashell

旁注,通常最好将swap设置为分区而不是文件,以避免开销并简化启动过程。但是使用文件即可。任何系统都需要4GB的内存,我怀疑无论如何您都将获得16GB RAM的大量交换
Silverfire

实际上,根据Andrew Morton的说法,交换文件和分区lkml.org/lkml/2005/6/29/11
Journeyman Geek

8

对于很长的答案,我深表歉意。我一直想把这些东西放在可以访问的地方一段时间!

TLDR;从理论上讲,答案将是“可能不小于您的所有应用程序要使用的常驻内存总量”

我会尽力解释你是否和我在一起。

关于虚拟内存的一些知识

我觉得这些天人们普遍对交换的价值及其目的有一个误解。通常认为交换是在内存不足时用作内存的“储备库”。是的,这在一定程度上是正确的,但是内核不想将您的掉期用作储备银行。另外,内核从不希望调用磁盘来获取您想要的数据!

在应用程序空间中,内核将在内存中保留许多内容。

  • 映射的文件数据。
  • tmpfs文件系统。
  • 在运行时分配的原始应用程序内存。
  • 应用程序代码(例如ELF格式的数据段中的内容)
  • 私有映射文件数据。

出于内存管理的目的,支持设备以某种形式或其他形式支持内存分配。

文件支持的内存是来自文件的内存,在典型的O / S上,它构成了系统上绝大多数的内存分配。它包括已加载的共享库之类的文件,从磁盘读取并存储在页面缓存中的文件以及从磁盘映射的文件(实际上,内核不区分页面缓存中的文件和本质上被映射的文件之间的页面)同一件事情)。

从内核的角度来看,关于此内存的最大好处是它是可抛弃的,也就是说,如果您需要内存来存储其他内容,则应该可以转储这些页面,而这正是突然需要内存时页面缓存所做的事情。

匿名支持的内存是另一回事。来自该区域的内存是匿名的,因为磁盘上实际上没有包含该数据的文件。它通常由应用程序堆栈,堆,tmpfs中的任何内容以及私有的已被修改的mmapped数据组成(因为它无法将此内容同步回磁盘)。由于文件系统上只有有效文件才能将这些页面更改后写回,因此匿名支持的内存由交换媒体支持。

现在,内核知道,当内存不足时,放弃文件支持的内存要比匿名映射的内存便宜得多,这是因为匿名数据比文件支持的数据更容易被“脏”,事实上,默认情况下,内核评估匿名支持的内存的价值是文件支持的内存的80倍,这实际上是swappiness修饰符在linux上的作用(如果您想知道swappiness参数到底在改变什么,请参阅此处的信息)。

最坏的情况

对于服务器失控和OOMing而言,最坏的情况是基于这样一个事实:它花费大量的时间来处理I / O请求,而不是遵守内存分配请求。有两个条件可以调用此条件。

  • 一直在交换匿名内存,以获取需要的页面,或为应用程序分配更多页面。
  • 从磁盘上获取数据花费了太多时间,因为它不在内存中,这比您执行需要CPU时间的进程所需的时间要多。

第一个,是人们普遍认为的问题。就是说,由于这么多的内存都存在于交换中,因此需要将匿名内存从RAM中交换出来,重新放入交换中,然后从交换中取出内容,然后放入真实RAM中。此操作非常昂贵,将计算机减慢到可能无法恢复的地步(因为页面请求排队的内容比I / O可以提供的更多)。

第二个考虑较少,但同样重要。如果您将几乎所有内存分配给实际的应用程序数据-您将不会持续很长时间。几乎每个应用程序都依赖于从文件系统读取文件来进行操作,这可能是因为某些指令位于共享库中,或者是因为您需要读取/etc/resolv.conf以进行库调用或任何其他目的。完全有理由中止一个操作系统-却有足够的内存来适合您所有的应用程序,但是由于排队了如此多的I / O请求,因此没有机会正确完成。

内核想要与您的交换做什么

内核希望使用您的交换来摆脱浪费内存的页面,因此它可以将该内存用于其他用途。

基本上,在正常操作中,内核喜欢用磁盘读取的数据来积极填充页面缓存,这意味着它不会读取磁盘上的相同数据。这是很好的设计,可以大大减少I / O。现在,可能是您在内存中放置了一些应用程序,该应用程序休眠了三天,然后醒来,做了很多工作,然后又休眠了三天。

内核希望将这些数据交换出去,从而为文件系统活动腾出空间,因为与使用应用程序的页面相比,您实际使用这些页面的机会更大。交换,在这个意义上可能是一个16KB交易到您的交换媒介,你应该几乎感觉不到,但作为回报,你释放了的内存16KB 可以被用来存储四个文件有价值的数据。

内核不想使用swap的原因

内核绝对不希望通过交换掉其他一些匿名内存来使用您的交换来分配更多的匿名内存,这是人们最担心的情况。

但是,我要指出的是,如果您分配了如此多的内存,则内核别无选择,这是系统管理员的配置问题,而不是内核本身–它只是试图通过内核来做到最好。您提供的选项!

如果您有大量交换,您会增加使用它的机会吗?

没有!如果您有1G的ram和4G的交换,则不会有80%的机会交换数据!内核仅在可以更好地执行内存中的其他操作时才希望使用交换!

完全不使用交换是否有利

我永远不会这样做。交换可以使操作系统摆脱您需要拥有但从未使用过的内存。如果没有交换,那么吞下内存就永远无法取回,通过允许页面缓存来代替它,您可能会看到性能上的显着提高。

什么是最好的交换

从理论上讲,找出安全性需要多少个常驻内存+ 20%,例如必须从堆中分配内存的可重入库调用,然后将交换设置为该数量。从理论上说,这将允许操作系统交换所有匿名内存,如果它不得不让位给更有用的东西。

如果我有内核机会换掉所有的东西,那很危险吧?

请记住,内核不想在这里交换以进行更多的匿名内存分配,它只会交换掉未使用的页面,而使用其他可以更好地利用空间的东西。

如果换出匿名内存只是为了从更多匿名内存中进行分配,则您做错了事,需要更多RAM或无论如何都要重新调整应用程序堆栈。

您需要多少内存

当然,您需要允许有足够的RAM来运行所有应用程序,但是您可能应该允许额外的2G RAM来填充页面缓存-也许更多。页面缓存使您的计算机运行速度大大提高,磁盘的使用寿命更长。如果您想运行Web服务器,那么为页面缓存提供更多资源是一个好主意,因为您可以从页面缓存中检索和重用大量静态内容,这些静态内容将被分发出去(如果您的Web服务器吞吐量为5mb / s,您实际上就不会这样做了)想要从磁盘上检索您产生的5mb / s的内容!)。

如果您真的不相信linux可以正确交换怎么办

如果您真的很在意,可以分配比您更多的内存:

  • 将您的掉期金额设置为不超过RAM
  • 将/ proc / sys / vm / overcommit_memory设置为2
  • 将/ proc / sys / vm / overcommit_ratio设置为永远不会实际超过物理RAM限制的值。请参阅内核文档以了解该数字是多少。

什么是为我的应用程序调整内存的最佳方法

  • 了解交换性实际上是做什么的。
  • 使用CGroups为每个应用程序分配正确的资源。
  • 更改上面提到的过量使用模式,以使操作系统强制执行严格的限制。
  • 使用cgroup中按上述方法上的应用程序集OOM priorites你真的想保持如果你的内存和应用出来,你真的,如果你的内存不足要沟里。

供应商建议使用其他配置。

听那个。某些应用程序的编写方式使它们有意调用内核,以使其页面在所有其他页面上处于活动状态。说实话,这是一个令人讨厌的窍门,但是它破坏了内核在发生内存时无缝管理内存的能力。如果您的供应商提供了您的详细信息,则他们很可能属于此类,请听他们所说。

综上所述

  • 交换旨在用作放置浪费的内存的地方。不作为“备用内存”
  • 进行大量交换对您使用它的机会没有任何影响。
  • 内核确实想阻止您访问磁盘以获取数据。这与-交换空间时同样适用于-如果不是更平等地适用于页面缓存。
  • 内核将尽最大努力兑现您为运行的应用程序提供的设置。但是,如果您有500个apache孩子全部占用32M内存,请不要感到惊讶。那就是您选择的配置的问题,而不是内存管理的问题。

内核通常在正确管理虚拟内存方面做得很好。几乎总是这样,您的应用程序分配的内存超出了您可能希望使用的内存,这就是导致OOM的原因。

交换曾经用作“备用内存”,但它不再是其主要用途,因此不要以为使用它。相反,请欣赏您的内核可能最了解它要使用内存的什么。给它做决定的空间,您将从整体性能改进中受益。


2

摘自文档“ RedHat®EnterpriseLinux®5部署建议上的Oracle 10g服务器”。

Oracle在MetaLink说明169706.1中提供了有关交换大小的一般建议。这些建议可能会导致在具有大量内存的系统上创建非常大的交换空间。很大的交换可能会导致严重的系统性能下降,并且可以通过减少交换空间来解决。红帽不建议在红帽企业版Linux 5上分配大于4GB的交换空间。

因此,对于16GB,您的交换空间应不超过4GB。

PS。还值得一提的是,oom与使用整个I / O带宽的不可用换出过程相比,被调用几乎总是更好。



-1

从我从linux文档中回想起:如果您的ram大于2gb,那么您将执行swap =(ramSize + 2)。如果小于,则执行swap =(ramSize * 2)


-2

我为您找到了此文档,它应该可以帮助您做出决定,这就是: 什么是交换空间?,但以上答案均不正确


1
您链接到的文档与自己不同。按照“更多的2Gb RAM数量大于2Gb的RAM”的规定规则,可以将1Gb交换为3Gb RAM(3-2 = 1),而不是5Gb。
David Spillett
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.