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 |
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) 也称为 IDE 、PATA |
并行 | 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 |
参考链接|Bibliography
Systems Performance: Enterprise and the Cloud v2
脚注
- 1.Systems Performance: Enterprise and the Cloud v2 #8.2.1 File System Interfaces ↩