30 | 文件缓存:常用文档应该放在触手可得的地方
该思维导图由 AI 生成,仅供参考
系统调用层和虚拟文件系统层
ext4 文件系统层
- 深入了解
- 翻译
- 解释
- 总结
本文深入探讨了文件系统的读写过程,重点介绍了缓存I/O和直接I/O两种文件I/O操作类型,以及其在ext4文件系统中的实现。通过对文件系统到块设备的分界线部分的讲解,为读者呈现了一个完整的文件系统读写的技术架构。文章详细介绍了文件写入的过程,包括对于每一页的准备、将写入的内容从用户态拷贝到内核态的页中、完成写操作以及回写脏页的机制。此外,还介绍了ext4文件系统的日志模式和缓存页的管理方式。通过对ext4_write_begin、grab_cache_page_write_begin和balance_dirty_pages_ratelimited等函数的解析,读者可以深入了解文件系统的内部实现和数据一致性的保障机制。总的来说,本文通过深入的技术分析,为读者呈现了文件系统读写过程的细节和实现原理,对于理解文件系统的工作原理和性能优化具有重要的参考价值。 在读取和写入的分析中,文章展示了文件系统读写过程的复杂性,通过调用图展示了系统调用层、VFS层和ext4层的调用关系。此外,还介绍了缓存I/O和直接I/O的读写流程,以及如何查询和清除文件系统缓存。这些内容为读者提供了全面的文件系统读写过程的认识和理解,对于深入学习和研究文件系统技术具有重要的指导意义。
《趣谈 Linux 操作系统》,新⼈⾸单¥68
全部留言(23)
- 最新
- 精选
- 石维康查看文件缓存:通过free命令中的buff/cache一栏的信息即可看到文件缓存的用量。 清除缓存:sync; echo 1 > /proc/sys/vm/drop_caches
作者回复: 赞
2019-06-0538 - 莫名“ext4_direct_IO 最终会调用到 __blockdev_direct_IO->do_blockdev_direct_IO,这就跨过了缓存层,直接到了文件系统的设备驱动层。” 觉得这个说法并不准确,绕过缓存,但并没有直接到达设备驱动层,而是通用块层,主要用于io合并之类操作,然后才是设备驱动层。
作者回复: 是的。赞,谢谢指正
2019-07-2215 - 刘桢打卡,今年12月冲北邮!
作者回复: 加油
2019-06-05312 - 马媛媛请问 ext4的Journal 模式有什么优势呢,有日志逐条落盘的这个开销,为啥write不直接落盘呢?
作者回复: 写入日志由于是顺序的,写入速度快很多
2019-06-069 - 啦啦啦老师,我想问下,在学习mysql实战45讲这个课程里面,讲了数据库也有脏页和干净页,以及如何将脏页刷回磁盘的几个时机,请问这个机制是和本节课讲的操作系统的机制是一回事吗?谢谢老师
作者回复: 不一样,那是数据库层次的,不是操作系统层次的。
2019-07-2537 - 玉剑冰锋请教老师个问题1.系统默认脏页多长时间或者数量是多少的时候触发事件?2.如果脏页在回写过程中出现故障如何保证数据完整性?3.这里只是提到ext4,其他文件系统跟ext4相比原理一样吗?比如xfs?
作者回复: vm.dirty_background_bytes = 0 vm.dirty_background_ratio = 10 vm.dirty_bytes = 0 vm.dirty_expire_centisecs = 3000 vm.dirty_ratio = 30 vm.dirty_writeback_centisecs = 500 每个文件系统各自有各自的格式
2019-06-124 - djfhchdhfree命令查看缓存
作者回复: 赞
2019-06-201 - brian缓存I/O 内核缓存区 等于 内核缓冲区么 ? 缓存,缓冲含义不是不同的吗?
作者回复: 是一个意思,用词有点随意了
2020-05-28 - why- 系统调用层和虚拟文件系统层 - 调用 read/write 进行读写 → vfs_read/write → __vfs_read/write - 打开文件时创建 struct file, 其中有 file_operations, 虚拟文件系统调用 operations 中的 read/write - ext4 文件系统层 - 调用到 generic_file_read/write_iter, 其中判断是否需要使用缓存 - 缓存, 即内存中一块空间, 可分为两类 I/O - 缓存 I/O: 默认模式, 读操作先检测缓存区中是否有, 若无则从文件系统读取并缓存; 写操作直接从用户空间赋值到内核缓存中, 再由 OS 决定或用户调用 sync 写回磁盘 - 直接 I/O: 程序直接访问磁盘, 不经过缓存 - 直接 I/O 过程: - 读: 若设置了 IOCB_DIRECT, 调用 address_space 的 direct_io 直接读取硬盘( 文件与内存页映射) ; 若使用缓存也要调用 address_sapce 进行文件与内存页的映射 - 写: 若设置了 IOCB_DIRECT, 调用块设备驱动直接写入磁盘 - 带缓存写过程 - 在 while 循环中, 找出写入影响的页, 并依次写入, 完成以下四步 - 每一页调用 write_begin 做准备 - 将写入内容从用户态拷贝到内核态 - 调用 write_end 完成写入 - 查看脏页 (未写入磁盘的缓存) 是否过多, 是否需要写回磁盘 - write_begin 做准备 - ext4 是日志文件系统, 通过日志避免断电数据丢失 - 文件分为元数据和数据, 其操作日志页分开维护 - Journal 模式下: 写入数据前, 元数据及数据日志必须落盘, 安全但性能差 - Order 模式下: 只记录元数据日志, 写日志前, 数据必须落盘, 折中 - Writeback 模式下: 仅记录元数据日志, 数据不用先落盘 - write_begin 准备日志, 并得到应该写入的缓存页 - 内核中缓存以页为单位, 打开文件的 file 结构中用 radix tree 维护文件的缓存页 - iov_iter_copy_from_user_atomic 拷贝内容, kmap_atomic 将缓存页映射到内核虚拟地址; 将拥护他数据拷贝到内核态; kunmap_aotmic 解映射 - write_end, 先完成日志写入 并将缓存设置为脏页 - 调用 balance_dirty_pages_ratelimited 若发先脏页超额, 启动一个线程执行回写. - 回写任务 delayed_work 挂在 bdi_wq 队列, 若delay 设为 0, 马上执行回写 - bdi = backing device info 描述块设备信息, 初始化块设备时回初始化 timer, 到时会执行写回函数 - 另外其他情况也会回写 - 用户调用 sync 或内存紧张时, 回调用 wakeup_flusher_threads 刷回脏页 - 脏页时间超过 timer, 及时回写 - 带缓存读 - generic_file_buffered_read 从 page cache 中判断是否由缓存页 - 若没则从文件系统读取并预读并缓存, 再次查找缓存页 - 若有, 还需判断是否需要预读, 若需要调用 page_cache_async_readahead - 最后调用 copy_page_to_user 从内核拷贝到用户空间2019-06-07221
- sugar看完了老师讲的文件系统的几节,收获颇丰。但如果想要自己去实践一下,很想知道有没有像wireshark那样的网络抓包工具一样底层的 可以针对文件系统,磁盘物理结构进行监控 分析的工具呢?google了一番没找到...2019-06-1414