linux中 访问文件后(比如cat、vim等) atime不改变的问题

1、问题

root@ubuntu01:/home/test# ls
a.txt
root@ubuntu01:/home/test# stat a.txt     ## 统计a.txt最后访问的时间
  File: a.txt
  Size: 10              Blocks: 8          IO Block: 4096   regular file
Device: 805h/2053d      Inode: 532492      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2022-03-27 12:00:07.113429738 +0800
Modify: 2022-03-27 11:59:40.697435221 +0800
Change: 2022-03-27 11:59:40.697435221 +0800
 Birth: -
root@ubuntu01:/home/test# date     ## 等一分钟后,查看系统时间
2022年 03月 27日 星期日 12:01:15 CST
root@ubuntu01:/home/test# cat a.txt    ## 利用 cat访问文件
1
2
3
4
5
root@ubuntu01:/home/test# stat a.txt    ## 利用stat命令查看文件最后访问的时间,发现并没有更新
  File: a.txt
  Size: 10              Blocks: 8          IO Block: 4096   regular file
Device: 805h/2053d      Inode: 532492      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2022-03-27 12:00:07.113429738 +0800
Modify: 2022-03-27 11:59:40.697435221 +0800
Change: 2022-03-27 11:59:40.697435221 +0800
 Birth: -

 

2、问题原因:   来源:http://t.zoukankan.com/osker-p-12693809.html

根本原因在于:如果每次访问都更新时间的话,会造成磁盘不停的写入,降低系统性能,从保持系统性能的因素考虑,linux内核不再每次访问都更新atime,而是达到一定的条件更新atime。 当然也可以认为设定随时更新atime。

 

最后在网上爬文,发现原来是以下原因

以下出于 https://blog.csdn.net/cjf_iceking/java/article/details/11988525


起初我也怀疑过是不是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内核的大牛无不从每一个细节抓起呢,敬佩。
————————————————

获取精确的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了。

 

posted @ 2022-03-27 12:06  小鲨鱼2018  阅读(481)  评论(0编辑  收藏  举报