通用线程: 高级文件系统实现者指南,第 8 部分_VMware, Unix及操作系统讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  VMware, Unix及操作系统讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3511 | 回复: 0   主题: 通用线程: 高级文件系统实现者指南,第 8 部分        下一篇 
cc
注册用户
等级:中校
经验:1900
发帖:195
精华:0
注册:2011-7-25
状态:离线
发送短消息息给cc 加好友    发送短消息息给cc 发消息
发表于: IP:您无权察看 2011-9-9 10:58:33 | [全部帖] [楼主帖] 楼主

我实话实说。我本来计划用这篇文章向您展示如何在系统上设置和运行 ext3。尽管我这么说,但我并不打算这么做。Andrew Morton 那个很棒的“在 2.4 内核中使用 ext3 文件系统”页面(请参阅本文后面的 参考资料)已经很好地解释了如何在系统上启用 ext3,因此我没必要在这里重复所有基本概念。而是深入钻研某些更耐人寻味的 ext3 主题,我认为您会发现这些主题非常有用。阅读了这篇文章后,当您准备设置和运行 ext3 时,请参考 Andrew 的页面。

2.4 内核更新

首先,让我们从 2.4 内核更新开始。我在介绍 ReiserFS 时最后讨论到 2.4 内核稳定性。在那个时候,要找到一个稳定的 2.4 内核是个难题,我建议坚持使用已知的内核(那时最前沿的是 2.4.4-ac9 内核)― 特别对于计划在生产环境中使用 ReiserFS 文件系统的那些人。您可能猜到,自从 2.4.4-ac9 以来发生了许多事,而现在无疑是着眼于更新的内核的时候了。

随着内核 2.4.10 的出现,在性能和可伸缩性方面,2.4 系列达到了新的层次(这是我们盼望已久的)。那么,是什么碰巧让 Linux 2.4 最终成长起来的呢?用首字母缩写词表示,就是 VM。在认识到 2.4 系列表现不是非常出色后,Linus 去除了 Linux 有问题的 VM 代码,并用 Andrea Archangeli 开发的简单而普通的 VM 实现来替代。Andrea 的新 VM 实现(最先出现在 2.4.10 中)非常了不起;它真正提高了内核速度,并使整个系统反应更迅速。2.4.10 绝对是 2.4 Linux 内核开发中一个主要的转折点;到那时为止,事物还不是非常完美,我们当中有许多人都奇怪为什么自己不是 FreeBSD 开发人员。我们都应该感谢 Linus 在 2.4 稳定内核系列中所做的这些主要(但迫切需要)的更改。这的确是一件了不起的事。

因为 Andrea 的新 VM 代码需要一些时间才能与内核其余部分达到无缝集成,所以使用 2.4.13+。使用 2.4.16+ 会更好,因为稳固的 ext3 文件系统代码最终是集成到从 2.4.15-pre2 发行版开始的正式 Linus 内核中的。没有理由避免使用 2.4.16+ 内核,它能使设置和运行 ext3 的工作更为轻松。如果确实使用 2.4.16+ 内核,记住不再需要象 Andrew 的页面上所描述的那样应用 ext3 补丁了(请参阅 参考资料)。Linus 已经为您添加了它 :)

您会注意到我建议使用 2.4.16+ 而非 2.4.15+,这是有充分理由的。随着内核 2.4.15-pre9 的发行,给内核引入一个非常讨厌的文件系统崩溃错误。直到 2.4.16-pre1 才发现并解决了这个问题,导致人们应该不计任何代价地避免使用这两个发行版之间的内核(包括 2.4.15)。选择 2.4.16+ 内核可以让您完全避免这个错误的批处理。



回页首

膝上电脑……小心?

Ext3 是一种稳固的文件系统,这个好名声由来已久,因此我在知道有相当多的膝上电脑用户在切换到 ext3 时有文件系统崩溃问题时很诧异。一般来说,对这些类型的报告做出的反映往往是完全避免使用 ext3;不过,在到处打听之后,我发现人们所遇到的磁盘崩溃问题与 ext3 本身并没有关系,而是由某些膝上电脑硬盘所引起的。

写高速缓存

您可能不知道,但大多数新式硬盘有一个称为“写高速缓存”的东西,硬盘使用它来收集暂时被挂起的写操作。通过将暂挂的写操作放到高速缓存中,硬盘固件就可以重新为它们排序,并为它们分组,以便用尽可能最快的方式将它们写到磁盘中。通常认为写高速缓存是个非常好的事物(请阅读 参考资料中 Linus 对写高速缓存的解释和看法)。

不幸的是,现在市场上某些膝上电脑的硬盘具有这样一种不可靠的特性,即忽略将它们的写高速缓存刷新到磁盘上的所有正式 ATA 请求。虽然直到最近 ATA 规范

允许这种做法,但这并不是一种完美的设计特性。使用这些类型的驱动器,内核无法保证某一特定块实际上是否被记录到磁盘上。尽管听上去这是个棘手的问题,但这个特定问题本身可能不是人们所遇到的数据毁坏问题的原因。

不过,情况越来越差。一些新式膝上电脑的硬盘有一个更令人讨厌的习惯:每当重新引导或暂挂系统,就 丢弃

它们的写高速缓存。很明显,如果硬盘有这两个问题,就会定期破坏数据,而 Linux 对于防止这种情况束手无策。

那么,解决方案是什么呢?如果您有膝上电脑,请小心使用。在对文件系统执行任何重大更改之前备份所有重要文件。如果遇到似乎符合上面我所描述的模式的数据毁坏问题,特别在使用 ext3 时,记住这可能是您膝上电脑硬盘的错。在这种情况下,您需要与膝上电脑制造商联系,并询问更换驱动器事宜。希望在几个月后,这些脆弱的硬盘将从市场上消失,我们就再也不必担心这个问题了。

既然我已经警告过您要小心,就让我们看看 ext3 的各种数据日志记录选项。



日志记录选项和写等待时间

在安装文件系统时,Ext3 允许您从三种数据日志记录方式中选择一个: data=writeback 、 data=ordered 和 data=journal 。

要指定日志方式,可以向 /etc/fstab 的选项节添加适当的字符串(例如 data=journal ),也可以在调用 mount 时直接指定 -o data=journal 命令行选项。如果您愿意指定用于根文件系统的数据日志记录方法( data=ordered 是缺省值),则可以使用名为 rootflags 的特殊内核引导选项。因此,如果愿意将根文件系统置于完整数据日志记录方式下,则向内核引导选项添加 rootflags=data=journal 。

data=writeback 方式

处于 data=writeback 方式下,ext3 根本不执行任何形式的数据日志记录,提供给您的是和在 XFS、JFS 和 ReiserFS 文件系统中找到的类似的日志记录(仅元数据)。正如我在 前一篇文章中讲到过,这会让最近修改的文件在出现意外的重新引导事件中被毁坏。如果不考虑这个缺点, data=writeback 方式在大多数情况下应该能够为您提供最佳的 ext3 性能。

data=ordered 方式

处于 data=ordered 方式下,ext3 只是正式记录元数据,而在逻辑上将元数据和数据块分组到称为事务的单个单元中。到了将新的元数据写到磁盘上的时候, 首先

写的是相关的数据块。 data=ordered 方式有效地解决了在 data=writeback 方式 下和大多数其它日志记录文件系统中发现的毁坏问题,而这是在不需要完整数据日志记录的情况下做到的。一般说来, data=ordered ext3 文件系统执行的速度比 data=writeback 文件系统执行的速度稍微慢一些,但比对应的完整数据日志记录还是要快出许多。

将数据 附加

到文件时, data=ordered 方式提供了 ext3 完整数据日志记录方式提供的所有完整性保证。不过,如果正在

覆盖

某一部分文件,而此时系统崩溃,那么有可能所写的区将包含原始块和在其中散布了更新块的组合。这是因为 data=ordered 不提供首先覆盖哪一个数据块的保证,因此不能假设只是因为更新了被覆盖的块 x,也就更新了被覆盖的块 x-1。 data=ordered 让写操作顺序由硬盘的写高速缓存决定。一般说来,这个限制并不经常对人们具有负面影响,因为附加的文件一般比覆盖的文件更普遍。出于这个原因, data=ordered 方式是对完整数据日志记录的一个很好的更高性能的替代。

data=journal 方式

data=journal 方式提供了完整数据和元数据日志记录。所有新数据首先写入日志,然后再写入它的最终位置。在崩溃情况下,可以重放日志,使数据和元数据处于一致的状态。

从理论上说, data=journal 方式是所有日志记录方式中最慢的,因为要将数据写入磁盘两次而不是一次。不过,在某些情况下, data=journal 方式也可以是极快的。Andrew Morton 在听取了有关 LKML 的报告(ext3 data=journal 文件系统为人们提供了难以置信的出色的交互式文件系统性能)后,决定组合出一个小测试。首先,他创建了一个简单的 shell 脚本,该脚本设计用来将数据尽快写入测试文件系统:

快速写

while true
do
dd if=/dev/zero of=largefile bs=16384 count=131072
done


在将数据写入测试文件系统的同时,他尝试从 位于同一磁盘

上的另一个 ext2 文件系统中读取 16Mb 的数据,并对此进行计时:

读取 16Mb 的文件

time cat 16-meg-file > /dev/null


结果让人惊奇。 data=journal 方式允许 16 兆文件以比其它 ext3 方式、ReiserFS,甚至 ext2(没有日志记录开销)高出 9 到 13 倍

的速度读取:

写入文件系统 16 兆读取时间(秒) ext2 78 ReiserFS 67 ext3 data=ordered 93 ext3 data=writeback 74 ext3 data=journal 7

Andrew 重复这个测试,但尝试从测试文件系统(而不是从其它文件系统)读取 16Mb 的文件,获得的结果是相同的。那么,这意味着什么呢?不知什么原因,ext3 的 data=journal 方式非常适合于需要同时从磁盘读写数据的情况。 因此,ext3 的 data=journal 方式(被认为在几乎所有情况中是所有 ext3 方式中最慢的)实际上证明在需要最大化交互式 IO 性能的繁忙环境中具有重要的性能优势。可能 data=journal 方式毕竟没那么缓慢!

Andrew 仍然在尝试发现究竟为什么 data=journal 方式比其它方式好这么多。在这样做的同时,他也许能够对 ext3 的另外两种方式做必要调整,以便也能看到 data=writeback 和 data=ordered 方式的好处。



对 data=journal 的调整

有些人在繁忙的服务器上 ― 特别是在繁忙的 NFS 服务器上 ― 使用 ext3 的 data=journal 方式时曾经碰到一个特殊的性能问题。每隔 30 秒,服务器就会遇到磁盘写活动高峰,导致系统几乎陷于停顿。如果您遇到这个问题,修复它很容易。只要以 root 用户输入以下命令,就可以调整 Linux“脏”缓冲区刷新算法:

调整 bdflush

echo 40 0 0 0 60 300 60 0 0 > /proc/sys/vm/bdflush


这些新的 bdflush 设置将导致 kupdate 每隔 0.6 秒而不是每隔 5 秒运行。另外,它们告诉内核每隔 3 秒而不是 30 秒(缺省值)刷新“脏”缓冲区。通过更有规律地将最近修改的数据刷新到磁盘,可以避免这些写操作的高峰。以这种方式执行的效率比较低,因为内核不太有机会组合写操作。但对于繁忙的服务器,写操作将更一致地进行,并将极大地改进交互式性能。



结束语

现在,我们已经结束了 ext3 的报道。敬请期待我的下一篇文章,因为我们将要研究……XFS 的许多奇妙之处!




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论