分享

谈谈freebsd的文件系统性能

 太昊太 2017-10-28
我因需要在服务器上存储大量图片(单台服务器储存1000万级别,主要是读),关注服务器文件系统性能,主要考虑FreeBSD的ufs和LINUX的reiserfs。一般认为reiserfs性能更好,尤其是小文件。不过,随着对freebsd了解增加,发现freebsd也有一些办法提高性能。考虑到freebsd用作服务器较多,大家也会关心其作为服务器的优缺点。另外,应该说文件系统性能一直是freebsd的弱项,新手也会关心提高文件系统性能方面的问题。所以,下面我分多个细想列一下我的认识和疑问。希望这个帖能集中、深入地探讨一下这个问题。

文件系统基本结构

ufs是线性结构,文件查找复杂度为O(N)。
reiserfs采用B*树组织文件系统,查找复杂度为O(logN)。特别地,对于小文件,reiserfs直接在树的叶节点上保存文件,读写时不用移动磁头到数据区(对于磁盘非常重要),所以小文件读写速度非常快。
基本结构和算法对文件操作的影响是全方位的,包括建立文件、修改、读取、删除等。举个例子,一个文件夹下有10000个文件,UFS最多需要10000次索引比较才能获得文件的磁盘位置,而reiserfs最多只要14次。所以可以说,reiserfs拥有索引(元数据组织结构)上的优势。

UFS提高读性能的办法:dirhash

dirhash在内存中缓存文件的磁盘位置信息,并提供哈希方法快速定位文件,理论上能够实现O(1)复杂度查找。但哈希有哈希开销,并要处理冲突,它不一定比B树快。我在其它情况下使用红黑树(效率也是logN)和哈希(用自定义哈希函数)的经验是,当key为字符串时,哈希实际比B树更慢。而dirhash用文件名作为key。不过,在下面,我把dirhash作为与b*树效率相同的来比较。
那么,实际读取文件时dirhash快还是b*树快?
关键问题首先是索引是在内存中还是在磁盘上。对于ufs,dirhash的文件索引已经明确地读取到内存中,文件在内存中哈希定位,所以查找是很快的。reiserfs的文件索引并没有明确地装载到内存,它应该是在需要读写的时候才会装载到内存。我还不清楚reiserfs有没有一些选项能够明确地将整个索引装载到内存(请了解的DX补充一下这点)。另外,对于小文件,由于文件在索引节点上,导致索引区域庞大,要整个装载是困难的(也许reiserfs有这个索引的索引?)。到这里为止,我觉得dirhash读取性能比reiserfs更好。reiserfs需要在磁盘上读取和比较索引,磁盘IO代价很大。
另外,我还不了解dirhash是否也能处理目录。例如,如果有大量文件要保存,现在把它们分拆到10000个目录下,每个目录保存100个文件。那么问题就是:
1、dirhash能够对每个目录下的文件进行哈希定位,但是,在目录层级,10000个目录是否也进行哈希处理?还是只对文件夹下的文件进行哈希处理?
2、如果对文件夹不进行哈希处理,那么必然要用传统方法进行查找定位,那么此时用的是某种树形的二分查找呢,还是线性查找?已知的是,对于文件夹下的文件,ufs是用线性查找。
注意:dirhash只能改善读性能,对新建文件、修改和删除没有帮助。

写入性能(新建、修改、覆盖、删除)

主要有两个方面问题影响写入性能:
1、是否可用异步写入。ufs采用softupdate,能(相对)安全地异步访问磁盘,性能较高。reiserfs使用日志系统,可以异步写入,性能也较高。不过,ufs是一次性写入元数据,日志式reiserfs则要先写入日志,数据写入后再同步日志,应该要多一次磁盘写。ufs在这点上稍微占优。不过,ufs如果不关闭磁盘缓冲,意外断电可能导致最严重的整个文件系统损坏的情况,所以ufs可能会关闭磁盘缓冲,在这样的情况下,ufs的写入性能明显变差。
2、文件系统结构。由于ufs的线性结构,文件写入会比reiserfs慢,特别是在小文件写入上。文件系统规模越大,对比差距越大。

写入安全性

一些资料指出softupdate是和日志一样的解决问题的不同方式,但实际上它和日志式文件系统有明显不同。ufs写入元数据是一次性的,没有日志,如果写入时断电,就会发生意外,视乎对元数据操作的不同,轻则丢失一些数据,重则可能损坏整个文件系统。ufs可以关闭磁盘缓冲减少这种风险,但关闭磁盘缓冲导致写入性能变得较差,而且问题是,即使关闭磁盘缓冲,这个问题也没有根本解决,如果更新元数据时断电而且更新的是关键的元数据,整个文件系统损坏的可能性仍然存在。
再来看reiserfs,如果关闭磁盘缓冲,写入性能也是较差的。但如果打开磁盘缓冲,意外断电最多只会丢失缓冲中的数据,即使正在更新元数据时断电,由于有元数据日志,文件系统是可以恢复的,理论上不存在整个文件系统损坏的可能性。

写入安全性是较重要的问题,如果一个系统在意外崩溃或断电就有可能全盘毁坏,即使这个可能性小,也让我们时刻悬着心。不过,我的看法可能有错,请大家批评指正。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多