### 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文件系统比较与总结](https://developer.aliyun.com/article/460715)。 日志文件系统的特点是,在发生变化时,它先把相关的信息写入一个被称为日志的区域,然后再把变化写入主文件系统。这样的好处是当系统发生故障时,日志文件系统更容易保证一致性,并且可以较快恢复。这是优点也是缺点,因为有些信息是我们并不需要的,比如文件的访问时间,如果能禁用这些记录,在系统频繁访问文件时,就可以减少一些不必要的操作,便能显著的提高系统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命令测试修改前后的文件系统性能差异。 使用的测试命令示例如下: ```shell # 顺序写入 fio -directory=/path/to/directory \ -thread -numjobs=4 -direct=1 \ -iodepth 32 -ioengine=libaio \ -runtime=60 -size=4G -bs=1M \ -group_reporting -rw=write \ -name=write # 顺序读取 fio -directory=/path/to/directory \ -thread -numjobs=4 -direct=1 \ -iodepth 32 -ioengine=libaio \ -runtime=60 -size=4G -bs=1M \ -group_reporting -rw=read \ -name=read # 随机写入 fio -directory=/path/to/directory \ -thread -numjobs=4 -direct=1 \ -iodepth 32 -ioengine=libaio \ -runtime=60 -size=1G -bs=4K \ -group_reporting -rw=randwrite \ -name=randwrite # 随机读取 fio -directory=/path/to/directory \ -thread -numjobs=4 -direct=1 \ -iodepth 32 -ioengine=libaio \ -runtime=60 -size=1G -bs=4K \ -group_reporting -rw=randread \ -name=randread # 随机读写 fio -directory=/path/to/directory \ -thread -numjobs=4 -direct=1 \ -iodepth 32 -ioengine=libaio \ -runtime=60 -size=1G -bs=4K \ -group_reporting -rw=randrw -rwmixread=70 \ -name=randrw ``` **参数说明:** - -ioengine:Linux 本地磁盘测速标准是libaio(Linux AIO),能利用内核异步特性。 - -iodepth:32-128,现代SSD需要高并发队列才能跑满,如果是机械 RAID,适当的深度(32)也能让RAID卡优化写入顺序。 - -bs:1M 测试吞吐量(MB/s),4K测试随机响应(IOPS)。 - -direct:必须保持1,忽略操作系统内存,直接测试存储层。 - -numjobs:根据CPU核心数量来选择,一般1-4就够了,本地测试不需要太多进程来堆压力,过多的进程会增加 CPU 上下文切换开销。 - -size: 每个线程写入文件大小,如果测试缓存,测试数据总量(Size \* Numjobs)必须 **小于** SSD 缓存大小,如果测试机械磁盘真实速度,测试数据总量必须 **远大于** SSD 缓存大小。 - -runetime:最长执行时间,如果在此时间前没有完成任务也会停止。 - -write_bw_log:记录实时带宽曲线,查看后缓存掉速后的稳定速度。 Loading... ### 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文件系统比较与总结](https://developer.aliyun.com/article/460715)。 日志文件系统的特点是,在发生变化时,它先把相关的信息写入一个被称为日志的区域,然后再把变化写入主文件系统。这样的好处是当系统发生故障时,日志文件系统更容易保证一致性,并且可以较快恢复。这是优点也是缺点,因为有些信息是我们并不需要的,比如文件的访问时间,如果能禁用这些记录,在系统频繁访问文件时,就可以减少一些不必要的操作,便能显著的提高系统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命令测试修改前后的文件系统性能差异。 使用的测试命令示例如下: ```shell # 顺序写入 fio -directory=/path/to/directory \ -thread -numjobs=4 -direct=1 \ -iodepth 32 -ioengine=libaio \ -runtime=60 -size=4G -bs=1M \ -group_reporting -rw=write \ -name=write # 顺序读取 fio -directory=/path/to/directory \ -thread -numjobs=4 -direct=1 \ -iodepth 32 -ioengine=libaio \ -runtime=60 -size=4G -bs=1M \ -group_reporting -rw=read \ -name=read # 随机写入 fio -directory=/path/to/directory \ -thread -numjobs=4 -direct=1 \ -iodepth 32 -ioengine=libaio \ -runtime=60 -size=1G -bs=4K \ -group_reporting -rw=randwrite \ -name=randwrite # 随机读取 fio -directory=/path/to/directory \ -thread -numjobs=4 -direct=1 \ -iodepth 32 -ioengine=libaio \ -runtime=60 -size=1G -bs=4K \ -group_reporting -rw=randread \ -name=randread # 随机读写 fio -directory=/path/to/directory \ -thread -numjobs=4 -direct=1 \ -iodepth 32 -ioengine=libaio \ -runtime=60 -size=1G -bs=4K \ -group_reporting -rw=randrw -rwmixread=70 \ -name=randrw ``` **参数说明:** - -ioengine:Linux 本地磁盘测速标准是libaio(Linux AIO),能利用内核异步特性。 - -iodepth:32-128,现代SSD需要高并发队列才能跑满,如果是机械 RAID,适当的深度(32)也能让RAID卡优化写入顺序。 - -bs:1M 测试吞吐量(MB/s),4K测试随机响应(IOPS)。 - -direct:必须保持1,忽略操作系统内存,直接测试存储层。 - -numjobs:根据CPU核心数量来选择,一般1-4就够了,本地测试不需要太多进程来堆压力,过多的进程会增加 CPU 上下文切换开销。 - -size: 每个线程写入文件大小,如果测试缓存,测试数据总量(Size \* Numjobs)必须 **小于** SSD 缓存大小,如果测试机械磁盘真实速度,测试数据总量必须 **远大于** SSD 缓存大小。 - -runetime:最长执行时间,如果在此时间前没有完成任务也会停止。 - -write_bw_log:记录实时带宽曲线,查看后缓存掉速后的稳定速度。 最后修改:2026 年 01 月 06 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 1 如果觉得我的文章对你有用,请随意赞赏