多less交换你将CentOS安装在一个双核四核XEON与16GB内存将要运行的PHP网站与MySQL后端 – 中/重负荷?
只不过是一两个演出 – 你想要一点点的交换,以防万一,因为它有助于事情工作好一点,但是如果你到达了重大交换的地步,机器正在是无用的 – 而且在真正的灾难性情况下,你实际上拥有更小的交换空间会更好,因为这样你就可以尽早触发OOM杀手。
我很抱歉,很长的答案。 我一直想把这个东西放在一个可以使用的地方!
TLDR; 从理论上讲,答案将是“可能不less于所有应用程序想要使用的驻留内存总量”
我会尽力解释你是否和我在一起
有关虚拟内存
我觉得现在有一个共同的误解,那就是互换的价值是什么以及它的目的是什么。 人们经常认为,当内存不足时,交换被认为是内存的“储备银行”。 是的,这是部分正确的,但内核不希望把你的掉期用作储备银行 。 此外,内核从不想调用磁盘来获取您之后的数据!
在应用程序领域,内核将保存在内存中的一些东西。
为了内存pipe理的目的,内存分配以某种forms被支持设备支持。
文件支持的内存是来自文件的内存,典型的O / S构成了系统内存分配的绝大部分。 它包括诸如已经加载的共享库,从磁盘读取的文件以及存储在页面caching中的文件和从磁盘转储的文件(事实上,内核不区分页面caching中的文件之间的页面,一样的东西)。
从内核的angular度来看这个内存的好处是它的一次性的,也就是说,如果你需要内存来存储其他东西,那么这个页面应该是可以转储的,而这正是页面caching在突然出现内存时所要做的。
匿名支持的记忆是另一回事。 这个区域的内存是匿名的,因为磁盘上没有实际包含这些数据的文件。 这通常由应用程序堆栈,堆,tmpfs和mmapped数据中的任何内容组成,这些数据是私有的,并且已被修改(因为它不能将这些东西同步回磁盘)。 由于只有在文件系统上没有有效的文件才能将这些页面写回,如果它们发生更改,则匿名支持的内存将由交换介质支持。
现在,内核知道,当内存稀less时,将文件支持的内存匿名映射内存比较便宜得多,这是因为匿名数据比文件支持数据有更高的“脏”的可能性,实际上默认情况下内核以匿名方式支持的内存比文件支持内存的价值高出80倍,这实际上是swappiness修饰符在linux上所做的(如果你想知道什么swappiness参数正在改变,请参阅这篇文章)。
最坏的情况
最糟糕的情况是,当涉及到一个服务器失控和OOMing的时候,是因为它处理I / O请求花费太多时间而不是遵守内存分配请求。 有两个条件可以调用这个标准。
第一个是常见的问题。 也就是说,因为交换内存的内存太多了,所以需要将匿名内存从RAM中交换出来,放回交换中,然后从交换中取出一些内容并将其放入真实的RAM中。 这个操作是非常昂贵的,减慢了机器到可能成为不可恢复的情况的地步(因为更多的东西是排队的页面需求比可以从I / O服务)。
第二个不太重要,但同样重要。 如果将几乎所有的内存分配给实际的应用程序数据 – 你不会持续太久。 几乎每个应用程序都依赖于从文件系统中读取文件来操作,这可能是因为某些指令存在于共享库中,或者因为您需要读/etc/resolv.conf来执行库调用或任何其他目的。 它完全合理的停止一个操作系统 – 但有足够的内存来适应所有的应用程序,但是由于排队这么多的I / O请求没有任何机会可以正确完成。
内核想要与你的交换做什么
内核想要使用你的交换来摆脱那些浪费内存的页面,以便它可以使用那个内存来做其他事情。
基本上,在正常的操作中,内核喜欢用从磁盘读取的数据积极填充页面caching,这意味着它不会读取相同数据的磁盘。 这是很好的devise,可以大量减lessI / O。 现在,可能有一些应用程序坐在内存里睡了3天,醒来,一堆工作又睡了3天。
内核想要对这些数据进行处理的地方是将其交换出去,以便为文件系统活动腾出空间,因为实际使用这些页面的机会要比用于应用程序的页面要高得多。 在这个意义上说,交换可能是一个16kb的交换到你的交换介质,你几乎不会感觉到,但是作为回报,你释放了16kb的内存, 可以用来存储四个值得的数据。
内核不想使用交换
内核肯定不想用swap来分配更多的匿名内存,换掉其他一些匿名内存,这就是人们最担心的情况。
但是我应该指出,如果你分配了太多的内存以至于内核别无select,那么这是系统pipe理员的configuration问题,而不是内核本身 – 它只是试图通过你已经给它的选项!
如果你有一个大量的交换,你增加了使用它的机会?
没有! 如果你有1G的ram和4G交换,那么你的数据就不会有80%的交换机会! 只有当内存中的页面可以更好地服务于其他事情时,内核才想使用交换。
根本不使用交换是有利的
我永远不会这样做。 交换允许操作系统摆脱你需要的内存,但永远不会被使用。 如果你没有交换,你只是吞下内存,你永远不会回头,你可能会看到一个显着的性能改善,通过允许说,页caching来代替它。
什么是最好的互换有
从理论上讲,找出多less常驻内存+ 20%的安全性,比如需要从堆中分配内存的重入库调用 – 然后将交换设置为这个数量。 这(理论上来说)允许操作系统将所有匿名内存交换出来,如果它不得不为更有用的东西让路。
如果我得到内核的机会,换掉一切危险的权利?
请记住,内核不想交换为更多的匿名内存分配让路,它只会换出不使用的页面来支持别的,而不是更好地使用空间。
如果你只交换匿名内存从更多的匿名内存分配,你做错了什么,需要更多的内存或重新调整你的应用程序堆栈。
你需要多lessRAM?
你当然需要允许足够的内存来运行所有的应用程序,但是你可能需要额外的2G内存来填充页面caching – 也许更多。 页面caching使您的计算机速度更快,磁盘寿命更长。 如果你想运行一个web服务器,有更多的页面caching是一个好主意,由于静态内容的数量巨大,你可以检索和重用从pagecache将得到服务(如果您的networking服务器的吞吐量是5mb / s,你真的没有想要检索从磁盘生成的5mb / s内容!)。
如果你真的不相信linux正确地交换,该怎么办
如果你真的担心你可以分配更多的内存比你有:
什么是调整我的记忆我的应用程序的最佳方式
供应商推荐一个不同的configuration..
听取,而是。 一些应用程序的写入方式是故意调用内核使其页面处于活动状态。 说实话这是一个令人讨厌的伎俩,但它破坏了内核在发生内存时无缝pipe理内存的能力。 如果您的供应商提供具体信息,那么他们可能属于这个类别,而是倾听他们的意见。
综上所述
内核通常在pipe理虚拟内存方面做得非常好。 它几乎总是这样的情况,你的应用程序分配更多的内存比你可能希望合作,那是什么造成了一个OOM。
Swap曾经被用作“备用内存”,但它不再是它的主要用途,所以不要这样想。 相反,要明白你的内核可能最好的知道它想要使用你的内存。 给它的空间做出这些决定,你会受益于整体性能的改善。
从文档“RedHat®EnterpriseLinux®5部署build议中的Oracle 10g服务器”。
Oracle在MetaLink说明169706.1中提供了有关交换大小的通用build议。 这些build议可能会导致在具有大量内存的系统上创build非常大的交换空间。 非常大的交换可能会导致服务器系统性能下降,可以通过减less交换空间来解决。 Red Hatbuild议不要在Red Hat Enterprise Linux 5上分配大于4GB的交换空间。
所以对于16GB,你应该有不超过4GB的交换。
PS。 另外值得注意的是,使用整个I / O带宽,被调用的oom几乎总是优于不可用的换出过程。
目前的CentOS交换build议使用公式:
M = Amount of RAM in GB, and S = Amount of swap in GB, then If M < 2 S = M *2 Else S = M + 2
所以对于16G,交换量应该是18G。
见http://www.centos.org/docs/5/html/Deployment_Guide-en-US/ch-swapspace.html
从我记得的Linux文档:如果你的内存大于2GB,那么你做swap =(ramSize + 2)。 如果它less,那么你做swap =(ramSize * 2)
我发现这个文件给你,它应该帮助你做出这个决定,在这里是: 什么是交换空间? ,但是上面的答案都不正确