free 输出中的 buffers/cache 行的含义

free 输出中的 buffers/cache 行的含义

为什么我的服务器显示

            total      used      free   shared buffers    cached
    Mem: 12286456  11715372    571084        0   81912   6545228
-/+ buffers/cache:  5088232   7198224
   Swap: 24571408     54528  24516880

我不知道如何在 Linux 中计算内存。我认为它说使用了 5088232,而 7198224 是空闲的,这意味着它实际上消耗了 5GB 的 RAM?

答案1

值的含义

第一行的意思是:

  • total:您的总(物理)RAM(不包括内核在启动时为自己永久保留的一小部分);这就是为什么它显示约 11.7 GiB 而不是 12 GiB(您可能拥有的)。

  • used:操作系统正在使用的内存。

  • free:内存未使用。

  • shared// bufferscached这显示了特定用途的内存使用情况,这些值包含在的值中used

第二行给出了第一行调整后的值。它给出了used 总和buffers+cached和原始值free 总和buffers+cached,因此得名。这些新值通常比第一行的更有意义。

最后一行(Swap:)提供有关交换空间使用情况的信息(即已临时移动到磁盘的内存内容)。

背景

要真正理解这些数字的含义,您需要了解一些有关 Linux 中的虚拟内存 (VM) 子系统的背景知识。简短来说:Linux(与大多数现代操作系统一样)将始终尝试使用空闲 RAM 来缓存内容,因此内存Mem: free几乎总是很低。因此-/+ buffers/cache:显示该行,因为它显示了忽略缓存时有多少内存可用;如果内存不足,缓存将自动释放,因此它们实际上并不重要。

free如果行中的值-/+ buffers/cache:很低,则表明 Linux 系统的内存确实不足。

有关数字含义的更多详细信息,请参见以下问题:

procps 3.3.10 中的变化

请注意,procps 3.3.10(2014 年发布)中的输出free已更改。报告的列现在是“总计”、“已使用”、“空闲”、“共享”、“缓冲/缓存”、“可用”,并且一些值的含义发生了改变,主要是为了更好地解释Linux内核的slab缓存。

Debian 错误报告 #565518动机,以及free从 14.04 到 16.04 的输出变化意味着什么?了解更多详细信息。

答案2

目前接受的2009 年的答案已过期。务必确保您获取的信息正确无误,并且与版本相匹配free(Debian 软件包中分发的版本procps或发行版中的等效版本)。查看man free,并且man 5 proc,其中包含有关在 Linux 上从何处获取数据的/proc/meminfo文件的信息。free

默认情况下,free的输出为千字节(1 kibibyte = 1024 字节),如手册页所示。我更喜欢使用-h显示后缀的参数,如下所示:

$ free -h
              total        used        free      shared  buff/cache   available
Mem:           15Gi       6.1Gi       1.9Gi       301Mi       7.5Gi       8.8Gi
Swap:         979Mi          0B       979Mi

第一行的Mem意思是:

  • total(Mem):总安装内存(即MemTotal/proc/meminfo),这是 RAM 中的所有内存
  • used(Mem):已用内存,等于total - free - buffers - cache
  • free(Mem):未使用的内存(即MemFree),这是 RAM 中所有未用于任何用途(甚至缓存)的内存
  • shared(Mem):这是主要用于tmpfsShmem
  • buff/cache(Mem),和的buffers总和cache
    • buffers:内核缓冲区使用的内存(Buffers),这是内核可以利用的内存
    • cache:页面缓存和 slabs 使用的内存(CachedSReclaimable)。页面缓存包含文件系统中缓存到 RAM 的文件内容,通常这个数字越大越好。我推测“slabs”也是一种类似的缓存功能。
  • available(Mem):这是启动新应用程序时可用的内存量的估计值(不包括交换)。它包括字段中计算的大部分内存cache(因为可以删除页面缓存以启动新应用程序),但不计算交换(因为通常最好不要使用速度较慢的交换空间)。

第二行是Swap。这是我的解释:

  • total(交换):这是为交换保留的磁盘空间总量(SwapTotal在 中proc/meminfo)。您可以通过检查它是否与 的输出匹配来检查swapon -s
  • used(交换):当前正在使用的交换磁盘空间量。同样,您可以通过将其与以下输出进行比较来检查swapon -s
  • free(交换):当前未使用的交换磁盘空间量(SwapFree/proc/meminfo)。它等于total (Swap) - used (Swap)

答案3

缓冲区/缓存行显示程序使用了多少内存(第一列),以及可供程序使用的空闲内存量(第二列)。这是一个相当深奥的数字,在实践中你不会真正关注它。

答案4

接受的答案和更多 Flimm 的答案非常清楚,但缺少一个细节,大概是因为大多数人不会使用大量共享内存。由于我没有足够的代表来发表评论,我添加了另一个答案:

以下是 RHEL 7 系统(procps 3.3.10)上的输出free -g。可以看到buff/cache 不仅仅是缓冲区和缓存内存,因为否则数字就无法加起来available:当 388Gb 用于缓存时,怎么可能只有 231Gb 可用于新进程的内存?

              total        used        free      shared  buff/cache   available
Mem:            755         349          17         172         388         231
Swap:            62           0          62

实际上buff/cache包括shared(我想说命名​​不当)。除了相关内核提交然而available = buff|cache + free - shared(这里不涉及交换)根据我的经验,或多或少是成立的。这在本文间接描述了RedHat 文章和:

缓存:页面缓存中的内存(磁盘缓存和共享内存)

一个重要的推论是,在大量使用共享内存的系统上,used并不是buff/cache了解内存消耗的最佳数据,而是available更可靠——因为共享内存是不可回收的。它可能要低得多!

因此,以 Flimm 的列表为基础,可以进行以下操作:

  • total:可用于内存分配的整体 RAM(即MemTotal来自/proc/meminfo
  • used:已用内存,等于total - free - buff|cache
  • free:未使用内存(即MemFree),这是 RAM 中所有未用于任何用途(甚至缓存)的内存。内核喜欢将其设置为接近零。
  • shared:tmpfs 使用的内存量,主要是共享内存(/dev/shmem
  • buff/cache,总和:
    • buffers:内核缓冲区使用的内存(通常很小)
    • cache:页面缓存,将文件系统中的文件内容缓存到 RAM 中,而且还有正在使用的共享内存页面. 还包括SReclaimable(内核缓存结构,“slab”的一部分)
  • available:新进程可用的内存,似乎大致等于buff|cache + free - shared。这是“真正”的可用内存。

相关内容