Linux File System 及存储系统简介

Linux 中典型的文件系统模型(以接口形式)如下图: [1]

File System Cache

典型的 File System Cache 模型如下图:

因为文件系统缓存(File System Cache)的存在,在统计 Applications 的读写请求延迟(IO Latency)时,要注意区分分析的统计数据是 文件系统(File System)的延迟(Request Latency) 还是 物理存储设备(Physical Device)的延迟

OS 通常提供的 IO 统计数据是 存储设备级别(Disk Device-level) ,而不是 文件系统级别(File System Level) ,但是大多数情况下,影响 Application 性能的通常是 File System 级别的延迟(Latency),而不是物理存储设备(Physical Device)级别的延迟。比如 File System 对 Application 的写操作(Write Operations)会进行缓存(Buffers),缓存成功后立即向 Application 返回写成功的响应,文件系统会在后台定期的将 Buffer 里面的内容刷新(Write-back, 写回)回磁盘设备,这个写回操作会导致磁盘设备出现较高或者突发(Burstable)的 Disk IO Latency,从 Disk Device-level 统计数据来看,这可能是个问题,但是,Application 并不需要等待此时的写回操作,此时的 Disk Device-level IO Latency 对 Application 无任何的性能影响。

File System 通常使用 Main Memory(RAM)作为缓存(Cache)介质来提高性能 ,Cache 的处理过程对 Applications 来说是透明的。

OS 中 File System 涉及到的相关 Cache 如下表:

Cache Example
Page cache Operating system page cache
File system primary cache ZFS ARC
File system secondary cache ZFS L2ARC
Directory cache dentry cache
inode cache inode cache
Device cache ZFS vdev
Block device cache Buffer cache

Prefetch

文件系统预取(File System Prefetch) 是 Linux 内核的一种优化机制,用于 提前加载 可能会被访问的文件或数据到内存,以提高 读取性能系统响应速度

当程序读取文件时,Linux 内核可能会:

  • 提前读取相邻的数据块,即顺序预取(Read-Ahead)
  • 基于访问模式预测未来的数据请求,即智能预取(Adaptive Readahead)
  • 结合缓存管理(Page Cache)减少磁盘 I/O,提高性能

Linux 文件系统预取主要依赖于以下几种机制:

  • Page Cache(页缓存) 。Linux 通过 Page Cache 缓存已经读取的数据,以 减少磁盘 I/O,提高性能
    • 当进程请求读取文件时,内核会先检查 Page Cache,如果数据已存在,则直接返回,避免磁盘读取。
    • 如果数据不在缓存中,Linux 会从磁盘加载数据,并存入 Page Cache,方便后续访问。
  • Read-Ahead(预读机制) 是 Linux 预取的核心机制之一,它会 提前加载文件数据,减少未来读取时的磁盘 I/O
    • 当应用程序顺序读取文件时,Linux 会自动预取更多的数据,提高性能。
    • Linux 预取大小 动态调整 ,如果发现访问是顺序的,会增加预取数据量。
  • Readahead 调优参数 。Linux 通过 /sys/class/bdi/ 目录下的参数进行 Read-Ahead 调优
    • /sys/class/bdi/default/read_ahead_kb 这个值通常默认为 128 KB 或 256 KB,表示内核每次读取至少 128 KB 以优化性能。
    • echo 1024 > /sys/class/bdi/default/read_ahead_kb 设置为 1024 KB(1MB),适用于 大文件顺序读取
    • Fadvise 和 Madvise 提示 。Linux 提供了 posix_fadvise()madvise() ,让应用程序 主动提示内核 预取策略
      • posix_fadvise(fd, offset, len, POSIX_FADV_WILLNEED) 提示内核: 这个文件很快会被读取,可以提前加载进 Page Cache
      • posix_fadvise(fd, offset, len, POSIX_FADV_SEQUENTIAL) 告诉内核: 文件是顺序读取的,可以增大 Read-Ahead
  • Prefetching Daemon(预取守护进程)

查看和设置当前 Read-Ahead 的值,单位为 Block,一般为 512B

# lsblk 
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 9.1T 0 disk
├─sda1 8:1 0 1M 0 part
├─sda2 8:2 0 1G 0 part /boot
├─sda3 8:3 0 32G 0 part [SWAP]
└─sda4 8:4 0 9.1T 0 part /

# blockdev --getra /dev/sda
256

# blockdev --setra 512 /dev/sda

# blockdev --getra /dev/sda
512

Write-Back Caching

Write-Back Caching 通常用于文件系统 写缓存(Write Cache、Buffer) ,在 Application 需要写入内容时,文件系统将数据写入 Main Memory 就算成功,文件系统随后再将内容(Dirty Data)异步(Asynchronous)写入(Flushing)磁盘(Disk),通过此过程来 提高文件系统写入性能

在文件系统使用 Write-Back Caching 的情况下,假如应用程序发布(Issue)了写请求(Write Requests),Kernel 将内容写入 Main Memory 后便向 Application 返回了写入成功的响应,假设此时系统断电,因为缓存中的内容(Dirty Data)并未写入(Flushing)磁盘(Disk),会导致 RAM 中的内容丢失,出现文件不一致的情况,为了平衡 性能(Performance)和可靠性(Reliability),File System 会默认使用 Write-Back Caching,同时提供 同步写(Synchronous Write)选项来跳过 Write-Back Caching,直接将数据写入磁盘(Disk/Persistent Storage Device)

Synchronous Write

Synchronous Write(同步写入) 只有当数据完全写入 Persistent Storage Device(持久化存储设备)后才算写入完成,包括任何的 File System Metadata 的变更。它比 Asynchronous Writes(Write-Back Caching) 慢,因为需要额外的 Disk Device IO Latency 以及 File System Metadata 变更导致的 IO,Synchronous Write 通常应用在对数据一致性要求较高的应用中,如 Database Log Writers.

Raw IO

Raw IO 直接向存储设备发送请求,完全绕过了文件系统,通常在 Database 场景中较为常见,因为数据库软件可以比文件系统更好的管理和缓存他们的数据,缺点是其增加了软件的复杂度和管理的复杂度。

存储设备接口

在计算机存储领域,SCSI、SAS、ATA、SATA、FC 和 NVMe 是常见的存储接口标准。以下是对这些接口的简要介绍和比较:

接口类型 传输方式 最大传输速率 特点说明 应用场景
ATA(Advanced Technology Attachment)
也称为 IDEPATA
并行 133 MB/s 是一种并行接口标准,主要用于连接存储设备。由于传输速度和性能的限制,ATA 已逐渐被 SATA 所取代。 个人电脑(已被淘汰)
SATA(Serial ATA) 串行 6 Gbps SATA 是 ATA 的串行版本,旨在提高传输速度和效率。它采用串行通信方式,具有更高的传输速率和更长的电缆长度。
传输速度高,支持热插拔,广泛应用于个人电脑和低端服务器。
个人电脑、低端服务器
SCSI(Small Computer System Interface) 并行 320 MB/s 最初用于连接计算机与硬盘、光驱等外部设备。它支持多设备连接,具有较高的传输速度和可靠性。
支持多任务处理,系统占用率低,适用于服务器等高端应用场景。
服务器、高端存储
SAS(Serial Attached SCSI) 串行 12 Gbps SAS 是 SCSI 的串行版本,旨在提高传输速度和扩展性。它采用串行通信方式,支持更高的传输速率,并向下兼容 SATA 设备。
传输速度高,支持热插拔,适用于企业级存储系统。SAS 控制器可以直接控制 SATA 硬盘,但 SATA 控制器无法控制 SAS 硬盘。
企业级存储
FC(Fibre Channel) 串行 16 Gbps FC 是一种高速网络技术,最初用于连接大型存储系统。它支持高带宽和低延迟,常用于存储区域网络(SAN)。传输速度高,可靠性强,适用于大型企业级存储环境。 存储区域网络
NVMe 串行 32 Gbps(PCIe 4.0 x4) NVMe 是为固态硬盘(SSD)设计的高速接口协议,旨在充分利用 NAND 闪存的性能优势。它通过 PCIe 总线直接与 CPU 通信,提供低延迟和高并发性。
传输速度极高,延迟低,适用于高性能存储需求。
高性能存储

Observability Tools

在基于 Linux 的系统中,可以使用以下工具来观察存储设备(磁盘)I/O 的性能统计数据

Tool Description Examples
iostat 存储设备(磁盘)上的 IO 统计数据及 CPU 使用率
sar -b 文件系统层(VFS)的 IO 统计数据 sar 命令使用参考
sar -d 物理磁盘(存储设备)层上的 IO 统计数据 sar 命令使用参考

iostat

iostat 查看系统上的存储设备及分区的 IO 使用情况,常用选项及输出指标说明请参考 man iostat

# iostat -h -p -x 1 
Linux 3.10.0-1160.36.2.el7.x86_64 (qz1-aws-flutter-api2) 02/14/2025 _x86_64_ (32 CPU)

avg-cpu: %user %nice %system %iowait %steal %idle
9.36 0.00 3.15 0.00 0.03 87.46

Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
nvme0n1
0.00 0.18 0.02 3.25 0.50 124.24 76.37 0.00 0.90 0.62 0.90 0.85 0.28
nvme0n1p1
0.00 0.18 0.02 3.25 0.50 124.24 76.37 0.00 0.90 0.62 0.90 0.85 0.28

参考链接|Bibliography

Systems Performance: Enterprise and the Cloud v2

脚注