除非特别说明,否则本文提到的写操作都是 buffer write/write back。

起因

前几天讨论到一个问题:Linux 下文件 close成功,会不会触发 “刷盘”?

其实这个问题根本不用讨论,查一下就知道。

man 2 closeNOTES 一节里有这么一段话:

A successful close does not guarantee that the data has been successfully saved to disk, as the kernel defers writes. It is not common for a filesystem to flush the buffers when the stream is closed. If you need to be sure that the data is physically stored use fsync(2). (It will depend on the disk hardware at this point.)

所以,一个文件的描述符被 close 成功,并不会触发操作系统刷盘

那么,问题来了,除了主动调用fsync(或相关函数)之外,Linux 什么时候会“刷盘”呢?

一次正常的写流程

一次写数据的典型流程(不考虑异常和其它特殊情况):

1、数据在用户态的 buffer 中,调用 write 将数据传给内核;

2、数据在 Page Cache 中,返回写入的字节数(成功返回);

3、内核将数据刷新到磁盘。

第二步如果返回成功,说明数据已经到达操作系统的Page Cache,可以保证的是如果进程挂了,但是操作系统没挂,数据不会丢失。

如果调用 fsync 将数据刷新到磁盘上,返回成功,说明数据已经刷新到硬件上了——我们一般认为如果 fsync 返回成功,则表示数据持久化成功。

Page Cache 的异步刷新

那么,如果不调用fsync或其它类似功能的接口,Page Cache 是什么时候刷回磁盘的呢?

简单总结一下,有两种情况:

1、脏页太多。

2、脏页太久。

这些都由 Linux 内核的后台线程执行。相关的控制参数有:

说明: centy 中文意思是“百分之十”。

$ sysctl -a | grep dirty
vm.dirty_background_bytes = 0
vm.dirty_background_ratio = 5
vm.dirty_bytes = 0
vm.dirty_expire_centisecs = 3000
vm.dirty_ratio = 10
vm.dirty_writeback_centisecs = 500
  • dirty_writeback_centisecs 表示多久唤醒一次刷新脏页的后台线程。这里的500表示5秒唤醒一次。
  • dirty_expire_centisecs 表示脏数据多久会被刷新到磁盘上。这里的3000表示 30秒。
  • dirty_background_ratio 表示当脏页占总内存的的百分比超过这个值时,后台线程开始刷新脏页。这个值如果设置得太小,可能不能很好地利用内存加速文件操作。如果设置得太大,则会周期性地出现一个写 IO 的峰值。
  • dirty_ratio 当脏页占用的内存百分比超过此值时,内核会阻塞掉写操作,并开始刷新脏页。
  • dirty_background_bytesdirty_bytes 是和 dirty_background_ratio、dirty_ratio 表示同样意义的不同单位的表示。两者不会同时生效。

总结

触发刷新脏页的条件:

1、调用fsync等。

2、脏页太多(相关参数:dirty_background_ratio与dirty_ratio)。

3、脏页太久(相关参数:dirty_expire_centisecs)。

参考资料

  • Linux Man Page
  • Better Linux Disk Caching & Performance with vm.dirty_ratio & vm.dirty_background_ratio

作者:linjinhe
链接:https://www.jianshu.com/p/ed5900d31f1f
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

转载于:https://www.cnblogs.com/lushilin/p/9145523.html

Page Cache的落地问题相关推荐

  1. Linux系统中的Page cache和Buffer cache

    Free命令显示内存 首先,我们来了解下内存的使用情况: Mem:表示物理内存统计 total:表示物理内存总量(total = used + free) used:表示总计分配给缓存(包含buffe ...

  2. 和linux关系_Linux内核Page Cache和Buffer Cache关系及演化历史

    在我们进行数据持久化,对文件内容进行落盘处理时,我们时常会使用fsync操作,该操作会将文件关联的脏页(dirty page)数据(实际文件内容及元数据信息)一同写回磁盘.这里提到的脏页(dirty ...

  3. linux 内存不足时候 应该及时回收page cache

    另一起问题是24G内存的系统,空闲内存已经不到50M 1. 确认该系统的版本是64位 # uname -a Linux gxgd-nms-app 2.6.18-194.el5xen #1 SMP Tu ...

  4. 网络缓存 峰值 linux,Linux Page Cache调优在Kafka中的应用

    本文首发于 vivo互联网技术 微信公众号 链接: 作者:Yang Yijun 本文主要描述Linux Page Cache优化的背景.Page Cache的基本概念.列举之前针对Kafka的 IO ...

  5. Linux的Page Cache

    1. Page Cache 何为Page Cache 为了了解Page Cache我们可以看一下Linux的文件I/O系统 从图中可以看出,Page Cache是由Linux内核进行管理的,而且通过m ...

  6. Page cache和Buffer cache[转1]

    http://www.cnblogs.com/mydomain/archive/2013/02/24/2924707.html Page cache实际上是针对文件系统的,是文件的缓存,在文件层面上的 ...

  7. page cache 与free

    我们经常用free查看服务器的内存使用情况,而free中的输出却有些让人困惑,如下: 先看看各个数字的意义以及如何计算得到: free命令输出的第二行(Mem):这行分别显示了物理内存的总量(tota ...

  8. linux刷新磁盘_Linux内核Page Cache和Buffer Cache关系及演化历史

    在我们进行数据持久化,对文件内容进行落盘处理时,我们时常会使用fsync操作,该操作会将文件关联的脏页(dirty page)数据(实际文件内容及元数据信息)一同写回磁盘.这里提到的脏页(dirty ...

  9. 读取文件慢_页面缓存(Page Cache)-内存和文件之间的那点事儿(下)

    原文:https://manybutfinite.com/post/page-cache-the-affair-between-memory-and-files/ 翻译:RobotCode俱乐部 现在 ...

最新文章

  1. python第三方库numpy-浅谈python的第三方库——numpy(终)
  2. 计算机房电源解决方案,apcups电源小型机房电源解决方案
  3. Tkinter的Scrollba组件
  4. java ssh pdf_JavaSSH框架技术规范.pdf
  5. LeetCode 669. Trim a Binary Search Tree
  6. Bootstrap HTML 编码规范之JavaScript生成的标签
  7. windows的盘共享挂载到linux下,通过Windows共享文件夹直接挂载到Linux中使用(实验操作)...
  8. distcp集群迁移问题总结
  9. jquery serialize 和 console 漫谈
  10. JAVA动态绑定浅析
  11. niceScroll
  12. 基于simhash的短文本去重
  13. 国产海洋地球物理设备简述----侧扫声纳
  14. 软件设计的七大原则 --开闭原则 里氏替换原则 依赖倒置原则
  15. JS简单实现动态抽奖机
  16. Win32窗口程序实例
  17. Association Class VS Full Class
  18. Java实现买火车票【抢票】成功率100%
  19. php邮箱必填,ZBlogPHP-1.5 以上版本修改实现用户评论时必填邮箱的功能
  20. css文件应该放在哪?

热门文章

  1. TP5:缩短访问路径和路由的使用——2
  2. AS查看Android系统源码
  3. react学习(66)--ant design中Model宽度
  4. 前端学习(3214):state的一个简洁方式
  5. 前端学习(2981):Json格式转换
  6. [vue-cli]在使用vue-cli开发vue项目时,自动刷新页面的原理你了解吗?
  7. 前端学习(1709):前端系列javascript之uniapp
  8. 企业网站前端制作实战教程 JQuery CSS JS HTML 项目需求分析与准备工作
  9. 第二十一期:干货盘点!推荐程序员使用的5款工具软件
  10. Java:这是一份全面 详细的 Synchronized关键字 学习指南