Page Cache的落地问题

除非特别说明,否则本文提到的写操作都是 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/413948.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker中搭建FastDFS文件系统(多图)

关于FastDFS FastDFS 是以 C 语言开发的一项开源轻量级分布式文件系统,他对文件进行管理,主要功能有:文件存储,文件同步,文件访问(文件上传/下载)等,特别适合以文件为载体的在线服务…

[js] 写一个方法遍历指定对象的所有属性

[js] 写一个方法遍历指定对象的所有属性 Object.keys()、Object.values()只能遍历对象自有的属性,for in 可以遍历原型中的属性。个人简介 我是歌谣,欢迎和大家一起交流前后端知识。放弃很容易, 但坚持一定很酷。欢迎大家一起讨论 主目录 …

jquery(2)

获得内容 - text()、html() 以及 val() 三个简单实用的用于 DOM 操作的 jQuery 方法:text() - 设置或返回所选元素的文本内容 ----不能识别标签 html() - 设置或返回所选元素的内容(包括 HTML 标记) val() - 设置或返回表单字段的值----- 即登…

[js] 实现一个函数记忆的方法

[js] 实现一个函数记忆的方法 同步运算结果缓存,这个就老生常谈了: function useCache(func) {var cache {};return function() {var key arguments.length Array.prototype.join.call(arguments);if(cache[key]) return cache[key];cache[key] fu…

SpringBoot集成FastDFS依赖实现文件上传

前言 对FastDFS文件系统安装后的使用。 FastDFS的安装请参考这篇&#xff1a;https://www.cnblogs.com/niceyoo/p/13511082.html 本文环境&#xff1a;IDEA JDK1.8 Maven 1、引入依赖 简单说一下这个依赖部分&#xff0c;目前大部分都是采用的如下依赖&#xff1a; <…

SQL取最大值编码(自动编码)

SQL取最大值编码(自动编码) 用途 : 使用SQL语法做出自动编码效果&#xff0c;例如将单号自动1后&#xff0c;产生该笔单号 Table说明 SQL语法 SELECT AREPLICATE(0,7-len(convert(varchar,((MAX(right(ae002,7)))1))))(convert(varchar,((MAX(right(ae002,7)))1))) from ygmae …

[js] 手写一个trim()的方法

[js] 手写一个trim()的方法 function trim(str) { if (str[0] && str[str.length - 1] ) { return trim(str.substring(1, str.length - 1)) } else if (str[0] ! && str[str.length - 1] ) { return trim(str.substring(0, str.length - 1)) } else…

微信小程序里如何使用npm?小程序集成友盟举例

1、执行npm初始化指令 小程序根目录&#xff0c;命令执行如下指令&#xff1a; npm init执行后会让加载项目初始信息&#xff0c;具体截图如下&#xff1a; 2、执行安装npm包指令 在这我们举个例子&#xff0c;以接入友盟统计SDK为例&#xff0c;执行命令如下&#xff1a;…

Spring MVC 5 + Thymeleaf 基于Java配置和注解配置

Spring MVC 5 Thymeleaf 注解配置 Spring的配置方式一般为两种&#xff1a;XML配置和注解配置 Spring从3.0开始以后&#xff0c;推荐使用注解配置&#xff0c;这两种配置的优缺点说的人很多&#xff0c;我就不说了&#xff0c;自行体会&#xff0c;下面就用注解配置实现一个Sp…

[js] 你是如何比较js函数的执行速度的?

[js] 你是如何比较js函数的执行速度的&#xff1f; 采用chrome performance apiconsole.time(flag); console.timeEnd(flag);performance api比较精准的 console.time(flag); 也行 搭配timelog 多次测量个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容…

docker镜像无法删除 Error:No such image:xxxxxx

1、前言 docker镜像无法删除&#xff0c;通过 docker images 查看镜像明明存在就是删除不了。 删除提示&#xff1a;Error&#xff1a;No such image&#xff1a;xxxxxxx 具体截图内容如下&#xff1a; 2、解决方法 进入目录&#xff1a; cd /var/lib/docker/image/over…

[js] axios拦截器原理是什么?

[js] axios拦截器原理是什么&#xff1f; 拦截器原理其实就是用use添加用户自定义的函数到拦截器的数组中。 最后把他们放在拦截器请求前&#xff0c;请求后。组成promise链式调用。 // 组成Promise链// Hook up interceptors middleware// 把 xhr 请求 的 dispatchRequest 和…

python中集合set,字典dict和列表list的区别以及用法

python中set代表集合&#xff0c;list代表列表,dict代表字典 set和dict的区别在于&#xff0c;dict是存储key-value&#xff0c;每一个key都是唯一的&#xff0c;set相对于dict存储的是key&#xff0c;且key是唯一的,list除了变量外都可以存储 dict{"a":1,"b&qu…

[js] fetch和axios请求的原理都是基于XMLHttpRerequst吗?

[js] fetch和axios请求的原理都是基于XMLHttpRerequst吗&#xff1f; axios是基于XMLHttpRequest的封装&#xff0c;而fetch是js原生支持的网络请求api&#xff0c;这在浏览器底层进行了支持。个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#x…

LeetCode(81): 搜索旋转排序数组 II

Medium&#xff01; 题目描述&#xff1a; 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如&#xff0c;数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] )。 编写一个函数来判断给定的目标值是否存在于数组中。若存在返回 true&#xff0c;否则返回 false。 示…

网站三级分销数据库如何设计,简单案例

一、问题产生 有小伙伴微信私信我&#xff0c;说老板想设计一套三级返佣的微信淘宝客裂变系统&#xff0c;然后问我怎么搞… 咳咳&#xff0c;对于三级分销的数据库设计&#xff0c;相信很多小伙伴头疼的可能不是设计上&#xff0c;而是查询上&#xff0c;因为通常涉及到会员…

[js] 举例说明面向对象编程有什么缺点?

[js] 举例说明面向对象编程有什么缺点&#xff1f; 有实例化开销&#xff0c;内存消耗比较大&#xff0c;性能消耗比较大个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端…

第6课 仿Siri机器人-语音朗读和语音识别

一、功能设计输入文本&#xff0c;单击“朗读”按钮&#xff0c;由手机读出该文本&#xff08;如果没有输入文本&#xff0c;则弹出消息框警告“请输入文本&#xff09;&#xff1b;单击“识别”按钮&#xff0c;读入语音&#xff0c;从文本框中输出文字。&#xff08;另&#…

口述完SpringMVC执行流程,面试官就让同事回家等消息了

Srping MVC 执行流程真的是老生常谈的话题了&#xff0c;最近同事小刚出去面试&#xff0c;前面面试官相继问了几个 Spring 相关的问题&#xff0c;但当面试官问他&#xff0c;你知道 Srping MVC 的执行流程吗&#xff1f;小刚娴熟的巴拉巴拉回答完后&#xff0c;面试官就让他回…

[js] 使用js实现一个循环队列

[js] 使用js实现一个循环队列 const queue [] let queueRunning false let loopTimer null const loop task > {// do something...console.log(task)if (isQueueHasTask()) {// you can add new tasks in the middle of the queue.loopTimer setTimeout(() > {loo…