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