什么是 Page Cache?为什么需要 Page Cache?

page(与文件对应的内存页),是你最需要的部分。tmpfs(临时文件系统),这部分在真实的生产环境中产生的问题比较少。这三项组成的,它强调的是内存的可回收性,也就是说,可以被回收的内存会统计在这一项。清空,确保文件内容不在内存中,以此来比

应用程序产生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):

+ + = (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 free buff/cache

Mem: 10000 43068

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 速度。

本文到此结束,希望对大家有所帮助。

本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至81118366@qq.com举报,一经查实,本站将立刻删除。发布者:简知小编,转载请注明出处:https://www.jianzixun.com/78919.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫

相关推荐

软文友链广告合作联系站长qq81118366