atime,ctime,mtime是文件inode的三个时间戳,分别表示文件最近一次的访问时间;inode本身的更改(changed)时间;文件数据的更改(modify)时间;这几个概念还是很好区分。ctime和mtime的概念很清楚,每次ctime和mtime变化了,那么这个inode就真的要落盘了,但是atime相对就比较棘手一些;atime表示这个文件被访问(确切的说是)了,比如cat file操作,但吊诡的是:每次操作都会转化成一次,因为atime的改变导致了inode变脏写回。这是很难接受的一件事情,因为哪怕你什么都没有写入,简单的读操作,竟然在系统层面引起了大量的写IO。于是各种优化被提了出来。

noatime:直接没有atime,让系统中的atime失效;relatime:只有当mtime/ctime的时间戳晚于atime的时候才去更新atime;lazytime:如果仅有inode变脏,那么控制inode下发的时间。

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

lazytime的问题的本质是:哪些操作会深入到真实的文件系统,那些操作不会深入到真实的文件系统?

比如setsize,write,truncate等操作都是会深入到真实的文件系统中去的,并且这些操作都会使得文件的 i_size 等关键属性发生变化,真实文件系统中会主动把这个 inode 放到到待回写的脏链表(bdi_writeback->b_dirty)中去!但是对于一个cat操作,会引起atime的变化(我们认为atime是一种不关键的inode属性),变化了也就是脏的了,VFS层负责把这个inode放到待回写的脏链表中去(bdi_writeback->b_dirty/b_dirty_time)。这说明,调用mark_inode_dirty让inode回写这件事儿,如果深入到了真实文件系统,比如i_size变了等场景,真实文件系统做;如果未深入到真实文件系统,VFS做

再引申一件事情:inode结构体中许多重要的成员,比如 i_size, i_links都是在具体文件系统中设置,这个以后慢慢聊

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------那么到这里我们就大致知道了,其实relatime和lazytime其实都是处理的只有atime变化的场景,举例来说:cp file1 file2,此时file1就只有一个atime的变化。这会儿再来看relatime和lazytime,relatime是说atime的改变要与mtime/ctime联系在一起,只有mtime/ctime时间戳晚于atime的时候才会去更新atime,什么意思?初始状态下,我atime是9:00,mtime/ctime是12:00, 我13:00 cat了一下,kernel发现9:00 < 12:00,于是把atime更新为13:00;初始状态下,我atime是9:00,mtime/ctime是8:00,我13:00 cat了一下,kernel发现9:00 > 8:00,那么便不会更新atime,atime此时仍为9:00,这是relatime。lazytime呢,是说我inode的atime是实时更新的,8:00 cat,那么atime是8:00,13:00 cat,atime就变成了13:00,但是如果设置了lazytime,这个只有atime变化的inode是不会被下发的,只有当如下条件之一发生时才会被下发:1)有其他重要属性变化,如i_size/i_links等;2)如果用户态调用fsync/fdatasync等。

通过这些分析知道,lazytime 和 relatime 会大量减少IO的数量。好了,这就是基本的原理咯。

最后看如何使能这些标记:

mount -t ext4 -oremount,lazytime /dev/ram0 ext4

mount -t ext4 -oremount,relatime /dev/ram0 ext4

mount-t ext4 -oremount,strictatime /dev/ram0 ext4

mount -t ext4 -oremount,noatime /dev/ram0 ext4

文件系统中 atime,lazytime,relatime 详聊的更多相关文章

  1. Linux文件系统中的inode节点详细介绍

    这篇文章主要介绍了Linux文件系统中的inode节点,详细讲解了inode是什么.inode包含的信息.inode号码的相关资料等,需要的朋友可以参考下 一.inode是什么? 理解inode,要从 ...

  2. C#中string.format用法详解

    C#中string.format用法详解 本文实例总结了C#中string.format用法.分享给大家供大家参考.具体分析如下: String.Format 方法的几种定义: String.Form ...

  3. c++中vector的用法详解

    c++中vector的用法详解 vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间 ...

  4. 011-Scala中的apply实战详解

    011-Scala中的apply实战详解 object中的apply方法 class中的apply方法 使用方法 apply方法可以应用在类或者Object对象中 class类 必须要创建实例化的类对 ...

  5. C# WinForm 中 MessageBox的使用详解

    1.C# WinForm 中 MessageBox的使用详解:http://www.cnblogs.com/bq-blog/archive/2012/07/27/2611810.html

  6. JScript中的条件注释详解(转载自网络)

    JScript中的条件注释详解-转载 这篇文章主要介绍了JScript中的条件注释详解,本文讲解了@cc_on.@if.@set.@_win32.@_win16.@_mac等条件注释语句及可用于条件编 ...

  7. java中的io系统详解 - ilibaba的专栏 - 博客频道 - CSDN.NET

    java中的io系统详解 - ilibaba的专栏 - 博客频道 - CSDN.NET 亲,“社区之星”已经一周岁了!      社区福利快来领取免费参加MDCC大会机会哦    Tag功能介绍—我们 ...

  8. php中session机制的详解

    [补充]session_start()要放在php最前面,header()函数也要放在session_start()之后. [读了下面的文章转载的文章后自己的理解]: 1,通过phpinfo()函数可 ...

  9. Scala 深入浅出实战经典 第57讲:Scala中Dependency Injection实战详解

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...

随机推荐

  1. 【2017 ICPC亚洲区域赛沈阳站 K】Rabbits(思维)

    Problem Description Here N (N ≥ 3) rabbits are playing by the river. They are playing on a number li ...

  2. poj 2763 Housewife Wind : 树链剖分维护边 O(nlogn)建树 O((logn)²)修改与查询

    /** problem: http://poj.org/problem?id=2763 **/ #include<stdio.h> #include<stdlib.h> #in ...

  3. JAVA | 学生选课系统

    这里使用JAVA语言编写的简易的学生选课系统,展现的都是这个系统核心代码. 其中有不足欢迎批评和指正! 链接数据库的代码 package connection;//连接数据库student impor ...

  4. angularjs1+requirejs+ bootstrap+ jQuery低版本配合兼容ie8+浏览器

    angularjs兼容低版本IE浏览器(IE8)angularjs在1.3之后的版本都是选择放弃对IE8及更低IE版本的支持,但是就目前的开发形式来看,IE8的使用客户还是蛮多的,最近有个项目要求尽量 ...

  5. vue服务端渲染浏览器端缓存(keep-alive)

    在使用服务器端渲染时,除了服务端的接口缓存.页面缓存.组建缓存等,浏览器端也避免不了要使用缓存,减少页面的重绘. 这时候我们就会想到vue的keep-alive,接下来我们说一下keep-alive的 ...

  6. I/O流、ZIP文档

    1) ZIP文档通常以压缩格式存储一个或多个文档.在Java中可以用ZipInputStream读入ZIP文档(即解压文件流),用ZipOutputStream写入ZIP文档(即压缩文件流),无论解压 ...

  7. Ubuntu 配置多域名站点

    思路 -- 跟Windows 一样 1添加Nginx 指向项目的入口 配置域名 2修改本地host文件域名指向 实现: 1 进入Nginx 配置文件  默认地址为 /etc/nginx/sites-e ...

  8. ruby 数据类型Symbol

    一.符号创建 符号是Symbol类的实例,使用冒号加一个标识符即可创建符号 :a :"This is a symno" 二.符号字符串相互转换 p :symbol.to_s #=& ...

  9. EXKMP学习笔记QAQ

    因为一本通少了一些算法,所以我就自行补充了一些东西上去. EXKMP也就是扩展KMP,是一种特别毒瘤的东西 EXKMP确实很难,我理解他的时间与AC机的时间差不多,而且还很难记,因此一学会就马上写博客 ...

  10. C语言实例解析精粹学习笔记——34(用“结构”统计学生成绩)

    实例34: 设学生信息包括学号.姓名和五门功课的成绩,要求编写输入输出学生信息的函数.在输入学生信息后,以学生成绩的总分从高到低顺序输出学生信息. 思路: 程序引入一个结构数组依次存储输入的学生信息, ...