应用程序产生Page Cache的逻辑示意图
红色的地方就是 Page Cache,很明显,Page Cache是内核管理的内存,也就是说,它属于内核不属于用户 。
如何观察 Page Cache? 在 Linux 上直接查看 Page Cache 的方式有很多,包括 /proc/、free 、/proc/ 命令等 , 它们的内容其实是一致的 。拿 /proc/ 命令举例看一下:
$ cat /proc/
…
: 1224 kB
:kB
: 36364 kB
:kB
:kB
(anon):kB
(anon):kB
(file): 51196 kB
(file): 51500 kB
…
Shmem: 10000 kB
…
: 43532 kB
根据上面的数据,你可以简单得出这样的公式(等式两边之和都是KB):
【什么是 Page Cache?为什么需要 Page Cache?】 ++= (file) + (file) + Shmem +
那么等式两边的内容就是我们平时说的 Page Cache 。请注意你没有看错 , 两边都有Swap ,之所以要把它放在等式里,就是说它也是 Page Cache 的一部分 。等式右边这些项把和做了一下细分,分为了 (file),(file) 和 Shmem,因为更加依赖于内核实现,在不同内核版本中它的含义可能有些不一致,而等式右边和应用程序的关系更加直接数据库映射文件系统,所以我们从等式右边来分析.
在 Page Cache 中,(file)+(file) 是 File- page(与文件对应的内存页),是你最需要的部分 。因为你平时用的 mmap() 内存映射方式和I/O来消耗的内存就属于这部分,最重要的是,这部分在真实的生产环境上也最容易产生问题 , 我们在接下来的课程案例篇会重点分析它 。
而是在打开了 Swap 分区后,把 (anon)+(anon) 这两项里的匿名页给交换到磁盘(swap out)数据库映射文件系统,然后再读入到内存(swap in)后分配的内存 。由于读入到内存后原来的 Swap File 还在,所以也可以认为是 File- page,即属于 Page Cache 。这样做的目的也是为了减少 I/O 。
通过下面简单的示意图明白是怎么产生的:
只在 Swap 分区打开的情况下才会有 , 而我建议你在生产环境中关闭 Swap 分区,因为 Swap 过程产生的 I/O 会很容易引起性能抖动 。
Page Cache 中的 Shmem 是指匿名共享映射这种方式分配的内存(free 命令中这一项),比如 tmpfs(临时文件系统) , 这部分在真实的生产环境中产生的问题比较少 。
free 命令中的 buff/cache 究竟是指什么呢?
free 命令也是通过解析 /proc/ 得出这些统计数据的,这些都可以通过 free 工具的源码来找到 。free 命令的源码是开源,你可以去看下 里的 free.c 文件,源码是最直接的理解方式,它会加深你对 free 命令的理解 。
$ free -k
total used freebuff/cache
Mem:1000043068
Swap:
通过源码里面的proc/.c这个文件,你可以发现 buff/cache 包括下面这几项:
buff/cache =++
通过前面的数据我们也可以验证这个公式: 1224 ++ 43532 的和是。
free 命令中的 buff/cache 是由 、 和这三项组成的,它强调的是内存的可回收性,也就是说,可以被回收的内存会统计在这一项 。
是指可以被回收的内核内存,包括和 inode 等 。
掌握了 Page Cache 具体由哪些部分构成之后,在它引发一些问题时,你就能够知道需要去观察什么 。比如说,应用本身消耗内存(RSS)不多的情况下,整个系统的内存使用率还是很高,那不妨去排查下是不是 Shmem(共享内存) 消耗了太多内存导致的 。
为什么需要 Page Cache?
第一张图你其实已经可以直观地看到,标准 I/O 和内存映射会先把数据写入到 Page Cache,这样做会通过减少 I/O 次数来提升读写效率 。
看一个具体的例子 。首先,我们来生成一个 1G 大小的新文件,然后把 Page Cache 清空 , 确保文件内容不在内存中,以此来比较第一次读文件和第二次读文件耗时的差异 。具体的流程如下 。
先生成一个 1G 的文件:
dd if = /dev/zero of = /home/test/dd.outbs = 4096 count = ((1024*256))
2 . 清空 Page Cache,需要先执行一下 sync 来将脏页同步到磁盘再去 drop cache 。
sync && echo 3 > /proc/sys/vm/
3 . 第一次读取文件的耗时如下:
$ time cat /home/test/dd.out &> /dev/null
real 0m5.733s
user 0m0.003s
sys 0m0.213s
再次读取文件的耗时如下:
$ time cat /home/test/dd.out &> /dev/null
real 0m0.132s
user 0m0.001s
sys 0m0.130s
第二次读取文件的耗时远小于第一次的耗时 , 这是因为第一次是从磁盘来读取的内容,磁盘 I/O 是比较耗时的 , 而第二次读取的时候由于文件内容已经在第一次读取时被读到内存了,所以是直接从内存读取的数据,内存相比磁盘速度是快很多的 。这就是 Page Cache 存在的意义:减少 I/O,提升应用的 I/O 速度 。
本文到此结束,希望对大家有所帮助 。
- 你会用F4键吗?
- 前端为什么弃用jQuery?有这六个原因
- 龙族幻想尼德霍格之怒怎么获得?尼德霍格之怒获取途径是什么?
- 同为PM,项目经理和产品经理哪个才是未来的CEO?
- ?火鸡是什么鸡
- ?花开荼蘼下一句是什么
- 关于耳顺之龄的详细介绍 ?耳顺是什么年龄
- 轻诺必寡信含义讲解和使用场合 ?轻诺必寡信什么意思
- ?二胎还是女儿,自己也接受不了怎么办
- 楼梯开间和进深是什么意思