📄 00000004.htm
字号:
<HTML><HEAD> <TITLE>BBS水木清华站∶精华区</TITLE></HEAD><BODY><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER>发信人: BlueOcean (Blue), 信区: Unix <BR>标 题: 好书共赏-《Unix Internels》(四) <BR>发信站: BBS 水木清华站 (Tue Apr 28 01:07:10 1998) <BR> <BR> <BR>Chapter 11 Advanced File Systems <BR> <BR>首先提到interleave的问题.不懂interleave的人可以看这里. 这里提到一个关键 <BR>性的bench mark. Unix filesytem的效率在於写入资料的速度. 因为Unix系统的 <BR>cache作的已经很好了, 所以read()大部份都发生在cache上, 但是write()则必须 <BR>把资料写到硬碟去,变成了bottleneck. 如何改善write()的速度就可以提升 <BR>整体效率. <BR> <BR>皆下来讨论kernel要如何把资料写到disk上,在crash时有最小的 损失, <BR>fsck才能够做到最大的复原. <BR> <BR>File System Clustering (Sun-FFS) <BR> <BR>一般的档案存取都是sequential的,虽然会透过好几个read/write system call <BR>达成. 如果kernel也可以像C stdio一样收集这些data block,然後再一起写到 <BR>disk去可以增加效率,这就是file system clustering. SunOS首先提出这种办法, <BR>後来SVR4和4.4BSD也都采用了. file system clustering提升了不少FFS的效率, <BR>使得FFS仍然足以与新提出的档案系统匹敌. <BR> <BR> <BR>The Journaling Approach <BR> <BR>这里logging = journaling, 意思是记录. journaling file system or <BR>logging file system (jfs or lfs)基本上就是把对file system的修改 <BR>(包括对档案属性,档案内容,档案大小的修改)都以append only的方式附 <BR>加(记录)到单一的档案(磁碟空间)去.最主要的目的是crash之後,只有最 <BR>後append的部份有可能出问题, fsck的速度极快(只要放弃最後那段log <BR>就可以了). 不过这样说好像太简单了,实际上lfs还要复杂些,有些race <BR> condition要处理. <BR> <BR>一个档案由两个资料组成, 一个是data, 另一个叫meta-data,指的是档案 <BR>的permission,access time, modify time,...等等. <BR> <BR>我们可以下面的特性来区分lfs: <BR> <BR>log 什麽东西? data, metadata都log, 或者是只记录meta-data. meta-data <BR>logging更可进一步决定是所有对档案属性的改变都记录起来, 或者只记录影 <BR>响档案系统结构的改变就好了. (time-stamps, ownership, permissions等要 <BR>是当机时没改到基本上不会影响档案系统的完整) <BR> <BR>实作的方式是使用纯LFS(log-structured file system),另一者是用lfs <BR>的概念辅助FFS,改善crash的处理(log-enhanced file system). 纯LFS需 <BR>要full data logging, 辅助性lfs通常就是mata-data logging而已. <BR> <BR>crash recovery方法也有两种, 一种是redo-only log,另外一种是undo-redo. <BR>redo-only log在 crash後把残馀的log继续做完. undo-redo log则可以选择 <BR>redo或undo.不同点差在crash 後的处理. redo-only较省disk space, <BR>但是crash recovery有较多synchronization 的问题会出现. undo-redo <BR>的方式有较多的的优点,有synchronization 问题的地方可以把档案还原. <BR>既然要undo,就会记录档案原来的资料, 当然较浪费空间. <BR> <BR>本章讨论的两个lfs, 4.4BSD LFS和 Episode File System (by <BR>Transarc,由AFS衍生出来). Episode是OSF DCE标准采用的local <BR>file system, 是DFS的基础. 4.4BSD LFS是根据Sprite作业系统 <BR>的研究而来的. LFS使用redo-only log. Episode使用redo-undo log. <BR> <BR>对LFS还是搞不清楚什麽是append only log? 没关系, 看了4.4BSD LFS後就了解了. <BR>Figure 11-2一目了然. LFS基本上把DISK当成是一条磁带,每个block大小为0.5 MB. <BR>一个block在disk上是一段连续的空间, 不过相邻的(logically..) block则没有在 <BR>disk上相邻, 而是用list的方式相邻. 用程式表示如下: <BR> <BR> struct log_segment { /* block在LFS的术语里面叫log segment */ <BR> <BR> int next; /* 下一个log_segment 所在的位址 */ <BR> <BR> char data[0.5MB-sizeof(int)]; <BR> <BR> }; <BR> <BR> 而FFS则是在disk上以渐进的方式动态配置新的log segment以记录log. <BR> segment间以linked list的方式串在一起. <BR> <BR>Kernel记录的log就是这样子记录到disk上的. 在这个segment chain <BR>的tail才是整个档案系统的最新资料.不过旧的资料也没有被盖掉就是了. <BR> <BR>LFS还有一个机制, 类似garbagge collection, 更像defragementation. <BR>它使用一个cleaner process来清理旧的log. 这个process会固定的把旧 <BR>的log独出来(以segment为单位).然後他会将这个segment的内容与实际 <BR>的资料比对,要是这个segment内的资料都是没有用的资料(已被新的资料 <BR>所取代了)那麽cleaner process就可以把此segment free掉. 如果segment <BR>还有一点东西, 怎麽办? 简单! 重写一次,append到最新的log去就好了 <BR>嘛(感觉好像nu的speed disk :). <BR> <BR>LFS仍然维持directory和inode的架构, 只不过以前的inode是固定 <BR>在disk blocks的最前端,而现在inode则是分散各地,存在各log <BR>segment里面. 这样子怎麽读这个file system呢? LFS还有一个 <BR>inode map, 记录所有inode的位置. inode map被当成是一般的 <BR>data一般,也是定期会写到log里面去. kernel就是靠此inode map <BR>作为读取这个档案系统的开端. <BR> <BR>大家最感兴趣的, 应该还是效率问题了. 首先LFS需要消耗更为大量 <BR>的记忆体才能满足他的运作所需, 有时候是个缺点. 与FFS比较的结 <BR>果在大部份的状况下都胜过FFS, 除了在高度多工的时候稍微输了一 <BR>点. Sun-FFS (有file system clustering和一些小地方的改进)和 <BR>LFS比就不相上下了. BSD LFS在处理meta-data方面较Sun-FFS强(create, <BR>remove, mkdir,rmdir....). 但在read/write等io集中的测试中 Sun <BR>FFS则较快, 特别是LFS cleaner启动的情况下更是如此. 显然 <BR>clustering发挥了不少功效. <BR> <BR>这边你要谨记在心的是LFS在metadata处理会赢过FFS, 是因为写入 <BR>动作较有效率的原因(sequential write), 前面已经提到file system <BR>的瓶颈在write... <BR> <BR>Sun FFS和BSD LFS在模拟实际状况的bench mark上的平均分数是 <BR>差不多的. LFS比FFS占优势的地方大概是快速的复原能力吧! <BR> <BR>本节引用了几份测试报告和bench mark, 有兴趣的可以看参考书目, <BR>看人家如何评量一个档案系统的效能. <BR> <BR>本节提到另一个有趣的产品, Write-Anywhere File Layout (WAFL) <BR>system, 是一家名为 Network Appliance Corporation 的 FAServer <BR>系列的NFS产品. WAFL整合了log-structured file system, NVRAM <BR>(non-volatile ram, 像PC cmos的咚咚),和RAID-4磁碟阵列, 提供了 <BR>高速的NFS response time. WAFL 有一个特色是许多系统管里者有兴 <BR>趣的, 就是snapshot. snapshot就是备份的意思嘛! 也就是系统某一时间 <BR>的状态. snapshot在log-structured file system下应该不难制作, <BR>因为所有的资料都用append模式嘛..把cleaner process的功能作个 <BR>修改就是了. snapshot 优於传统的备份的原因应该很明显, 传统的 <BR>备份过程必须花上一段时间,系统在这段时间内若有修改的话, 这段 <BR>时间内的修改则不知道有没有备份到.而snapshot则可以像照相一般 <BR>得到系统瞬间的备份.使用者也可以利用snapshot取得旧的档案内容 <BR>或达到undelete的功能. <BR> <BR>由LFS和Sun-FFS的比较可以了解meta-data logging(log-enhanced <BR>file system)存在的原因了, 取长补短嘛. 本章也讨论了meta-data <BR>logging的系统. meta-data logging在商品化的系统上较受欢迎, <BR>成为市场主流, 因为他可以架构在FFS上,改变不会太大, 还可以和 <BR>对FFS的改进(如clustering)互相配合,相得益彰. <BR> <BR>本章讨论的另一个lfs是Transarc的Episode File System. Episode <BR>采用redo-undo metadata logging, 并且他的file system可以横越 <BR>好几个硬碟. Episode也提供了类似snapshot的功能, 称为cloning. <BR>cloning使用copy-on-write的技术,只复制anode (Episode的inode). <BR>Episode在security方面也提供了POSIX式的access-control list (ACL), <BR>提供较传统Unix更为精细的档案属性控制. <BR> <BR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -