在我的 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 -s
说549176 K swap cache
,而cat /proc/meminfo
说SwapCached: 0 kB
。
我的问题是:
- 是什么意思
swap cache
? - 是什么意思
SwapCached
? - 它们是一样的吗?如果不是,它们之间有什么区别?
答案1
有两个命令和两个文件。
]# free -V; vmstat -V
free from procps-ng 3.3.15
vmstat from procps-ng 3.3.15
Proc 文件:meminfo
和vmstat
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/meminfo
Cached
Slab
- 这意味着它大约是文件缓存加上索引节点缓存加上目录缓存加上额外对象的缓存。
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
(它将交换视为任何其他“缓存”文件;这个术语与其他计数器/工具完全不兼容)。