首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
函数参数与返回值
传递变长参数
defer 和追踪
内置函数
递归函数
将函数作为参数
闭包
应用闭包:将函数作为返回值
使用闭包调试
计算函数执行时间
通过内存缓存来提升性能
声明和初始化
切片
For-range 结构
切片重组(reslice)
切片的复制与追加
字符串、数组和切片的应用
声明、初始化和 make
测试键值对是否存在及删除元素
for-range 的配套用法
map 类型的切片
map 的排序
将 map 的键值对调
标准库概述
regexp 包
锁和 sync 包
精密计算和 big 包
自定义包和可见性
为自定义包使用 godoc
使用 go install 安装自定义包
自定义包的目录结构、go install 和 go test
通过 Git 打包和安装
Go 的外部包和项目
在 Go 程序中使用外部库
结构体定义
使用工厂方法创建结构体实例
使用自定义包中的结构体
带标签的结构体
匿名字段和内嵌结构体
方法
类型的 String() 方法和格式化描述符
垃圾回收和 SetFinalizer
当前位置:
首页>>
技术小册>>
go编程权威指南(二)
小册名称:go编程权威指南(二)
前小节介绍了早期的 Linux 文件系统,本小节介绍 Linux 日志文件系统,**日志文件系统是给 Linux 操作系统增加了一些安全相关能力**,日志文件系统和早期的文件系统相比,它并不是先把数据写到中间存储设备,然后再写到存储设备索引节点的,而是**先把数据写道临时生成的文件中(称为日志),然后数据成功同步到存储设备和索引节点表,再删除对应的日志数据**。本小节介绍 Linux 常见的日志文件系统。 1\. ext3 文件系统介绍 --------------- `ext3` 文件系统是第三代扩展文件系统(Third extended filesystem,缩写为 `ext3`),它是一个日志文件系统,经常被用于 Linux 操作系统中,它是很多 Linux 发行版的默认文件系统。Stephen Tweedie 在 1999 年 2 月将该文件系统从 2.4.15 版本的内核开始,合并到内核主线中,它是对 `ext2` 系统的扩展,并且它兼容 `ext2`。 日志式文件系统的优越性在于:由于文件系统都有快取层参与运作,若不使用时必须将文件系统卸下,以便将快取层的资料写回磁盘中,因此每当系统要关机时,必须将其所有的文件系统全部 `shutdown` 后才能进行关机,若在文件系统尚未 `shutdown` 前就关机如(停电)时,下次重开机后会造成文件系统的资料不一致,故这时必须做文件系统的重整工作,将不一致与错误的地方修复。 然而,此一重整的工作是相当耗时的,特别是容量大的文件系统,而且也不能百分之百保证所有的资料都不会流失,此类文件系统最大的特色就是它会将整个磁盘的写入动作完整记录在磁盘的某个区域上,以便有需要时可以回溯追踪。当在某个过程中被中断时,系统可以根据这些记录直接回溯并重整被中断的部分,而不必花时间去检查其他的部分,故重整的工作速度相当快,几乎不需要花时间。 ### 1.1 ext3 日志文件系统特点 * **高可用性**:系统使用了 `ext3` 文件系统后,即使在非正常关机后,系统也不需要检查文件系统。宕机发生后,恢复 `ext3` 文件系统的时间只要数十秒钟。 * **数据的完整性**:`ext3` 文件系统能够极大地提高文件系统的完整性,避免了意外宕机对文件系统的破坏。在保证数据完整性方面,`ext3` 文件系统有两种模式可供选择。其中之一就是 `同时保持文件系统及数据的一致性` 模式。采用这种方式,你永远不再会看到由于非正常关机而存储在磁盘上的垃圾文件。 * **文件系统的速度**:尽管使用 `ext3` 文件系统时,有时在存储数据时可能要多次写数据,但是,从总体上看来,`ext3` 比 `ext2` 的性能还要好一些。这是因为 `ext3` 的日志功能对磁盘的驱动器读写头进行了优化。所以,文件系统的读写性能较之 `ext2` 文件系统并来说,性能并没有降低。 * **数据转换**:由 `ext2` 文件系统转换成 `ext3` 文件系统非常容易,只要简单地键入两条命令即可完成整个转换过程,用户不用花时间备份、恢复、格式化分区等。用一个 `ext3` 文件系统提供的小工具 `tune2fs`,它可以将 `ext2` 文件系统轻松转换为 `ext3` 日志文件系统。另外,`ext3` 文件系统可以不经任何更改,而直接加载成为 `ext2` 文件系统。 * **多种日志模式**:`ext3` 有多种日志模式,一种工作模式是对所有的文件数据及 `metadata`(定义文件系统中数据的数据,即数据的数据)进行日志记录(`data=journal` 模式);另一种工作模式则是只对 `metadata` 记录日志,而不对数据进行日志记录,也即所谓 `data=ordered` 或者 `data=writeback` 模式。系统管理人员可以根据系统的实际工作要求,在系统的工作速度与文件数据的一致性之间作出选择。 2\. ext4 文件系统介绍 --------------- `ext4` 是第四代扩展文件系统(Fourth extended filesystem,缩写为 `ext4`),它是 Linux 系统下的日志文件系统,是 `ext3` 文件系统的后继版本。`ext4` 是由 `ext3` 的维护者 `Theodore Tso` 领导的开发团队实现的,并引入到 Linux2.6.19 内核中。`ext4` 产生原因是开发人员在 `ext3` 中加入了新的高级功能,但在实现的过程出现了一些重要问题: * 一些新功能违背向后兼容性; * 新功能使 `ext3` 代码变得更加复杂并难以维护; * 新加入的更改使原来十分可靠的 `ext3` 变得不可靠。 由于上述原因,从 2006 年 6 月份开始,开发人员决定把 `ext4` 从 `ext3` 中分离出来进行独立开发。`ext4` 的开发工作从那时起开始进行,但大部分 Linux 用户和管理员都没有太关注这件事情,直到 2.6.19 内核在 2006 年 11 月的发布。`ext4` 第一次出现在主流内核里,但是它当时还处于试验阶段,因此很多人都忽视了它。 2008 年 12 月 25 日,`Linux Kernel 2.6.28` 的正式版本发布。随着这一新内核的发布,`ext4` 文件系统也结束实验期,成为稳定版。 ### 2.1 ext4 文件系统的特点 * **更大的文件系统和更大的文件**:`ext3` 文件系统最多只能支持 `32TB` 的文件系统和 `2TB` 的文件,根据使用的具体架构和系统设置,实际容量上限可能比这个数字还要低,即只能容纳 `2TB` 的文件系统和 `16GB` 的文件。而 `ext4` 的文件系统容量达到 `1EB`,而文件容量则达到 `16TB`,这是一个非常大的数字了。对一般的台式机和服务器而言,这可能并不重要,但对于大型磁盘阵列的用户而言,这就非常重要了。 * **更多的子目录数量**:`ext3` 目前只支持 `32000` 个子目录,而 `ext4` 取消了这一限制,理论上支持无限数量的子目录。 * **更多的块和i-节点数量**:`ext3` 文件系统使用 32 位空间记录块数量和 i-节点数量,而 `ext4` 文件系统将它们扩充到 `64` 位。 * **多块分配**:当数据写入到Ext3文件系统中时,Ext3的数据块分配器每次只能分配一个4KB的块,如果写一个 `100MB` 的文件就要调用 `25600` 次数据块分配器,而Ext4的多块分配器 `Multiblock Allocator(MBAlloc)` 支持一次调用分配多个数据块。 * **持久性预分配**:如果一个应用程序需要在实际使用磁盘空间之前对它进行分配,大部分文件系统都是通过向未使用的磁盘空间写入 `0` 来实现分配,比如 `P2P` 软件。为了保证下载文件有足够的空间存放,常常会预先创建一个与所下载文件大小相同的空文件,以免未来的数小时或数天之内磁盘空间不足导致下载失败。而 `ext4` 在文件系统层面实现了持久预分配并提供相应的 `API`,比应用软件自己实现更有效率。 * **延迟分配**:`ext3` 的数据块分配策略是尽快分配,而 `ext4` 的策略是尽可能地延迟分配,直到文件在缓冲中写完才开始分配数据块并写入磁盘,这样就能优化整个文件的数据块分配,显著提升性能。 * **盘区结构**:`ext3` 文件系统采用间接映射地址,当操作大文件时,效率极其低下。例如,一个 `100MB` 大小的文件,在 `ext3` 中要建立 `25600` 个数据块(以每个数据块大小为 `4KB` 为例)的映射表,而 `ext4` 引入了盘区概念,每个盘区为一组连续的数据块,上述文件可以通过盘区的方式表示为 `该文件数据保存在接下来的 25600 个数据块中`,提高了访问效率。 * **新的i-节点结构**:`ext4` 支持更大的 `i-节点`。之前的 `ext3` 默认的 `i-节` 点大小 `128` 字节,`ext4` 为了在 `i-节点` 中容纳更多的扩展属性,默认 `i-节点` 大小为 256 字节。另外,`ext4` 还支持快速扩展属性和 `i-节点` 保留。 * **日志校验功能**:日志是文件系统最常用的结构,日志也很容易损坏,而从损坏的日志中恢复数据会导致更多的数据损坏。`ext4` 给日志数据添加了校验功能,日志校验功能可以很方便地判断日志数据是否损坏。而且 `ext4` 将 `ext3` 的两阶段日志机制合并成一个阶段,在增加安全性的同时提高了性能。 * **支持无日志模式**:日志总归会占用一些开销。`ext4` 允许关闭日志,以便某些有特殊需求的用户可以借此提升性能。 * **默认启用Barrier**:磁盘上配有内部缓存,以便重新调整批量数据的写操作顺序,优化写入性能,因此文件系统必须在日志数据写入磁盘之后才能写 `Commit` 记录。若 `Commit` 记录写入在先,而日志有可能损坏,那么就会影响数据完整性。 `ext4` 文件系统默认启用 `Barrier`,只有当 `Barrier` 之前的数据全部写入磁盘,才能写 `Barrier` 之后的数据。 * **在线碎片整理**:尽管延迟分配、多块分配和盘区功能可以有效减少文件的碎片,但碎片还是不可避免会产生。`ext4` 支持在线碎片整理,并将提供 `e4defrag` 工具进行个别文件或整个文件系统的碎片整理。 * **支持快速fsck**:以前的文件系统版本执行 `fsck` 时很慢,因为它要检查所有的 `i-节点`,而 `ext4` 给每个块组的`i-节点` 表中都添加了一份未使用i-节点的列表,所以 `ext4` 文件系统做一致性检查时就可以跳过它们而只去检查哪些在使用的 `i-节点`,从而提高了速度。 * **支持纳秒级时间戳**:`ext4` 之前的扩展文件系统的时间戳都是以秒为单位的,这已经能够应付大多数设置,但随着处理器的速度和集成程度(多核处理器)不断提升,以及 `Linux` 开始向其他应用领域发展,它将时间戳的单位提升到纳秒。`ext4` 给时间范围增加了两个位,从而让时间寿命在延长 `500` 年,`ext4` 的时间戳支持的日期到 2514 年 4 月 25 日,而 `ext3` 只达到 2038 年 1 月 18 日。 3\. ReiserFS 文件系统介绍 ------------------- `ReiserFS` 是一种新型的文件系统,它通过一种与众不同的方式,完全平衡树结构来容纳数据,包括文件数据,文件名以及日志支持。`ReiserFS` 还以支持海量磁盘和磁盘阵列,并能在上面继续保持很快的搜索速度和很高的效率。与 `ext2` 相比,`ReiserFS` 有先进的日志 (`Journaling/logging`) 功能 机制。日志机制保证了在每个实际数据修改之前,相应的日志已经写入硬盘。文件与数据的安全性有了很大提高。 ### 3.1 ReiserFS 文件系统的特点 * **高效的磁盘空间利用**:`ReiserFS` 对一些小文件不分配 `inode`。而是将这些文件打包,存放在同一个磁盘分块中。而其它文件系统则为每个小文件分别放置到一个磁盘分块中。这意味着:如果有 `10000` 个小文件,就要占用 `10000` 个分块,有点浪费磁盘空间。 * **独特的搜寻方式**:`ReiserFS` 基于快速平衡树 (`balanced tree`) 搜索,平衡树在性能上非常卓越,这是一种非常高效的算法。`Reiser` 搜索大量文件时,搜索速度要比 `ext2` 快得多。`ReiserFS` 文件系统使用 `B*Tree` 存储文件,而其它文件系统使用 `B+Tree` 树。`B*Tree` 查询速度比 `B+Tree` 要快很多。`ReiserFS` 在文件定位上速度非常快。 在实际运用中,`ReiserFS` 在处理小于 `1k` 的文件时,比 `ext2` 快 8 到 15 倍,`ReiserFS` 几乎在各个方面都优于 `ext2`。 * **支持海量磁盘**:`ReiserFS` 是一个非常优秀的文件系统,可轻松管理上百 `G` 的文件系统,`ReiserFS` 文件系统最大支持的文件系统尺寸为 `16TB`。这非常适合企业级应用中。 * **优异的性能**:由于它的高效存储和快速小文件 `I/O` 特点,使用 `ReiserFS` 文件系统的 `PC`,在启动 `X` 窗口系统时,所花的时间要比在同一台机器上使用 `ext2` 文件系统少 `1/3`。另外,`ReiserFS` 文件系统支持单个文件尺寸为 `4G` 的文件,这为大型数据库系统在 `linux` 上的应用提供了更好的选择。 * **搜寻方式**:`ReiserFS` 是基于平衡树 (`STree`) 的文件系统结构,尤其对于大量文件的巨型文件系统,如服务器上的文件系统,搜索速度要比 `ext2`快,`ext2` 使用局部的二分查找法,综合性能比不上 `ReiserFS`。在 `Reiser4` 中还运用了文件即是目录的设计来管理 `meta-data`,并且运用了 `Hans Reiser` 自己发明的 `Dancing B-tree` ,效率提升非常明显。 * **空间分配和利用情况**:`ReiserFS` 里的目录是完全动态分配的,因此不存在 `ext2` 中常见的无法回收巨型目录占用的磁盘空间的情况。`ReiserFS` 里小文件(`< 4K`)可以直接存储进树,小文件读取和写入的速度更快,树内节点是按字节对齐的,小的文件可共享同一个硬盘块,节约大量空间。`ext2` 使用固定大小的块分配策略,也就是说,不到 `4K` 的小文件也要占据4K的空间,导致的空间浪费比较严重。 * **缺点**:出现异常断电的时候,会出现大量的未写入完全的数据。`ReiserFS` 会在恢复的时候进行 `rebuild-tree`。而这个过程是非常慢的。在 `ReiserFS` 的升级版本 `Reiser4` 中有所改观。 ### 3.2 ReiserFS 与 ext3 的比较 从技术层面来讲两者文件系统有很大的不同,但对于很多人来说,关注其中几点即可: * 第一,是你可以很方便地从 `ext2` 格式进行升级,因为到目前为止,很多 `Linux` 发行套件仍然在使用这种文件系统。 * 第二,就是 `ext3` 不仅可以记录数据日志(这在 `ext2` 中就已经具备),而且在此基础上还可以记录元数据 (`Metadata`)日志。现在的 `ReiserFS` 则只有日志元数据。 * 第三,就是文件系统的可扩展性。在介绍第三点以前,让我们先来看一看前两个不同点,因为第三点值得我们特别关注。就 `ext3` 来说,它可以方便地从 `ext2` 文件系统进行升级转换是其一大优势。当然,对于一直使用 `ReiserFS` 的人来说,这没有什么意义。但是,大多数用户并不愿意尝试使用 `ext3` 以外的任何一种日志文件系统。原因很简单,把 `ext2` 转换到 `ext3` 要比转换成其它任何一种文件系统更简单、快捷。 4\. JFS 文件系统介绍 -------------- `JFS`( `JOURNAL FILE SYSTEM`),一种字节级日志文件系统,借鉴了数据库保护系统的技术,以日志的形式记录文件的变化。JFS通过记录文件结构而不是数据本身的变化来保证数据的完整性。这种方式可以确保在任何时刻都能维护数据的可访问性。 ### 4.1 JFS 体系结构和设计 * **体系结构和设计**,`JFS` 体系结构可从磁盘布局特性的角度进行说明。 * **逻辑**,卷所有文件系统讨论的基础是某种类型的逻辑卷。 * **聚集和文件集**,文件系统创建实用程序 `mkfs`,创建了完全包含在分区内的聚集。聚集是包含一种特定格式的磁盘块阵列,其格式包括超级块和分配映射表。超级块将分区标识成 `JFS` 聚集,而分配映射表描述聚集内每个数据块的分配状态。格式还包括描述它所必需的初始文件集和控制结构。文件集是可安装的实体。 * **文件、目录、inode 与寻址结构**,文件集包含文件和目录。文件和目录由 `inode` 持续表示,每个 `inode` 描述文件或目录的属性,并作为查找磁盘上文件或目录数据的起始点。`JFS` 还使用 `inode` 来表示其它文件系统对象,如描述文件集中每个 `inode` 的分配状态和磁盘位置的映射表。目录将用户特定的名称映射到为文件和目录所分配的 `inode` 上,并且形成传统的命名层次。文件包含用户数据,用户数据中没有隐含任何限制或格式。也就是说,`JFS` 将用户数据看成是未解释的字节流。根植于 `inode` 基于盘区的寻址结构用来将文件数据映射到磁盘。聚集超级块和磁盘分配映射表、文件描述符和 `inode` 映射表、`inode`、目录以及寻址结构一起表示了 `JFS` 控制结构或元数据。 * **日志**,在每个聚集中维护 `JFS` 日志,并且用来记录元数据的操作信息。日志有一种同样由文件系统创建实用程序设置的格式。聚集内多个安装的文件集可以同时使用一个日志。 5\. XFS 文件系统介绍 -------------- `XFS` 一种高性能的日志文件系统,最早于 1993 年,由 `Silicon Graphics` 为他们的 `IRIX` 操作系统而开发,是 `IRIX 5.3` 版的默认文件系统。2000 年 5 月,`Silicon Graphics` 以 `GNU` 通用公共许可证发布这套系统的源代码,之后被移植到 `Linux` 内核上。`XFS` 特别擅长处理大文件,同时提供平滑的数据传输。`SGI` 发现他们的现有文件系统(`existing filesystem,EFS`)正在迅速变得不适应当时激烈的计算竞争。为解决这个问题,`SGI` 决定设计一种全新的高性能 64 位文件系统,而不是试图调整 `EFS` 在先天设计上的某些缺陷。因此,`XFS` 诞生了,并于 1994 年随 `IRIX 5.3` 的发布而应用于计算。 ### 5.1 XFS 文件系统的特点 * **数据完全性**,采用 `XFS` 文件系统,当意想不到的宕机发生后,首先,由于文件系统开启了日志功能,所以你磁盘上的文件不再会意外宕机而遭到破坏了。不论目前文件系统上存储的文件与数据有多少,文件系统都可以根据所记录的日志在很短的时间内迅速恢复磁盘文件内容。 * **传输特性**,`XFS` 文件系统采用优化算法,日志记录对整体文件操作影响非常小。`XFS` 查询与分配存储空间非常快。`XFS` 文件系统能连续提供快速的反应时间。笔者曾经对 `XFS`、`JFS`、`Ext3`、`ReiserFS` 文件系统进行过测试,`XFS` 文件文件系统的性能表现相当出众。 * **可扩展性**,`XFS` 是一个全 `64-bit` 的文件系统,它可以支持上百万 `T` 字节的存储空间。对特大文件及小尺寸文件的支持都表现出众,支持特大数量的目录。最大可支持的文件大 小为 `263 = 9 x 1018 = 9 exabytes`,最大文件系统尺寸为 `18 exabytes`。`XFS` 使用高的表结构(`B+` 树),保证了文件系统可以快速搜索与快速空间分配。`XFS` 能够持续提供高速操作,文件系统的性能不受目录中目录及文件数量的限制。 * **传输带宽**,`XFS` 能以接近裸设备 `I/O` 的性能存储数据。在单个文件系统的测试中,其吞吐量最高可达 `7GB` 每秒,对单个文件的读写操作,其吞吐量可达 `4GB` 每秒。 ### 5.2 XFS 文件系统的缺点 历史上 `XFS` 上的元数据操作曾比其它文件系统都慢,表现为在删除大量小文件时性能糟糕。该性能问题是被 `Red Hat` 的 `XFS` 开发者 `Dave Chinner` 在代码中定位到的。使用一个叫 “延迟记录” 的挂载选项可以成数量级地提升元数据操作的性能。该选项几乎把日志整个存在内存中。`Linux` 内核主线版本 `2.6.35` 中作为一个试验性特性引入了这个补丁,在 `2.6.37` 中使它成为了一个稳定的特性,并计划在 `2.6.39` 中把它作为默认的日志记录方法。早期测试显示在有少量线程的环境中其性能接近 `EXT4`,在大量线程的环境下超过了 `EXT4`。 6\. 小结 ------ 本小节介绍了 `ext3`、`ext4`、`ReiserFS`、`JFS`、`XFS` 日志相关的文件系统的特点,日志文件系统为 Linux 系统增加了一层安全性,熟悉这些文件系统之后,你就知道了 Linux 系统中有多个文件系统,除了默认使用的文件系统之外,还有可供选的文件系统。
上一篇:
文件系统介绍
下一篇:
修改服务器时间
该分类下的相关小册推荐:
Go Web编程(上)
深入浅出Go语言核心编程(三)
深入解析go语言
Go-Web编程实战
go编程权威指南(一)
深入浅出Go语言核心编程(六)
企业级Go应用开发从零开始
深入浅出Go语言核心编程(一)
深入浅出Go语言核心编程(四)
WebRTC音视频开发实战
GO面试指南
Go开发权威指南(上)