Linux 性能优化实战
倪朋飞
资深 Linux 专家,Kubernetes 项目维护者
87256 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 65 讲
结束语 (1讲)
Linux 性能优化实战
15
15
1.0x
00:00/00:00
登录|注册

23 | 基础篇:Linux 文件系统是怎么工作的?

使用 /proc/slabinfo 查看目录项和索引节点缓存情况
使用 free 或 vmstat 观察页缓存的大小
使用 df -i 查看索引节点的使用情况
使用 df 命令查看磁盘空间使用情况
由内核维护的内存数据结构
记录文件的名字、索引节点指针和关联关系
持久化存储到磁盘中
记录文件的元数据
缓存
容量
同步I/O与异步I/O
阻塞I/O与非阻塞I/O
直接I/O与非直接I/O
缓冲I/O与非缓冲I/O
提供统一接口
抽象层,支持各种文件系统
目录项(dentry)
索引节点(inode)
Linux中一切皆文件
组织管理存储设备上的文件
性能观测
文件系统I/O
虚拟文件系统(VFS)
索引节点和目录项
文件系统
Linux文件系统工作原理

该思维导图由 AI 生成,仅供参考

你好,我是倪朋飞。
通过前面 CPU 和内存模块的学习,我相信,你已经掌握了 CPU 和内存的性能分析以及优化思路。从这一节开始,我们将进入下一个重要模块——文件系统和磁盘的 I/O 性能。
同 CPU、内存一样,磁盘和文件系统的管理,也是操作系统最核心的功能。
磁盘为系统提供了最基本的持久化存储。
文件系统则在磁盘的基础上,提供了一个用来管理文件的树状结构。
那么,磁盘和文件系统是怎么工作的呢?又有哪些指标可以衡量它们的性能呢?
今天,我就带你先来看看,Linux 文件系统的工作原理。磁盘的工作原理,我们下一节再来学习。

索引节点和目录项

文件系统,本身是对存储设备上的文件,进行组织管理的机制。组织方式不同,就会形成不同的文件系统。
你要记住最重要的一点,在 Linux 中一切皆文件。不仅普通的文件和目录,就连块设备、套接字、管道等,也都要通过统一的文件系统来管理。
为了方便管理,Linux 文件系统为每个文件都分配两个数据结构,索引节点(index node)和目录项(directory entry)。它们主要用来记录文件的元信息和目录结构。
索引节点,简称为 inode,用来记录文件的元数据,比如 inode 编号、文件大小、访问权限、修改日期、数据的位置等。索引节点和文件一一对应,它跟文件内容一样,都会被持久化存储到磁盘中。所以记住,索引节点同样占用磁盘空间。
目录项,简称为 dentry,用来记录文件的名字、索引节点指针以及与其他目录项的关联关系。多个关联的目录项,就构成了文件系统的目录结构。不过,不同于索引节点,目录项是由内核维护的一个内存数据结构,所以通常也被叫做目录项缓存。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Linux文件系统是操作系统的核心功能之一,它通过管理磁盘和文件的I/O性能来提供持久化存储和文件管理。在Linux中,一切皆文件,包括块设备、套接字、管道等,都通过文件系统进行管理。文件系统为每个文件分配索引节点和目录项,用来记录文件的元信息和目录结构。此外,Linux引入了虚拟文件系统VFS,作为用户进程和各种文件系统的抽象层,统一了文件系统的数据结构和标准接口。Linux文件系统可以分为基于磁盘、基于内存和网络文件系统三类,它们需要挂载到VFS目录树中的某个子目录才能访问其中的文件。文件I/O操作可以根据是否利用标准库缓存、是否利用操作系统的页缓存、是否阻塞自身运行以及是否等待响应结果进行分类。性能观测方面,可以通过命令行工具来观察文件系统的容量和缓存情况,以及使用slabtop来找到占用内存最多的缓存类型。总之,Linux文件系统的核心功能和性能观测方法为读者提供了深入了解文件系统原理和实际应用的基础,同时也展现了Linux文件系统的灵活性和多样性。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Linux 性能优化实战》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(75)

  • 最新
  • 精选
  • coyang
    课后题: 这个命令,会不会导致系统的缓存升高呢? --> 会的 如果有影响,又会导致哪种类型的缓存升高呢? --> /xfs_inode/ proc_inode_cache/dentry/inode_cache 实验步骤: 1. 清空缓存:echo 3 > /proc/sys/vm/drop_caches ; sync 2. 执行find : find / -name test 3. 发现更新top 4 项是: OBJS ACTIVE USE OBJ SIZE SLABS OBJ/SLAB CACHE SIZE NAME 37400 37400 100% 0.94K 2200 17 35200K xfs_inode 36588 36113 98% 0.64K 3049 12 24392K proc_inode_cache 104979 104979 100% 0.19K 4999 21 19996K dentry 18057 18057 100% 0.58K 1389 13 11112K inode_cache find / -name 这个命令是全盘扫描(既包括内存文件系统又包含本地的xfs【我的环境没有mount 网络文件系统】),所以 inode cache & dentry & proc inode cache 会升高。 另外,执行过了一次后再次执行find 就机会没有变化了,执行速度也快了很多,也就是下次的find大部分是依赖cache的结果。

    作者回复: 赞

    2019-01-11
    167
  • 小成
    请问老师,除了目录项以外还有哪些地方保存有文件名,下一节讲到目录项是一个内存缓存,那么不会保存文件名到磁盘上面?

    作者回复: 目录项是一个缓存,不是持久化存储。目录也是一个文件,这个特殊文件保存了该目录的所有文件名与inode的对应关系

    2019-02-01
    2
    17
  • 伟忠
    机器上 df 查看占用了 200G,但 du 查看发现只有 90G,看网上的办法用 lsof | grep delete 查看,但没有找到,请问老师,这个可能是什么原因呢?

    作者回复: 可能是文件本身已经删除了,但其描述符还被进程占用着,可以查找无效的文件描述符看看

    2019-01-12
    7
    16
  • 石维康
    阻塞 I/O 和非阻塞 I/O的概念和同步和异步 I/O的区别是什么?

    作者回复: 这个在答疑里统一回复吧

    2019-01-11
    4
    16
  • 肘子哥
    有个疑惑,如果目录项存在内存中是不是意味着内存故障后,目录就无法访问了呢?

    作者回复: 不会的,还可以从磁盘的持久化数据中重建

    2019-02-23
    4
    12
  • 董文荣
    课后题: Q:$ find / -name file-name 这个命令,会不会导致系统的缓存升高呢?如果有影响,又会导致哪种类型的缓存升高呢? A:分析 1)、"/"代表文件系统的根目录,目录项已经缓存在cached。(通过下面的测试,怀疑应该只是部分目录项的内容缓存在cache中,待验证) 2)、因为会匹配值“file-name“,会将索引节点读入缓存进行匹配。 因此会导致cached增长。以下是三组测试对比,给出了执行find命令前后,cached变化的对比。 命令之前前后,slabtop的执行前后对比: Active / Total Objects (% used) : 184412 / 240169 (76.8%) Active / Total Size (% used) : 42926.19K / 59199.82K (72.5%) OBJS ACTIVE USE OBJ SIZE SLABS OBJ/SLAB CACHE SIZE NAME 11088 2313 20% 0.57K 198 56 6336K radix_tree_node 10450 9515 91% 0.58K 190 55 6080K inode_cache 27510 12695 46% 0.19K 655 42 5240K dentry 4710 1003 21% 1.06K 157 30 5024K xfs_inode Active / Total Objects (% used) : 1795399 / 1809652 (99.2%) Active / Total Size (% used) : 1004316.02K / 1007573.47K (99.7%) OBJS ACTIVE USE OBJ SIZE SLABS OBJ/SLAB CACHE SIZE NAME 708420 708420 100% 1.06K 23614 30 755648K xfs_inode 787878 787878 100% 0.19K 18759 42 150072K dentry free命令在find命令执行前后结果对比: [root@localhost ~]# free -m total used free shared buff/cache available Mem: 1824 200 1534 15 89 1500 Swap: 2047 196 1851 [root@localhost ~]# free -m total used free shared buff/cache available Mem: 1824 480 105 15 1238 1161 Swap: 2047 196 1851 vmstat在find命令执行前后对比: [root@localhost /]# vmstat 2 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu---- r b swpd free buff cache si so bi bo in cs us sy id wa st 2 0 201208 1570636 136 92168 0 0 5 5 16 19 27 3 70 0 0 0 0 201208 1511788 136 149564 0 0 1702 0 491 599 2 6 90 1 0 0 0 201208 1509428 136 149716 0 0 1106 0 478 801 0 2 98 0 0 注:发表长度限制,省略部分测试显示

    作者回复: 原理分析加实践👍

    2019-01-21
    2
    7
  • Mr.Strive.Z.H.L
    老师您好: 关于目录项有一个疑惑: 通过目录项找到inode节点,从而访问具体的文件内容。其中inode和文件数据块都会被持久化,而目录项竟然不会被持久化,只是放在内存中进行缓存。 那么是否在每次开机时,内核都会自动构建文件系统完整的目录项,然后进行缓存??

    作者回复: 按需构建很少一部分目录项就可以了,不需要所有的目录项

    2019-01-27
    6
  • 成为祝福
    老师好,请问在slabtop中的inode_cache和ext4_inode_cache有什么区别呢?如果每个文件系统都有inode_cache,整个vfs的有效命名空间都映射到了对应的文件系统,vfs为什么还需要inode_cache呢?

    作者回复: 一个是VFS 虚拟文件系统的缓存,另一个则是具体的文件系统实现的缓存。 一个更好理解的例子是:操作系统有文件的缓存,而应用程序还会自己来分配内存缓存数据

    2019-01-16
    6
  • DJH
    请教三个问题。 1. 目录项是维护在内核中的一个内存数据结构,包括文件名。 我的问题是:文件名不是也应该存储在磁盘上么?不可能仅仅存在于内存吧? 2. 缓冲 I/O,是指利用标准库缓存来减速文件的访问... 我的问题时:减速文件访问的原因是什么? 3. 阻塞/非阻塞与同步/非同步的区别是什么?

    作者回复: 1. 目录项是表示目录之间的树状关系,而文件名则会存储到数据部分。 2. 不好意思,是个笔误,当然是加速。谢谢指出 3. 这个在文章中有简单的介绍,回来在答疑篇中再展开一些

    2019-01-11
    5
  • Geek_9815f1
    你要记住最重要的一点,在 Linux 中一切皆文件。不仅普通的文件和目录,就连块设备、套接字、管道等,也都要通过统一的文件系统来管理。 老师,上次听你 讲块设备和 文件系统的区别: 说块设备读写是绕过文件系统的。 现在是 块设备也通过统一的文件系统来管理。 这有矛盾吗?

    作者回复: 这儿说的是VFS

    2020-07-17
    3
    2
收起评论
显示
设置
留言
75
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部