如何用数据观测Page Cache?

什么是 Page Cache?

如何用数据观测Page Cache?_第1张图片

 应用程序产生Page Cache的逻辑示意图

通过这张图片你可以清楚地看到,红色的地方就是 Page Cache,很明显,Page Cache是内核管理的内存,也就是说,它属于内核不属于用户。

那咱们怎么来观察 Page Cache 呢?其实,在 Linux 上直接查看 Page Cache 的方式有很多,包括 /proc/meminfo、free 、/proc/vmstat 命令等,它们的内容其实是一致的。

我们拿 /proc/meminfo 命令举例看一下(如果你想了解 /proc/meminfo 中每一项具体含义的话,可以去看  Kernel Documentation的 meminfo 这一节,它详细解释了每一项的具体含义,Kernel Documentation 是应用开发者想要了解内核最简单、直接的方式)。

$ cat /proc/meminfo
...
Buffers:1224 kB
Cached:111472 kB
SwapCached:36364 KB
Active:6224232 kB
Inactive:979432 kB
Active(anon):6173036 kB
Inactive(anon):927932 kB
Active(file):51196 kB
Inactive(file):51500 kB
...
Shmem:10000 kB
SReclaimable:43532 kB

根据上面的数据,你可以简单得出这样的公式(等式两边之和都是 112696 KB):

Buffers + Cached + SwapCached = Active(file) + Inactive(file) + Shmem +SwapCached

那么等式两边的内容就是我们平时说的 Page Cache。请注意你没有看错,两边都SwapCached,之所以要把它放在等式里,就是说它也是 Page Cache 的一部分。

接下来,我带你分析一下这些项的具体含义。等式右边这些项把 Buffers 和 Cached 做了一下细分,分为了 Active(file),Inactive(file) 和 Shmem,因为 Buffers 更加依赖于内核实现,在不同内核版本中它的含义可能有些不一致,而等式右边和应用程序的关系更加直接,所以我们从等式右边来分析。

在 Page Cache 中,Active(file)+Inactive(file) 是 File-backed page(与文件对应的内存页),是你最需要关注的部分。因为你平时用的 mmap() 内存映射方式和 buffered I/O来消耗的内存就属于这部分,最重要的是,这部分在真实的生产环境上也最容易产生问题,我们在接下来的案例会重点分析它。

而 SwapCached 是在打开了 Swap 分区后,把 Inactive(anon)+Active(anon) 这两项里的匿名页给交换到磁盘(swap out),然后再读入到内存(swap in)后分配的内存。由于读入到内存后原来的 Swap File 还在,所以 SwapCached 也可以认为是 File-backed page,即属于 Page Cache。这样做的目的也是为了减少 I/O。你是不是觉得这个过程有些复杂?我们用一张图直观地看一下:

如何用数据观测Page Cache?_第2张图片

 我希望你能通过这个简单的示意图明白 SwapCached 是怎么产生的。在这个过程中你要注意,SwapCached 只在 Swap 分区打开的情况下才会有,而我建议你在生产环境中关闭Swap 分区,因为 Swap 过程产生的 I/O 会很容易引起性能抖动。

//未完待续.....

你可能感兴趣的:(#,性能/内存管理,性能优化,内存)