Linux 磁盘挂载与性能优化
Linux 文件有三种重要时间戳:
| 时间类型 | 描述 | 修改条件 |
|---|---|---|
| Access Time (atime) | 文件最后访问时间 | 读取文件时改变 |
| Modify Time (mtime) | 文件内容最后修改时间 | 修改文件内容时改变 |
| Change Time (ctime) | 文件属性最后修改时间 | 修改文件权限或内容时改变 |
-
创建文件并查看时间戳:
echo "Hello" > hello.txt stat hello.txt ls -l --time=atime # 查看访问时间 ls -l --time=ctime # 查看改变时间 -
修改权限:
chmod 600 hello.txt stat hello.txt- 结果:
Change Time改变,Access/Modify Time不变
- 结果:
-
修改文件内容:
echo "World" >> hello.txt stat hello.txt- 结果:
Modify和Change改变,Access不一定改变(取决于是否读取文件)
- 结果:
-
读取文件内容:
cat hello.txt stat hello.txt- 结果:
Access改变
- 结果:
结论:
- 读取文件 -> 改变
Access - 修改权限 -> 改变
Change - 修改内容 -> 改变
Modify和Change,Access视操作方式而定
- 常用日志文件系统:Ext2/Ext3/Ext4/XFS
- XFS:性能好、稳定,CentOS 7 默认使用 XFS
- 日志文件系统特性:先写日志,再写主文件,保证数据一致性,但会额外记录访问时间 -> 可禁用以提升性能
| 参数 | 作用 | 建议 |
|---|---|---|
noatime |
禁止记录文件访问时间 | 高频读写场景必用,提升 I/O 20%-30% |
nodiratime |
禁止目录访问时间记录 | 配合 noatime |
nobarrier |
禁止写屏障,依赖存储设备自保护 | 数据安全有保证时可用 |
allocsize |
I/O 预分配大小(延迟分配) | 256m 常用优化值 |
logbufs |
内存日志缓冲区数量 | 默认 8,可调整 |
logbsize |
内存日志缓冲区大小 | 默认 256k |
discard |
文件删除触发 TRIM/Discard | SSD/Flash 推荐 |
attr2 |
XFS 扩展属性优化 | 默认启用 |
Ext4 默认优化挂载:
defaults,noatime,nodiratime,nobarrier
XFS 优化挂载:
defaults,noatime,nodiratime,nobarrier,discard,allocsize=256m,logbufs=8,attr2,logbsize=256k
- 挂载生效无需重启:
mount -o remount /
- 可使用
fio测试性能:
# 顺序读
fio -filename=/var/test.file -direct=1 -iodepth 1 -thread -rw=read -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting
# 随机写
fio -filename=/var/test.file -direct=1 -iodepth 1 -thread -rw=randwrite -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting
| 参数 | 描述 |
|---|---|
allocsize |
延迟分配大小 |
attr2 |
扩展属性优化 |
barrier |
写屏障 |
inode64 |
支持大 inode 编号 |
logbufs |
日志缓冲区数量 |
logbsize |
日志缓冲区大小 |
discard |
自动触发 TRIM/Discard |
noatime/nodiratime |
不更新访问时间 |
osyncisosync |
提供真正的 O_SYNC 写 |
其他高级参数如
dmapi,quota,sunit/swidth可根据实际需求配置
-
缓存:提高读性能
-
缓冲:提高写性能
-
顺序 I/O vs 随机 I/O:
- 顺序 I/O:连续文件偏移,性能高
- 随机 I/O:偏移随机,可能导致碎片化
| 工具 | 用途 |
|---|---|
iostat |
汇总磁盘 I/O,tps、吞吐量、延迟 |
iotop |
查看进程 I/O 实时占用 |
sar |
历史性能统计 |
blktrace/perf |
详细跟踪 I/O |
tps:每秒 I/O 次数kB_read/s/kB_wrtn/s:每秒读/写 KBawait:平均 I/O 响应时间(ms)svctm:磁盘平均服务时间%util:设备繁忙程度
重点指标:
await越小越好,%util100% 表示接近满负荷
- Cache:
sdparm -s WCE=1,RCD=0 -S /dev/sdb
- I/O 调度器:
echo deadline > /sys/block/sdb/queue/scheduler
echo 500 > /sys/block/sdb/queue/iosched/read_expire
echo 1000 > /sys/block/sdb/queue/iosched/write_expire
- 预读扇区数:
blockdev --setra 256 /dev/sdb
- EXT3:
mkfs.ext3 -b 4096 -i 16384 -m 2 /dev/sdb1
tune2fs -O^has_journal /dev/sdb1 # 无日志
- XFS:
mkfs.xfs -d agcount=256 -l size=128m,lazy-count=1,version=2 /dev/sdb1
- EXT3 示例:
mount /dev/sdb1 /cache1 -o defaults,noatime,nodiratime,async,data=writeback,barrier=0
- XFS 示例:
mount /dev/sdb1 /cache1 -o defaults,noatime,nodiratime,nobarrier,discard,allocsize=256m,logbufs=8,attr2,logbsize=256k
- 设置进程 I/O 优先级:
ionice -c 3 -p <PID> # 空闲 I/O
ionice -c 2 -n 0 -p <PID> # 尽力而为,优先级最高
- 对进程组限制 I/O 带宽,可用于高负载场景
| 磁盘类型 | 推荐调度器 |
|---|---|
| HDD | deadline |
| SSD | noop |
| 桌面 | cfq |
| 大文件顺序读写 | as |
✅ 总结
- 理解文件时间戳,有助于选择挂载参数(如
noatime) - 文件系统优化重点:选择 XFS / EXT4,调整 blocksize、日志、扩展属性
- 磁盘优化重点:cache、I/O 调度器、readahead、ionice
- 挂载参数优化重点:
noatime,nodiratime,nobarrier,allocsize,logbufs,logbsize,discard - 测试工具:
fio、iostat、iotop、blktrace等,分析性能变化