文件atime未变问题的研究

1. atime, ctime 以及mtime
这三个名词属于文件/文件夹的属性,存在于inode数据结构之中。

通过系统调用stat可以获取stat结构,其中包括:atime(accesstime), ctime(create time) 以及mtime(modify time)的信息,man stat后的信息:

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

atime: The field st_atime is changed by file accesses, e.g. byexecve, mknod, pipe, utime and read (of more than zero bytes).

ctime: The field st_ctime is changed by writing or by settinginode information (i.e., owner, group, link count, mode, etc.).

mtime: The field st_mtime is changed by file modifications, e.g.by mknod, truncate, utime and write (of more than zero bytes).  Moreover, st_mtime of a directory is changedby the creation or deletion of files in that directory. The st_mtime field isnot changed for changes in owner, group, hard link count, or mode.

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

值得注意的是,严格意义上说,ctime并不是创建文件的时间。

同样我们也可以通过ls命令来获取文件的atime,ctime, mtime:

获取atime:ls –lu [filename]
获取ctime:ls –lc [filename]
获取mtime:ls –l [filename]
 
2. atime未发生变化的情况
在Centos6或者Redhat6的平台下,产品对文件扫描后,发现文件的atime并没有变化,接着自己也用命令”cat [filename]”之后,atime也没有发生变化。这些操作都会对文件进行读操作,但是为何atime没有发生变化了呢?

但是这些操作在Redhat5等平台上都能够正常的改变atime。那为何在Centos6/Redhat6上没有改变呢?

3. 根本原因
起初我也怀疑过是不是OS的bug导致的,后来发现,在kernel版本2.6.30之前,linux的核心开发人员针对Ext3/Ext4文件系统的性能进行了讨论,其中包括atime。在kernel 2.6.30之前,文件系统中默认会及时的更新atime,这样会带来两个问题:

(1)    系统中大量的文件访问,将atime写入到磁盘中,消耗时间,从而降低性能

(2)    这样的操作也会消耗电能

在Linux上运行的,很少的应用程序需要获取精确的atime时间,并且Linux核心开发人员从Ext3/Ext4文件系统的性能角度出发,决定在2.6.30版本的内核中修改atime的更新方式,只有在以下三种情况之一才会更新atime:

(1)    如果将分区mount的挂载的时候指定采用非relatime方式(默认采用relatime方式),如strictatime.

补充:在OS启动的时候,将各个分区挂载到不同的目录,在挂载(mount)的参数中采用strictatime,表明及时更新atime。在2.6.30之后mount添加了”relatime”和”strictatime”两个选项,详细的可以通过”man mount”查看。

(2) atime小于ctime或者小于mtime的时候

(3) 本次的access time和上次的atime超过24个小时

这种做法避免了频繁的更新atime,提高了文件系统的性能。果然做Linux内核的大牛无不从每一个细节抓起呢,敬佩。

然后我查看了我使用的CentOS6和Redhat6的kernel版本是2.6.32的,而我用的Redhat5是2.6.30之前的内核版本,果不其然,然后下载了2.6.32.22的kernel代码,查看到了更新atime之前调用的一个检查函数relatime_need_update:

/*
*With relative atime, only update atime if the previous atime is
*earlier than either the ctime or mtime or if at least a day has
*passed since the last atime update.
*/
static int relatime_need_update(structvfsmount *mnt, struct inode *inode,
struct timespec now)
{

if(!(mnt->mnt_flags & MNT_RELATIME))
return1;
/*
* Is mtime younger than atime? If yes, updateatime:
*/
if(timespec_compare(&inode->i_mtime, &inode->i_atime) >= 0)
return1;
/*
* Is ctime younger than atime? If yes, updateatime:
*/
if(timespec_compare(&inode->i_ctime, &inode->i_atime) >= 0)
return1;

/*
* Is the previous atime value older than aday? If yes,
* update atime:
*/
if((long)(now.tv_sec - inode->i_atime.tv_sec) >= 24*60*60)
return1;
/*
* Good, we can skip the atime update:
*/
return0;
}

4. 获取精确的atime时间
但是在kernel 2.6.30之后,如果你的产品需要获取atime的精确时间呢?

OS启动的时候会读取/etc/fstab文件,对磁盘分区进行挂载我们可以添加strictatime选项:

UUID=d2a07167-d979-4cb8-a50e-dde36f4c7139/ ext4 defaults,strictatime 1 1
但是这种做法需要重启OS,如果不重启OS我们可以使用remount(以挂载在”/”的文件系统为例):

mount -o remount,rw,strictatime /
这样挂载在”/”目录的文件系统就能够及时的更新atime了。
---------------------
原文:https://blog.csdn.net/cjf_iceking/article/details/11988525

原文地址:https://www.cnblogs.com/heaven-xi/p/10437272.html

时间: 2024-08-30 16:40:25

文件atime未变问题的研究的相关文章

Android MediaProvider--文件管理:必现,文件管理器中新建几个文件夹,批量删除后,连接电脑查看仍有部分文件夹未删除

问题描述: [测试步骤]:1.进入文件管理器中,新建几个文件夹,然后批量全选这些文件夹--删除: 2.手机连接电脑,在电脑端查看文件显示. [测试结果]:电脑端查看仍有部分文件夹未删除.插拔USB线几次,在电脑端重新查看,仍显示. [预期结果]:电脑端不应显示已删除的文件夹. [复现概率]:100%(若第一次未复现,步骤1.2重新操作即可复现) [备注]:在文件管理中点击"搜索",也能搜索出这些文件夹. 按以下步骤更容易复现 1.添加一个本地文件夹,删除新添加的文件夹 2.再新建另一文

js文件代码未加载或者没有js效果

问题:在页面中js文件中的代码未加载或者没有任何效果. 原因: 成功引用了js文件,但无效果或者提示未加载该文档中的代码. 可能页面引用js文件的路径存在问题 解决: 重新检查你引用的js文件的路径是否正确: 一般是js代码存在语法问题,仔细检查标点符号.单双引号(本人源于这个问题),以及页面中是否有未结束的<!--的符号. js文件代码未加载或者没有js效果

让source insight的源代码文件显示字体变大

让source insight的源代码文件显示字体变大source insight version 4.00.0084 options->file type options->screen font->选中,然后键入yes.这样,所有的文件的字体大小都改变了. 原文地址:https://www.cnblogs.com/praiseslow/p/11478611.html

SQL Server 2008 清空删除日志文件(瞬间日志变几M)

sql 在使用中每次查询都会生成日志,但是如果你长久不去清理,可能整个硬都堆满哦,笔者就遇到这样的情况,直接网站后台都进不去了.下面我们一起来学习一下如何清理这个日志吧 SQL2008清空删除日志: 方法一: USE [master] GO ALTER DATABASE AFMS SET RECOVERY SIMPLE WITH NO_WAIT GO ALTER DATABASE AFMS SET RECOVERY SIMPLE GO USE AFMS GO DBCC SHRINKFILE (N

RHEL6删除文件后未释放空间

早上一个网站页面打开空白,后来查看是磁盘空间满了,查看是nginx的access.log占用了170多个G,于是通过rm将其删除,后重启nginx问题依然,此时再查看磁盘发现空间并未释放 [[email protected] logs]# du -h * 176G access.log 0 error.log 4.0K nginx.pid [[email protected] logs]# du -sh  176G . [[email protected] logs]# rm access.lo

【初码干货】使用阿里云对Web开发中的资源文件进行CDN加速的深入研究和实践

提示:阅读本文需提前了解的相关知识 1.阿里云(https://www.aliyun.com) 2.阿里云CDN(https://www.aliyun.com/product/cdn) 3.阿里云OSS(https://www.aliyun.com/product/oss) 4.HTTPS(http://baike.baidu.com/view/14121.htm) 阅读目录结构 引: 一.准备工作 二.整体功能结构 三.具体实现步骤 四.关键点和问题处理 五.延伸与扩展 六.总结与思考 引:

java http大文件上传,断点续传项目研究,Github上传源代码

1,项目调研 因为需要研究下断点上传的问题.找了很久终于找到一个比较好的项目. 在GoogleCode上面,代码弄下来超级不方便,还是配置hosts才好,把代码重新上传到了github上面. https://github.com/freewebsys/java-large-file-uploader-demo 效果: 上传中,显示进度,时间,百分比. 点击[Pause]暂停,点击[Resume]继续. 2,代码分析 原始项目: https://code.google.com/p/java-lar

奥维ovobj 文件,转化为shp文件,再变sql文件导入到pgsql里

先变 KML 文件. 再用 QGIS的矢量 变成 shp文件. ** 最后 . shp2pgsql -W utf8 -s 4326 /home/manbug/ningbo/NB.shp ningbo_524>/home/manbug/ningbo/NBnew.sqlhttps://www.cnblogs.com/think8848/p/6929351.html 原文地址:http://blog.51cto.com/13000661/2126427

PDF文件在线压缩变小的方法

  PDF文件在线压缩的方法有?PDF文件太大会导致上传文件上传不上,当PDF很小的时候就可以进行压缩变小,PDF文件是怎么压缩变小的呢?那么下面小编就简单的给大家介绍一下将PDF在线压缩的简单方法吧. 1.    首先需要进行在线压缩的方法很简单,准备好PDF文件,然后直接进入到在线压缩中: 2.    进入之后就可以进行压缩类型的设置,选择一下压缩质量,然后进行文件的添加: 3.    添加文件时可以是需要进行文件的直接拖拽或是点击选择文件进行上传: 4.    等文件上传好之后就可以进行压