Linux 内核技术实战课
邵亚方
前蘑菇街技术专家,Linux Kernel 活跃贡献者
23704 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 26 讲
Linux 内核技术实战课
15
15
1.0x
00:00/00:00
登录|注册

01 基础篇 | 如何用数据观测Page Cache?

提升应用的I/O速度
减少I/O
Shmem
SwapCached
File-backed page
Shmem
Inactive(file)
Active(file)
SwapCached
Cached
Buffers
free命令
/proc/meminfo
构造Page Cache并观察数据变化
观测和理解Page Cache的重要性
Page Cache的归属和意义
Page Cache的不足之处
Page Cache的合适性
Page Cache的意义
free命令中的buff/cache
Page Cache的重要部分
Page Cache的构成
观察Page Cache的方式
Page Cache属于内核
课后作业
课堂总结
为什么需要Page Cache?
什么是Page Cache?
如何用数据观测Page Cache

该思维导图由 AI 生成,仅供参考

你好,我是邵亚方。今天我想和你聊一聊 Page Cache 的话题。
Page Cache 你应该不陌生了,如果你是一名应用开发者或者 Linux 运维人员,那么在工作中,你可能遇见过与 Page Cache 有关的场景,比如:
服务器的 load 飙高;
服务器的 I/O 吞吐飙高;
业务响应时延出现大的毛刺;
业务平均访问时延明显增加。
这些问题,很可能是由于 Page Cache 管理不到位引起的,因为 Page Cache 管理不当除了会增加系统 I/O 吞吐外,还会引起业务性能抖动,我在生产环境上处理过很多这类问题。
据我观察,这类问题出现后,业务开发人员以及运维人员往往会束手无策,究其原因在于他们对 Page Cache 的理解仅仅停留在概念上,并不清楚 Page Cache 如何和应用、系统关联起来,对它引发的问题自然会束手无策了。所以,要想不再踩 Page Cache 的坑,你必须对它有个清晰的认识。
那么在我看来,认识 Page Cache 最简单的方式,就是用数据说话,通过具体的数据你会更加深入地理解 Page Cache 的本质。为了帮你消化和理解,我会用两节课的时间,用数据剖析什么是 Page Cache,为什么需要 Page Cache,Page Cache 的产生和回收是什么样的。这样一来,你会从本质到表象,透彻理解它,深切感受它和你的应用程序之间的关系,从而能更好地理解上面提到的四个问题。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文通过数据观测Page Cache,详细解释了Page Cache的概念、产生和回收过程。作者强调了对Page Cache的清晰认识的重要性,并提供了观察Page Cache的方法,包括使用/proc/meminfo、free、/proc/vmstat等命令。通过数据分析,强调了File-backed page和SwapCached的重要性,并提到了使用Direct I/O绕过Page Cache的思路。文章帮助读者深入理解Page Cache的本质和与应用程序的关系,为解决Page Cache引起的问题提供了实用的方法和思路。总的来说,本文以数据分析为主线,帮助读者全面了解Page Cache,为读者提供了深入学习和解决实际问题的思路。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Linux 内核技术实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(34)

  • 最新
  • 精选
  • leslie
    Coding能力有限:不过学过倪鹏飞老师的课,侧重点应当不同吧;PageCache大小的合理设置不知道为何老师不曾提及?单独的去谈代码似乎忘了底层硬件吧。我们说性能是基于硬件去提问,老师单独的去问而不提及硬件基础是否、、、这就像我们去说怎么样去设置软件更合理,不去提及我们硬件的主频和大小以及、、、

    作者回复: pagecache和硬件关系不大,如果说pagecache一定要跟硬件关联起来的话,会有这几方面:一个page有多大,tlb有多大,cache有多大,物理内存多大,磁盘是ssd,hdd还是nvme。page的大小和物理内存的大小决定了pagecache的量,但是你会发现pagecache的回收机制其实是独立于这个量的,也就是,不论它有多少,active和inactive的替换逻辑是不变的。tlb大小和cache大小则影响了pagecache命中与否的性能,但是你会发现相比pagecache miss而言,tlb/cache miss几乎可以忽略不计,这是不同数量级的差异。磁盘介质又决定了pagecache的重要性,如果你的磁盘是hdd,那pagecache对应用的提升会非常明显;如果是nvme,那么pagecache miss后业务的性能下降也不会太明显;但是你会发现,不论磁盘介质是什么,pagecache如果命中的话,它的性能都是数量级的差异。 也就是说,pagecache自身的机制是独立与硬件的,不论你是什么样的硬件,都要尽量保障热数据在内存中,而冷数据则尽量不要占用内存,这就是pagecache机制的核心。 换一个角度而言,不论是x86还是arm,linux都要能工作,而能工作就是linux的本质,这个本质是我们想要讨论的。而不是讨论linux在arm上的工作和x86的工作会有什么差异。

    2020-08-31
    2
    29
  • Geek_lucky_brian
    感觉学习到了很多。请教老师一个问题,如果不做sync而是直接去drop cache,drop期间是不是也会把脏页刷盘呢?如果是的话,那么为什么还要单独做一次sync呢?直接drop cache不就好了吗

    作者回复: dropcache不会清理脏页,只会清理干净的页,所以如果你想清理所有的页的话,是需要在drop前先sync的。

    2020-08-28
    5
    22
  • Dovelol
    老师好,能详细讲一下buffer cache和page cache的区别吗?这两个到底作用在哪的。

    作者回复: buffer可以理解为是一类特殊文件的cache,这类特殊文件就是设备文件,比如/dev/sda1, 这类设备文件的内容被读到内存后就是buffer。而cached则是普通文件的内容被读到了内存。你可以做一个试验,运行下面这个程序,然后观察/proc/meminfo里Buffers和Cached这两项的变化,你会发现增加的是前者。 #include <sys/types.h> #include <stdio.h> #include <stdlib.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #define DEV "/dev/sda1" #define SIZE (1024 * 1024 * 1024) int main() { int fd = open(DEV, O_RDONLY); char *buf; int size; buf = malloc(SIZE); if (!buf) return -1; size = read(fd, buf, SIZE); printf("%d\n", size); while (1) { } return 0; }

    2020-08-21
    6
    22
  • Joe Black
    我们的数据处理算法实际上对超大输入文件是从头到尾读一遍,而且整个程序仅读一遍,这样其实用direct io就行了吧?

    作者回复: 是的。如果只读一遍后续再也不会用到,那确实没有必要还用pagecache,使用direct IO就可以了。而且超大文件读入到内存也会影响其他进程对内存的使用。

    2020-08-23
    16
  • 所以 Page Cache 就是 磁盘的一个缓存区?

    作者回复: 可以理解为是磁盘的缓存,但是它属于内存,不属于磁盘。

    2020-08-23
    5
    8
  • 青鸟飞鱼
    老师,你好,在有些地方看到经过PageCache的Io叫缓存IO,有些地方说是直接IO。不知道缓存IO,直接IO有什么区别吗

    作者回复: 缓存io是指应用在读磁盘文件的时候会先经过缓存(内存),而且直接io则不经过缓存而直接与磁盘交互。

    2020-09-12
    7
  • 金时
    mmap 产生的pageCache 也是内核态的吗

    作者回复: 内核态和用户态是指进程的运行状态 并不能用来表示内存。 应用程序通过mmap系统调用返回的地址空间属于“用户空间”。 mmap的用户空间的地址对应的物理内存则是page cache,这是不同的概念。

    2021-06-21
    2
    5
  • Geek_c2089d
    Swap 过程产生的 I/O 会很容易引起性能抖动不太明白是什么意思?

    作者回复: 因为swap得数据量往往较大,而且发生swap时往往是内存很紧张时,各种因素叠加会导致swap过程非常容易出问题。

    2020-10-15
    4
    4
  • nestle
    老是,第一张图有个地方没太明白,Page Cache是由VFS模块来管理的吗?回写、预读这些操作都是由VFS控制的吗?还是说VFS只负责普通文件I/O呢?

    作者回复: pagecache不是vfs模块来管理的,vfs只是提供了pagecache的一个使用接口,也就是标准io这种接口。pagecache是mm这个模块来管理的,回写和预读主要是涉及到mm和io子系统。

    2020-08-30
    2
    4
  • nuo-promise
    老师, mac 上可以推荐 读linux kernel 的 ide 和 推荐 kernel 源码的版本么?跟着你的教程,然后 课后 源码文件看起来 效果还是不错的

    作者回复: 我在Mac上都是使用Vim+cscope来阅读内核源码,也是很方便的,最主要是这种方式在什么平台上都能用,通用性较好。 至于内核源码,可以紧跟upstream的源码来看,在你遇到一些疑惑时,你可以git blame来查看修改记录,修改记录里一般都会详细说明这么实现的原因。

    2020-09-01
    3
收起评论
显示
设置
留言
34
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部