CentOS 7下atime如何变化的问题(转)
转自:https://blog.csdn.net/cjf_iceking/article/details/11988525
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了。
5. 参考
1. http://stackoverflow.com/questions/15547649/is-it-necessary-to-enable-atime-in-etc-fstab-to-get-the-correct-last-accessed
2. http://www.h-online.com/open/news/item/Kernel-Log-What-s-coming-in-2-6-30-File-systems-New-and-revamped-file-systems-741319.html
CentOS 7下atime如何变化的问题(转)相关推荐
- Centos 7下Nagios的安装及配置(完整版)
Centos 7下Nagios的安装及配置(完整版) 简介 Nagios 是一款自动化运维工具,可以协助运维人员监控服务器的运行状况,并且拥有报警功能.本文章将介绍其安装方法和详细的配置方法. nag ...
- 【傻瓜教程】CentOS 7 下 LNMP 环境搭建过程
1.安装MariaDB CentOS 7 下,推荐使用MariaDB(MySQL的一种开源分支),且建议用yum安装. 安装命令 yum -y install mariadb mariadb-serv ...
- c# 监视目录下的文件变化
在工作中需要学习一个应用系统软件,比较复杂,经常要在线读取ini,txt好多种类的文件,还有查问题的时候要分析log文件,但是我比较笨,又记不住什么时候动哪些文件,感觉学习好慢! 后来就想,我既然记不 ...
- CentOS(linux) 下JDK的安装
CentOS(linux) JDK的安装 第一篇博客有不足之处,请大家多指教.^_^ linux下装JDK的文章网上有一大堆我就不照搬了. 本文讲新手如何取巧的在linux下安装JDK. CentOS ...
- CentOS 7下安装Nextcloud搭建个人网盘
[转载自 https://www.linuxidc.com/Linux/2018-11/155310.htm] 该方法是在linxu公社中发布的.感谢作者! 本人亲测,此方法可行,我在手机.电脑上都可 ...
- 使用 yum 安装Docker(CentOS 7下)
使用 yum 安装(CentOS 7下) Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker . 通过 uname ...
- CentOS 6下编译安装Nginx
CentOS 6下编译安装Nginx By:老宁 一.准备make环境 yum -y install gcc gcc-c++ automake autoconf libtool make 二.准备 ...
- CentOS 7下Python环境设置 - 1
安装Python 3 CentOS 7下自带了Python 2.7,所以如果要使用Python 3,则需要重新安装Python 3 1.下载Python3.5的包 wget https://www.p ...
- Centos环境下部署游戏服务器-软件安装
这篇文章主要介绍一下游戏服务器需要安装的软件和需要修改的配置.现介绍下项目,本项目服务器端是c++ + mysql组合,客户端是as写的,需要安装的服务为Mysql,Php,Apache, 以及一个n ...
- centos环境下使用percona-xtrabackup对mysql5.6数据库innodb和myisam进行快速备份及恢复...
centos环境下使用percona-xtrabackup对mysql5.6数据库innodb和myisam进行快速备份及恢复 有时候我们会碰到这样的业务场景: 1.将大的数据库恢复到本地进行业务测试 ...
最新文章
- iptables防火墙策略
- 阿里云centos 6.5 32位安装可视化界面的方法
- mysql用supervisor管理_使用Supervisor管理进程
- vue数组变化视图_vue对象数组数据变化,页面不渲染
- css ——行级元素与块级元素解析
- 【剑指offer - C++/Java】10、矩形覆盖
- jquery-删除当前行的数据
- 佛罗里达大学计算机专业世界排名,2020年佛罗里达大学排名TFE Times美国最佳计算机科学硕士专业排名第55...
- linux的shell脚本if语句,Shell脚本编程之判断语句
- synchronized(this)、synchronized(class)与synchronized(Object)的区别
- paper reading:[renormalization]Semi-supervised Classification with Graph Convolutional Networks
- ajaxfileupload 监听上传进度_一篇文章学会文件上传
- PHP+CKEditor 3配置详细说明(包括图片上传)
- FastStone Capture无法录制系统声音解决方法(win10)
- 如何在IntelliJ IDEA 中导入别人写好的项目
- “停课不停学”钉钉被刷一星在线求饶,这波公关我给满分
- [Java学习] BFS算法示例
- Appium-Get Clipboard(获取剪贴板)
- Chatty登录测试
- 使用母版页实现页面布局