1、理解Linux文件属性的三种时间戳

  • Access Time:访问时间,表示最后一次访问文件,但是没有改动的时间
  • Mofidy Time:修改时间,表示最后一次对文件进行更改的时间
  • Change Time:改变时间,这个改变指的是对文件属性的更改,例如权限

通过下面几个操作理解一下上面的三种类型时间戳。

首先创建一个文件:

echo "Hello" > hello.txt

重看文件的时间戳信息:

通过stat命令可以查看文件或者文件系统的状态,只需简单的添加文件路径作为参数即可。

详细的用法可以通过man stat获取。

stat hello.txt

返回的信息如下:

  File: ‘hello.txt’
  Size: 6             Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d    Inode: 67148870    Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2021-11-09 14:59:38.210119175 +0800
Modify: 2021-11-09 14:59:38.210119175 +0800
Change: 2021-11-09 14:59:38.210119175 +0800
 Birth: -

还可以通过ls查看文件的时间,当我们使用ls -l命令列出当前目录下的文件的时候,通常也会带上文件的时间戳信息,这里显示的时间戳默认是文件的修改时间,如果想查看其他时间戳信息,通过--time=atime--time=access参数查看访问文件时间,通过--time=ctime--time=status查看文件改变时间。文件改变时间也可使用-u参数代替,这两种方式都需要和-l参数一起使用才有效果。

另外默认ls -l显示的日期格式是locale,可以通过参数--time-style=[full-iso|long-iso|iso]来查看iso格式的时间戳信息。甚至也可以自定义时间显示格式,此处不多做讲解,详情参阅man ls

修改文件权限:

chmod 600 hello.txt
stat hello.txt
---
  File: ‘hello.txt’
  Size: 6             Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d    Inode: 67148870    Links: 1
Access: (0600/-rw-------)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2021-11-09 14:59:38.210119175 +0800
Modify: 2021-11-09 14:59:38.210119175 +0800
Change: 2021-11-09 15:16:24.648565352 +0800
 Birth: -

更改文件内容:

echo "World" >> hello.txt
stat hello.txt
---
  File: ‘hello.txt’
  Size: 12            Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d    Inode: 67148870    Links: 1
Access: (0600/-rw-------)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2021-11-09 14:59:38.210119175 +0800
Modify: 2021-11-09 15:17:35.902615251 +0800
Change: 2021-11-09 15:17:35.902615251 +0800
 Birth: -

查看文件内容:

cat hello.txt
stat hello.txt
---
  File: ‘hello.txt’
  Size: 12            Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d    Inode: 67148870    Links: 1
Access: (0600/-rw-------)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2021-11-09 15:19:03.987204526 +0800
Modify: 2021-11-09 15:17:35.902615251 +0800
Change: 2021-11-09 15:17:35.902615251 +0800
 Birth: -

结论如下:

  • 仅读取文件时,Access会改变,Mofify和Change不会改变
  • 改变文件权限时,Change会改变,Access和Modify不会改变
  • 当修改文件内容时,Modify和Change会改变,但是Access不一定会改变

为什么说修改文件内容时,Access不一定会改变呢?

在上述的例子中,我们直接使用echo向文本中追加内容,并没有对文件进行访问操作,而如果你使用vi/vim编辑器来修改文件内容,你会发现Access也会改变,因为vi/vim会首先读取文件的内容。

2、磁盘挂载参数优化

为什么要花那么多的篇幅说明文件的时间戳属性呢?因为挂载的优化就是基于此的。

Linux支持非常多的文件系统,常见的日志文件系统有Ext2/Ext3/Ext4/XFS等,XFS是比较稳定的新型文件系统,比他更新的当然也有,但是稳定性欠佳,CentOS7便是直接使用XFS作为默认的文件系统了。

关于不同文件系统的比较参照ext与xfs文件系统比较与总结

日志文件系统的特点是,在发生变化时,它先把相关的信息写入一个被称为日志的区域,然后再把变化写入主文件系统。这样的好处是当系统发生故障时,日志文件系统更容易保证一致性,并且可以较快恢复。这是优点也是缺点,因为有些信息是我们并不需要的,比如文件的访问时间,如果能禁用这些记录,在系统频繁访问文件时,就可以减少一些不必要的操作,便能显著的提高系统IO的效率。

所幸Linux提供了natime这个参数来禁止记录文件的访问时间戳信息,给文件系统加上这个参数可以显著提升20%-30%的IO吞吐效率。

可以通过修改/etc/fstab来达到修改文件系统的挂载参数的目的:

#ext4 mount时的参数:
defaults,noatime,nodiratime,nobarrier

#经过优化的xfs mount时的参数
defaults,noatime,nodiratime,nobarrier,discard,allocsize=256m,logbufs=8,attr2,logbsize=256k

#默认的xfs mount时的参数
defaults,noatime,nodiratime,nobarrier

修改完成后也不需要重新启动系统,可以通过重新挂载来生效,/代表的是挂载点。

mount -o remount /

如果你对性能比较感兴趣,可以使用fio命令测试修改前后的文件系统性能差异。
使用的测试命令示例如下:

# 顺序读
fio -filename=/var/test.file -direct=1 -iodepth 1 -thread -rw=read -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting -name=test_r
# 随机写
fio -filename=/var/test.file -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting -name=test_randw
# 顺序写
fio -filename=/var/test.file -direct=1 -iodepth 1 -thread -rw=write -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting -name=test_w
# 随机读写
fio -filename=/var/test.file -direct=1 -iodepth 1 -thread -rw=randrw -rwmixread=70 -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting -name=test_r_w -ioscheduler=noop
最后修改:2023 年 08 月 02 日
如果觉得我的文章对你有用,请随意赞赏