关于 free、available 和 buff/cache 的说明,以及如何在命令“free -mh”中查找服务器中 buff/cache 保存的进程

关于 free、available 和 buff/cache 的说明,以及如何在命令“free -mh”中查找服务器中 buff/cache 保存的进程

我看到 free -mh 的解释为:

free 显示系统中空闲和已用物理内存和交换内存的总量,以及内核使用的缓冲区和高速缓存。通过解析 /proc/meminfo 收集信息。显示的列是:

   total  Total installed memory (MemTotal and SwapTotal in
          /proc/meminfo)

   used   Used memory (calculated as total - free - buffers - cache)

   free   Unused memory (MemFree and SwapFree in /proc/meminfo)

   shared Memory used (mostly) by tmpfs (Shmem in /proc/meminfo)

   buffers
          Memory used by kernel buffers (Buffers in /proc/meminfo)

   cache  Memory used by the page cache and slabs (Cached and
          SReclaimable in /proc/meminfo)

   buff/cache
          Sum of buffers and cache

   available
          Estimation of how much memory is available for starting
          new applications, without swapping. Unlike the data
          provided by the cache or free fields, this field takes
          into account page cache and also that not all reclaimable
          memory slabs will be reclaimed due to items being in use
          (MemAvailable in /proc/meminfo, available on kernels 3.14,
          emulated on kernels 2.6.27+, otherwise the same as free)

有时,我看到空闲内存被分配给缓冲区/缓存内存。如果内存利用率很高,甚至可用内存非常低,我可以在“top”的帮助下看到进程占用了大量内存。

但是,当我有足够的“可用内存”时,如何知道“空闲”中的哪些内存分配给“缓冲区/缓存”。有没有办法检查它被保存到哪个进程?

root@server_test:~# free -mh
              total        used        free      shared  buff/cache   available
Mem:            29G         24G        359M        398M        4.2G        3.5G
Swap:            0B          0B          0B

问候, 泰托

答案1

据我了解,“空闲”显示的缓冲/缓存可以是一个非常大的数字,而无需内存属于到任何进程。因此,在这种情况下,您不会看到大量内存被分配给一个进程,如通过 top 或 ps 看到的那样。

也就是说,buff/cache可以用作文件系统缓存。当从磁盘读取文件(或文件的一部分)(速度较慢)时,数据将保存在内存缓存中(速度较快)。我认为操作系统内核不会跟踪导致数据被放入缓存的进程。

例如,为了测试这个理论,您可以清空 buff/cache(或大部分),然后让一个进程(例如 cat)读取一个非常大的文件。一旦进程(cat)读完文件就会退出,进程就不再存在了。但是,您可能会注意到您的 buff/cache 值已增加了大约读取文件的大小。因此,在这种情况下,cat 进程导致该数据被添加到缓存中,但 cat 进程并不“拥有”数据现在(暂时)驻留的内存中的缓存页。

答案2

如果相关程序在自己的控制组中运行,那么也许您可以使用

cd /sys/fs/cgroup
find -name memory.stat -exec grep -HE '^(file|cache) ' | sort -nk 2

请注意,我很确定缓存的每一页仅占一个 cgroup。即使多个 cgroup 使用同一页缓存。

相关内容