【原理】Linux磁盘IO原理深度解析:从文件系统到块设备

阿里云推广

Linux磁盘IO原理深度解析

磁盘IO是系统性能的关键瓶颈。理解Linux磁盘IO的完整链路,有助于优化应用性能和排查IO问题。

一、IO完整链路

应用程序
    ↓ read()/write() 系统调用
VFS(虚拟文件系统层)
    ↓ 通用文件系统接口
具体文件系统(ext4/xfs/btrfs)
    ↓ 管理inode、目录结构、块分配
Page Cache(页缓存)
    ↓ 缓存热点数据,减少磁盘访问
块设备层(Block Layer)
    ↓ 管理IO队列和调度
设备驱动(SCSI/SATA/NVMe)
    ↓ 硬件交互
物理磁盘(HDD/SSD)

二、Page Cache机制

Page Cache是Linux文件系统的核心优化:

# 查看Page Cache使用情况
$ free -h
              total        used        free      shared  buff/cache   available
Mem:           15Gi       4.2Gi       2.1Gi       512Mi       9.2Gi        10Gi
# buff/cache就是Page Cache

# Page Cache的作用:
# 1. 读缓存 - 首次从磁盘读,后续从内存读
# 2. 写缓冲 - 数据先写内存,后台刷盘

# 手动清空Page Cache(测试用)
sync  # 先刷盘
echo 3 > /proc/sys/vm/drop_caches

三、IO调度算法

Linux内核提供多种IO调度算法:

# 查看当前调度算法
$ cat /sys/block/sda/queue/scheduler
[mq-deadline] kyber bfq none

# 各算法特点:
# mq-deadline - 默认,兼顾吞吐和延迟
# kyber - 针对NVMe优化
# bfq - 公平队列,适合桌面
# none - 无调度(NVMe推荐)

# 修改调度算法
$ echo none > /sys/block/nvme0n1/queue/scheduler

四、文件系统对比

特性 ext4 xfs btrfs
最大文件 16TB 8EB 16EB
最大卷 1EB 8EB 16EB
快照 不支持 不支持 原生支持
压缩 不支持 不支持 支持
适用场景 通用 大文件/高并发 实验性/桌面

五、IO性能监控

# iostat查看磁盘IO
$ iostat -x 1 5
Device            r/s     w/s     rkB/s     wkB/s   rrqm/s   wrqm/s  %rrqm  %wrqm r_await w_await aqu-sz rareq-sz wareq-sz  svctm  %util
nvme0n1         12.34   45.67    123.45    456.78     1.23     2.34   9.09   4.88    0.50    0.30   0.02    10.00    10.00   0.02   0.12

# 关键指标:
# r/s, w/s - 每秒读写次数
# rkB/s, wkB/s - 每秒读写数据量
# r_await, w_await - 读写平均等待时间(ms)
# %util - 设备利用率(接近100%说明饱和)

六、IO优化建议

# 1. 应用层优化
# - 批量读写,减少系统调用次数
# - 使用异步IO(aio)
# - 顺序读写优于随机读写

# 2. 系统层优化
# 禁用atime更新(减少写操作)
mount -o noatime /dev/sda1 /data

# 3. 调整脏页刷新策略
# /etc/sysctl.conf
vm.dirty_ratio = 40              # 脏页占总内存40%时强制刷盘
vm.dirty_background_ratio = 10   # 脏页占10%时后台开始刷盘
vm.dirty_expire_centisecs = 3000 # 脏页30秒后刷新

# 4. SSD优化
# 启用TRIM
fstrim -av /

# 5. 使用合适的文件系统
# 数据库用xfs,通用用ext4

七、LVM对IO的影响

# LVM增加了抽象层,有轻微性能损耗(通常<5%)

# 但LVM提供的好处:
# 1. 在线扩容
lvextend -L +100G /dev/vg0/lv_data
resize2fs /dev/vg0/lv_data

# 2. 快照备份
lvcreate -n snap -L 10G -s /dev/vg0/lv_data

# 3. 条带化提升性能(多磁盘)
lvcreate -n striped -L 100G -i 2 vg0 /dev/sdb /dev/sdc

总结

Linux磁盘IO涉及多个层次:应用→VFS→文件系统→Page Cache→块设备→硬件。理解每个层次的作用,才能针对性地优化性能。

发表评论