对文件系统和ZFS设计的思考

举报
大数据小粉 发表于 2017/05/09 16:11:38 2017/05/09
【摘要】 对文件系统和ZFS设计的发展思考。

在我看来,文件系统的发展大致分为下面几个阶段。

第一阶段,解决如何在块设备上构建文件系统的问题,也就是把块地址转变成文件和树形目录等概念,这样更方便。fat/ufs/ffs/ext2/minix等都处于这个阶段。这个阶段的文件系统设计者考虑最多的如何实现这些概念,对性能,可靠性,其他增值特性考虑较少。

第二阶段,在第一阶段的基础上,尝试解决性能、可靠性、可扩展性等问题。这个阶段的文件系统包括:xfs、ext3、ReiserFS、NTFS、vxfs、lfs等。这些文件系统并没有提供更丰富的功能,但是对内部设计做了很多改进。很多文件系统都支持日志型,崩溃之后可以快速回复,有些文件系统还是log-structure的。很多文件系统使用了B+树来组织目录和文件内的数据块布局,xfs/ReiserFS。很多文件系统的inode table是扩展的,NFS/vxfs/xfs...。

第三个阶段,突破POSIX规范的限制,提供更丰富的功能。这个阶段的文件包括:ZFS、btrfs、ext4等等。这些功能主要包括:快照、多硬盘支持、重删、RAID等等。btrfs和ext4要更保守一些,严格说来还算不上第三代。ZFS更加激进一些。

ZFS在设计上有很多创新,比如:

  -在文件系统中实现RAID,这个功能以前是在磁盘阵列中实现的。

  -提升了对可靠性的重视水平,为每个数据块做强校验。

  -引入了SSD作为L2cache,

  -引入了dedup功能,增强了ACL。

  -文件系统架构被设计成两层:(1) 基础设施层,object、sio、zap等;(2)文件系统层,ZPL。

也继承了一些其他文件系统的设计,比如:ROW/日志性文件系统(WAFL/lfs)。抛弃了一些,比如fsck、B+ Tree等。

对ZFS的赞美很多了,附件集中描述了ZFS的优点。是不是真的像是ZFS开发者声称的那样,ZFS是这个世界上最后一个文件系统了,没有必要再开发其他文件系统了?下面我们从另外的角度,思考一下ZFS设计中还有那些地方值得改进。

1.文件内部定长块,用direct-map组织文件布局,没有使用变长的extent和B+树组织文件内的布局
ZFS抛弃了被vxfs/xfs等文件系统采用的变长extent。extent的好处是:元数据少,提升性能,特别是大文件随即读性能和大文件删除性能。不清楚ZFS为啥不用。

2.ZFS的空间利用不是特别有效,运行时间长了会有很多碎片,这是ROW文件系统的普遍问题,btrfs有在线碎片整理,似乎ZFS没有。碎片带来几个问题:a、新数据写入时,查找空闲块的效率降低,影响写入性能;b、新写入的数据块在硬盘上不连续,顺序读出的性能变差;c、ZFS使用space-map管理空闲块,多个小的、碎片化的空闲块需要更多的space-map条目来描述,需要占用更多内存。

3.对于这种应用场景“大文件,顺序读为主,更改频繁”,性能差,ROW会把原本地址连续的大文件变为不连续。

4.CPU开销比较大,这是因为ZFS增加了对数据块的校验和RAID。

5.不支持目录级别的可写快照

6.重删特性可用性差,ZFS采用定长分块,并且分块粒度比较大,指纹查找的性能也不太好。

7.RAIDZ恢复性能,当出现硬盘失效时,ZFS的RAIDZ是通过遍历文件来进行数据重构的,当文件数量很少的时候,可以很快完成,当文件数量较多的时候,性能就会很差。对用户来说,最不能忍受的是性能不稳定,重构时间不确定。

8.同步处理流程,等待IO操作完成时,挂起当前进程。几乎现有所有文件系统都是这样的,但是对于打算支持多硬盘的文件系统来说,最好采用异步模式。理论上说,采用同步流程的文件系统,要想充分利用硬盘能够提供的性能,就需要与所有硬盘并发IO数量相同的线程数量。假设每个硬盘最多能支持10并发IO,那么就需要每块硬盘就要10个线程才能被充分利用,当系统中有200块硬盘的时候,就需要2000个线程,这2000个线程在4 - 8个CPU核心上被频繁切换,开销是比较大的。

9.两层架构和object抽象,ZFS的两层架构增加了代码规模,在一定程度上限制了灵活性。猜测,在ZFS开始设计那个年代,对象存储的概念刚刚被提出,也许ZFS是为了利用对象硬盘做准备。

10.对SSD的使用,ZFS把SSD用作L2cache。在存储行业中,除了把SSD用作读cache之外,还另外一种用法,分级存储,ZFS不支持这种用法。

11.FCL(vxfs)和inotify(linux),文件更改列表(FCL, file change list),或者文件更改通知(inode notify)。很多应用需要这个功能,比如备份,或者远程复制,需要知道上次备份以来,哪些文件更改了。安全(防病毒),需要知道上次检查之后,哪些文件更改了。ZFS似乎不支持。

相对于现存的其他文件系统来说,ZFS足够好了。

作者 | 黄岩

转载请注明出处:华为云博客 https://portal.hwclouds.com/blogs

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200