0

0

Linux存储系统原理解析_数据读写流程说明【教程】

舞夢輝影

舞夢輝影

发布时间:2026-01-02 15:34:03

|

731人浏览过

|

来源于php中文网

原创

VFS层将write()系统调用统一转为对inode和page cache的操作,屏蔽文件系统差异;数据仅在调用fsync()/sync()后才落盘,否则停留于内存脏页,由writeback线程按dirty_ratio阈值异步刷回。

linux存储系统原理解析_数据读写流程说明【教程】

数据写入时,VFS 层到底做了什么

Linux 写操作不会直接触达磁盘,而是先经过 VFS(Virtual File System)抽象层。它把 write() 系统调用统一转成对 inode 和 page cache 的操作,屏蔽了 ext4、XFS、Btrfs 等具体文件系统的差异。

关键点在于:只要没显式调用 fsync()sync(),数据就只停留在内存的 page cache 中,尚未落盘。

  • write() 返回成功 ≠ 数据已写入磁盘
  • 脏页(dirty page)由内核线程 pdflush(旧内核)或 writeback(4.0+)异步刷回
  • /proc/sys/vm/dirty_ratio/proc/sys/vm/dirty_background_ratio 控制刷盘触发阈值

ext4 文件系统如何分配磁盘块

ext4 使用 extent(连续块描述)替代早期 ext2/3 的间接块指针,在大文件场景下显著减少元数据开销。一个文件的物理布局由 inode 中的 i_block[] 数组 + extent tree 共同描述。

当需要新块时,ext4 优先在同一个 block group 内分配,以提升局部性;若空间不足,则触发跨 group 搜索,并可能触发 lazy initialization(如未格式化的 block group 被跳过初始化)。

  • 每个 block group 包含自己的 bitmap、inode table 和 data blocks,避免全局锁争用
  • 使用 chattr +e 可强制启用 extent 模式(新建文件默认已启用)
  • 碎片严重时,e2fsck -D 可重建目录索引,但不整理文件数据块

从 write() 到磁盘扇区:IO 逐层穿透

用户态 write() 发起后,路径为:libc → syscall → VFS → filesystem (ext4) → block layer → device driver → disk firmware。其中 block layer 是关键枢纽,负责 IO 合并、排序、限速和队列调度。

Amazon Nova
Amazon Nova

亚马逊云科技(AWS)推出的一系列生成式AI基础模型

下载

常见误区是认为“写得快 = 磁盘快”,其实瓶颈常卡在 block layer 的 queue depth 或 scheduler 策略上:

  • SSD 推荐用 nonemq-deadline 调度器,避免传统电梯算法引入额外延迟
  • cat /sys/block/sda/queue/scheduler 查看当前调度器,echo mq-deadline > /sys/block/sda/queue/scheduler 可临时切换
  • NVMe 设备默认使用 none(即 bypass scheduler),但部分老内核需手动设置
echo 'vm.dirty_ratio = 30' >> /etc/sysctl.conf
echo 'vm.dirty_background_ratio = 5' >> /etc/sysctl.conf
sysctl -p

读取时 page cache 命中与绕过的条件

read() 默认走 page cache 路径:先查该文件对应 offset 是否已在内存中;命中则直接拷贝,不发磁盘 IO。但以下情况会绕过 cache:

  • 打开文件时指定 O_DIRECT 标志,要求 kernel bypass page cache,直接与设备驱动交互
  • 使用 posix_fadvise(fd, offset, len, POSIX_FADV_DONTNEED) 主动丢弃缓存页
  • 内存紧张时,kernel 可能回收 clean page(未修改的缓存页),下次读仍需 IO

O_DIRECT 要求用户缓冲区地址、偏移、长度均按 logical_block_size 对齐(通常是 512B 或 4K),否则 write() 返回 -EINVAL

实际调试时,strace -e trace=write,read,fsyncblktrace -d /dev/sda 能清晰区分是应用层逻辑问题,还是底层 IO 调度或硬件响应慢。page cache 的存在让“读写快”变得廉价,但也让“数据持久性”变成需要主动管理的事。

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

371

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

563

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

473

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

473

2023.08.10

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

389

2023.08.14

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

1345

2023.06.21

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

700

2023.06.29

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

294

2023.06.30

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

74

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 6.4万人学习

Git 教程
Git 教程

共21课时 | 2.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号