CentOS 16GB RAM 需要多少 SWAP?

11 centos swap

在双四核 XEON 上安装 CentOS 时,您会给多少 SWAP,该双核 XEON 具有 16GB 的 RAM,它将运行一个带有 mysql 后端的 php 网站 - 中等/重负载?

小智 20

不超过一两场演出——你需要一点点交换,以防万一,因为它可以帮助事情更好地工作,但是如果你到了大量交换的地步,机器就会运转毫无用处——而且在真正的灾难性情况下,您实际上最好使用较小的交换空间,因为那样您迟早会触发 OOM 杀手。

  • 请记住,如果需要,您可以随时添加更多交换空间,方法是通过腾出一些空间并创建新卷(如果使用 LVM)或使用文件作为交换,例如`dd if=/dev/zero of=swap。文件 bs=1024 计数=1048576;mkswap 交换文件;swapon 交换文件` (7认同)
  • 作为旁注,您可以通过调整 /proc/sys/vm/swappiness 值来控制交换的程度。 (3认同)
  • 我将不得不不同意这里的几点。. . 首先,磁盘很便宜,你不妨在它上面扔几 GB。其次,如果你不走运,O​​OM 杀手可以拿下你的整个盒子。以*任何*方式依赖它或考虑更好地触发OOM杀手是一个非常糟糕的主意。认为潜在的软管盒比潜在的减速要好也是一个坏主意。唯一合理的时间是如果您针对这种情况计划了非常具体的设置。 (2认同)

Mat*_*Ife 8

我为很长的答案道歉。一段时间以来,我一直想把这些东西放在可以访问的地方!

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

如果你留在我身边,我会试着解释。

关于虚拟内存

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

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

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

对于存储器管理的目的,存储器分配备份以某种形式或另一由一个支撑装置。

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

从内核的角度来看,这个内存的好处是它是一次性的,也就是说,如果您需要内存用于其他用途,应该可以转储这些页面,如果突然需要内存,这正是页面缓存所做的。

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

现在,内核知道当内存不足时,将文件支持的内存丢弃为匿名映射的内存要便宜得多,那是因为匿名数据比文件支持的数据“脏”的可能性要高得多,实际上默认情况下内核将匿名支持的内存评为比文件支持的内存贵 80 倍,这实际上是 swappiness 修饰符在 linux 上所做的(如果您想知道 swappiness 参数究竟在改变什么,请参阅此处的这篇文章)。

最坏的情况

当涉及到服务器失控和 OOM 时,最糟糕的情况是基于这样一个事实,即它花费太多时间处理 I/O 请求而不是执行内存分配请求。有两个条件可以调用此标准。

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

第一个,是普遍认为的问题。也就是说,由于如此多的内存存在于交换中,因此需要将匿名内存从 RAM 中交换出来,将其放回交换中,然后从交换中取出一些内容并将其放入真实 RAM。此操作非常昂贵,会降低机器的速度,使其无法恢复(因为页面需求排队的内容比 I/O 可以提供的内容多)。

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

内核想用你的交换做什么

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

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

内核想用这些数据做的事情是将其交换出来,为文件系统活动腾出空间,因为与用于应用程序的页面相比,您实际使用这些页面的机会要高得多。从这个意义上说,交换可能是对交换媒体的 16kb 事务,您几乎感觉不到,但作为回报,您释放了 16kb 的内存,用于存储四个文件的数据。

内核不想将交换用于什么

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

但是,我应该指出,如果您分配了如此多的内存,以至于内核别无选择,只能这样做,这是系统管理员的配置问题,而不是内核本身——它只是试图做到最好你给它的选择!

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

不!如果您有 1G 的内存和 4G 的交换空间,那么您的数据被交换的可能性就没有 80%!只有当内存中的页面可以更好地做其他事情时,内核才想要使用交换!

根本不使用交换是否有利

我永远不会这样做。交换允许 O/S 摆脱您需要但从未使用过的内存。如果你没有交换区,你只会吞下你永远不会回来的内存,为此你可能会看到显着的性能提升,比如允许页面缓存拥有它。

最好的交换是什么

从理论上讲,为了安全性(例如必须从堆分配内存的可重入库调用),找出多少常驻内存 +20% - 然后将交换设置为该数量。如果必须为更有用的东西让路,这将(理论上无论如何)允许操作系统交换所有匿名内存。

如果我有机会换掉所有危险的东西,对吗?

请记住,内核并不想通过交换来为更多的匿名内存分配让路,它只会交换出不使用的页面来支持其他可以更好地利用空间的页面。

如果您交换匿名内存只是为了从更多匿名内存中分配,那么您做错了并且需要更多 RAM 或无论如何都要重新调整您的应用程序堆栈。

你需要多少内存

当然,您需要允许足够的 RAM 来运行所有应用程序,但您可能应该允许额外的 2G RAM 用于页面缓存——也许更多。页面缓存使您的计算机速度更快,磁盘使用时间更长。如果您考虑运行网络服务器,那么为页面缓存设置更多内容是个好主意,因为您可以从将要提供的页面缓存中检索和重用大量静态内容(如果您的网络服务器吞吐量为 5mb/s,您真的没有毕竟想要检索您从磁盘生成的 5mb/s 内容!)。

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

如果您真的担心,您可以分配比您拥有的更多的内存:

  • 将您的交换金额设置为不超过您的 RAM
  • 将 /proc/sys/vm/overcommit_memory 设置为 2
  • 将 /proc/sys/vm/overcommit_ratio 设置为一个永远不会超过物理 RAM 限制的值。请参阅内核文档以计算出该数字对您来说是多少。

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

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

供应商建议使用不同的配置。

听那个。某些应用程序的编写方式是它们故意调用内核以使它们的页面比所有其他页面都处于活动状态。老实说,这是一个令人讨厌的技巧,但它会破坏内核在发生这种情况时无缝管理内存的能力。如果您的供应商向您提供了具体信息,那么他们很可能属于这一类,而是听取他们的意见。

总之

  • Swap 旨在用作放置浪费内存的地方。不是“备用内存”
  • 拥有大量交换对您使用它的机会没有任何影响。
  • 内核真的想阻止您访问磁盘以获取数据。这与交换空间一样适用于页面缓存。
  • 内核将尽最大努力尊重您为运行的应用程序提供的设置。但是如果你有 500 个 apache 孩子都占用了 32M 的内存,那么不要感到惊讶。那是您选择的配置的错误,而不是内存管理的错误。

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

Swap 曾经被用作“备用内存”,但它不再是它的主要用途,所以不要想那样使用它。相反,要感谢您的内核可能最了解它想将您的内存用于什么目的。给它空间来做出这些决定,你将从整体性能的改进中受益。