为什么我的服务器显示
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
//buffers
:cached
这显示了特定用途的内存使用情况,这些值包含在的值中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):这是主要用于tmpfs
(Shmem
)buff/cache
(Mem),和的buffers
总和cache
:buffers
:内核缓冲区使用的内存(Buffers
),这是内核可以利用的内存cache
:页面缓存和 slabs 使用的内存(Cached
和SReclaimable
)。页面缓存包含文件系统中缓存到 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
。这是“真正”的可用内存。