04 案例篇 | 如何处理Page Cache容易回收引起的业务性能问题?
该思维导图由 AI 生成,仅供参考
对 Page Cache 操作不当产生的业务性能下降
内核机制引起 Page Cache 被回收而产生的业务性能下降
如何避免 Page Cache 被回收而引起的性能问题?
课堂总结
课后作业
- 深入了解
- 翻译
- 解释
- 总结
本文介绍了Page Cache在Linux系统中的重要性以及可能导致业务性能下降的问题。文章从误操作和内核机制两个方面分析了Page Cache容易回收引起的业务性能问题。误操作包括使用drop_cache清理Page Cache可能导致负面影响,特别是在清理inode时会影响Page Cache。内核机制在内存紧张时会触发内存回收,可能导致回收inode和相应的Page Cache,进而影响业务性能。文章提供了观察和解决这类问题的方法,如通过/proc/vmstat观察内存事件,以及谨慎执行drop_cache等。此外,还介绍了通过mlock(2)和memory cgroup protection来保护重要数据的机制。最后,强调了对于不直观的问题也需要重视,并提出了课后作业。整体而言,本文深入浅出地介绍了Page Cache回收问题及解决方法,对需要关注Page Cache对业务性能影响的读者具有重要参考价值。
2020-08-27给文章提建议
《Linux 内核技术实战课》,新⼈⾸单¥59
全部留言(20)
- 最新
- 精选
- 邵亚方置顶课后作业答案: - 进程调用 mlock() 来保护内存,然后进程没有运行 munlock() 就退出了,在进程退出后,这部分内存还被保护吗,为什么? 这部分内容就不被保护了,评论区里有人已经给出了文档里的解释: Memory locks are not inherited by a child created via fork(2) and are automatically removed (unlocked) during an execve(2) or when the process terminates. https://man7.org/linux/man-pages/man2/mlock.2.html2020-10-1110
- 奔跑的熊老师您好,如何观察单个应用的page cache?
作者回复: 通过lsof可以查看某个应用打开的文件,然后再使用fincore可以看这些文件有多少内容在pagecache。 或者应用程序里直接调用mincore也可以查看page cache有多少。
2020-10-02218 - Geek_162e2a思考题: 在进程退出之后,此部分内存不会再被保护 为什么呢,文档是这么说的������ Memory locks are not inherited by a child created via fork(2) and are automatically removed (unlocked) during an execve(2) or when the process terminates. https://man7.org/linux/man-pages/man2/mlock.2.html
作者回复: 是的 赞!
2020-08-2829 - ray老师您好,请问 如果使用echo 2 > /proc/sys/vm/drop_caches释放slab objects (includes dentries and inodes)也会释放掉page cache,那这条指令和单纯释放page cache的echo 1 > /proc/sys/vm/drop_caches指令的区别又在哪里呢? 谢谢老师的解答^^
作者回复: echo 2会去尝试释放所有可以回收的slab,但是它释放inode的过程中也会释放inode的page cache,其实这个行为在我看来是不合理的,如果inode上面有page cache就不应该被释放,目前内核社区也在针对这个行为做改进,预计它很快会被修改。另外还有很多inode是不可以被释放的,那这部分inode里的page cache也不会被释放。 echo 1则只是释放page cache,而不去释放slab,而且在释放pagecache的过程中也不会去考虑inode的情况,也就是说echo 2中有些不会释放的pagecache在这种方式里会被释放。
2020-08-284 - 从远方过来老师,我有几个疑问: 1. 扫描比例是怎么设置的?和zoneinfo里面的min,low,high有什么的联系么? 2. “回收到足够的内存” 是指回收到high水位还是满足这一次内存分配就停止了?
作者回复: 1. 扫描比例是在内核里面配置好的 用户无法调整,第一次扫描1/12,第二次扫描1/11,一直到最后一次扫描全部。通过调整内存水位最终就会体现在zoneinfo里的min low high里面,这几个值也是内核根据内存情况来动态调整的。 2. 如果是直接回收,那只需要会收到满足需求的内存就可以了;如果是kswapd回收,那会一直回收到high水位。
2020-08-273 - Linuxer请问一下邵老师,我看memory cgroup中相关的参数是这些 memory.kmem.limit_in_bytes,memory.kmem.max_usage_in_bytes,memory.usage_in_bytes,memory.soft_limit_in_bytes,memory.memsw.usage_in_bytes.memory.memsw.max_usage_in_bytes请问跟文章中memory.max, memory.high这些是怎么对应的呢?
作者回复: 这是cgroup1的memcg参数,memory.high和memory.max在原生内核里只在cgroup2中有,如果你们用的是cgroup1 就无法使用这几个参数了。我们在自己的内核里在cgroup1里也添加了high max这些参数,你们也可以考虑添加下。
2020-11-031 - 青鸟飞鱼老师,你好,有个疑问,memory cgroup 来对它们进行保护,如何保证我要保护的数据是放在里面的呢?
作者回复: 把进程放在memory cgroup中,然后进程读写的文件内容都属于这个memory cgroup中;如果进程读写文件后,再把它放在memory cgroup中,那么文件内容不会属于这个memory cgroup。所以要注意顺序。
2020-09-201 - 坚老师好,我查看了一下 zoneinfo 其中 pages free=4497,但是min low hight 分别为5 6 7 ,三者设置得这么接近,有这么小,是否会有什么问题呢?
作者回复: 这要看具体是什么zone,如果是dma zone的话,由于本身这个zone里的内存较少,所以水位小也是正常的。 min low high其实是等差数列,这个差值就主要是由zone的大小来决定的。
2020-09-021 - Geek1560老师好,请教一个问题,当内核分配内存时,如果没有空闲页,其中slab/slub部分的匿名页会调用shrink_inactive_list 函数会扫描inactive list,将不活跃的page置换到swap分区。但是swap有时几M、几百M甚至几个G,这个内核置换的机制或算法逻辑是啥?(PS本身应用程序或内核不会一次性申请几个G的内存)
作者回复: 内存不足时,会把不活跃的匿名页给置换到磁盘。有多少匿名页可以被置换到磁盘swap分区,是由swappiness这个参数来控制的,该值越大就越容易发生swap。
2020-08-301 - J.Smile①”pginodesteal 是指 kswapd 之外其他线程在回收过程中,因为回收 inode 而释放的 pagecache page 个数。“------这里的”kswapd 之外其他线程“有可能就是用户业务线程吧?? ②对于java工程师,完全不懂memory cgroup 为何物。
作者回复: 1. 对的,既包括内核线程,也包括业务线程。 2. memory cgroup是用来控制应用的内存使用情况的,如果你想要现在JAVA进程的内存使用,而又不想修改JAVA代码,那你可以考虑使用它。它对于JAVA程序同样有用。
2020-08-281