vmstat 的“交换缓存”与 /proc/meminfo 的“SwapCached”

vmstat 的“交换缓存”与 /proc/meminfo 的“SwapCached”

在我的 Fedora 24 上,我执行了两个命令来检查内存信息,但是,我得到了关于交换缓存大小的两个不同结果。

第一条命令如下:

[root@localhost ~]# vmstat -s
      4029004 K total memory
      1043700 K used memory
       742144 K active memory
       321916 K inactive memory
      2372500 K free memory
        63628 K buffer memory
       549176 K swap cache
      4063228 K total swap
            0 K used swap
      4063228 K free swap
      ......

第二条命令如下:

[root@localhost ~]# cat /proc/meminfo
MemTotal:        4029004 kB
MemFree:         2369712 kB
MemAvailable:    2690460 kB
Buffers:           63720 kB
Cached:           437460 kB
SwapCached:            0 kB
......

请注意:vmstat -s549176 K swap cache,而cat /proc/meminfoSwapCached: 0 kB

我的问题是:

  1. 是什么意思swap cache
  2. 是什么意思SwapCached
  3. 它们是一样的吗?如果不是,它们之间有什么区别?

答案1

有两个命令和两个文件。

]# free -V; vmstat -V
free    from procps-ng 3.3.15
vmstat  from procps-ng 3.3.15

Proc 文件:meminfovmstat

Free 的联机帮助页解释了 meminfo 字段。其中一些字段也是间接计算的。

vmstat仅添加一些 /proc/vmstat 字段。

/proc/vmstat具有更系统(且更长)的结构。这是神秘的四行页面缓存被提到

nr_anon_pages   212687
nr_mapped        70247
nr_file_pages   887005
nr_dirty            64

现在这些字符串与 mmzone.h 中的枚举列表相比非常弱,带有注释:

NR_ANON_MAPPED, /* Mapped anonymous pages */
NR_FILE_MAPPED, /* pagecache pages mapped into pagetables. only modified from process context */
NR_FILE_PAGES,
NR_FILE_DIRTY,

(首先是 4 行 ANON 和 FILES 以及 ACTIVE 和 INACTIVE 的组合)


所以你的第二个不是命令,而是命令所依赖的 proc 文件的内容。


fs/proc/meminfo.c:

    cached = global_node_page_state(NR_FILE_PAGES) -
                    total_swapcache_pages() - i.bufferram;
    if (cached < 0)
            cached = 0;

这说明没有自己的“缓存”计数器,并且必须对其进行健全性检查。它基本上是所有“文件页面”,无论是活动的还是非活动的,并进行了一些更正。

i.buffers被添加回“buff/cache”字段free

这部分(/proc/meminfo 内容)显示了如何将值收集在一起。i是一个 sysinfo 结构体。缓存和可用是之前计算的。 page[] 数组非常类似于 /proc/vmstat,也通过该区域页面调用进行 Mlocked。

    show_val_kb(m, "MemTotal:       ", i.totalram);
    show_val_kb(m, "MemFree:        ", i.freeram);
    show_val_kb(m, "MemAvailable:   ", available);
    show_val_kb(m, "Buffers:        ", i.bufferram);
    show_val_kb(m, "Cached:         ", cached);
    show_val_kb(m, "SwapCached:     ", total_swapcache_pages());
    show_val_kb(m, "Active:         ", pages[LRU_ACTIVE_ANON] +
                                       pages[LRU_ACTIVE_FILE]);
    show_val_kb(m, "Inactive:       ", pages[LRU_INACTIVE_ANON] +
                                       pages[LRU_INACTIVE_FILE]);
    show_val_kb(m, "Active(anon):   ", pages[LRU_ACTIVE_ANON]);
    show_val_kb(m, "Inactive(anon): ", pages[LRU_INACTIVE_ANON]);
    show_val_kb(m, "Active(file):   ", pages[LRU_ACTIVE_FILE]);
    show_val_kb(m, "Inactive(file): ", pages[LRU_INACTIVE_FILE]);
    show_val_kb(m, "Unevictable:    ", pages[LRU_UNEVICTABLE]);
    show_val_kb(m, "Mlocked:        ", global_zone_page_state(NR_MLOCK));

交换缓存man free 调用的是缓存:

缓存:使用的内存页面缓存和平板(在 /proc/meminfo 中缓存和 SReclaimable)

因为(简化的,见上文):

cached = NR_FILE_PAGES - total_swapcache_pages()

...与 SwapCached 有一个有趣的关系。如果名字不那么混乱就好了。


什么交换缓存用于磁盘上的文件,交换缓存适用于交换设备上的 ANON 页面。 (我希望这是有道理的/不是完全错误的)

答案2

vmstat字段中是字段和cache的总和。cat /proc/meminfoCachedSlab

  • 这意味着它大约是文件缓存加上索引节点缓存加上目录缓存加上额外对象的缓存。
  • swap cache中调用相同的字段vmstat -s
  • 该领域有没有什么, 零, nil 与交换有关。这是一个用词不当的情况,这种情况经常发生。
  • 要从cat /proc/vmstat字段计算此值,请使用:

swap cache = nr_file_page + nr_slab_reclaimable + nr_slab_unreclaimable - meminfo_SwapCached

从 来看/proc/meminfo,该字段SwapCached是不相关的;它与任何磁盘缓存或slab缓存无关。这是干净内存页面中还存在多少交换。

似乎唯一将文件缓存与交换混合在一起的计数器是nr_file_page(它将交换视为任何其他“缓存”文件;这个术语与其他计数器/工具完全不兼容)。

相关内容