首先先说一下垃圾箱的情况,那么我在做这个的时候,我先创建目录,添加文件的时候,先在每一个目录下添加一个文件,绕一圈之后再添加第二个文件,这样会把磁盘分布打得很散,所以效果很好。实际情况不会这样的。如果有5万个目录,在每个目录下有15个文件,用刚才的方式做了之后,现在创建这些目录需要48秒,加了目录之后会慢9%,这是很正常的,但是在创建文件的时候会快14.5%,在删除的时候会快56%。当目录删除的时候会快41%,仅仅这样重新改变一下分配策略,什么都没有变的情况下速度会有很大的提高。但是有一个很有意思的事情,就是原来分配文件和创建文件的时候,应该速度会更慢才对,但是这出来之后还会快一些,我测试最快的时候是100%,后来发现这个有很好的副产品,因为创建一个新的文件之后,新的离原来的附目录非常的近,这样的话这种方式反而倒降低了IO操作的次数,和磁盘寻道的时间。
比如说现在有10几个CPU,这样共享一段存储磁盘,这么多CPU就可以很多人创建,那么创建的时候会在每一个目录下产生大量的临时文件,这就和我的应用模式相符的。我在预留的时候为每一个目录预留64个,那么计算一下把这个软件包解压缩,那么再计算一下过程,再比较一下目录预留和不预留两种性能,当有一个人用四个任务创建一个的时候,这两个性能差不多,但是当有8个人,为什么这么是1呢,因为我的CPU只有两个,多了就跑不动了,当有8个人编辑8个的时候,大家看一下这个解压缩会慢一些,但是在编辑的时候会快20%。只是因为它在往磁盘上写的时候,经过重新的布局,布局稍微改进了一点点,但是因为每一个目录下文件的数量差别非常大,从几百个到几个都有,因为我为每一个目录都预留相同的大小,所以实际上在删除的时候性能差别非常大,因为删的时候非常方便。
第三个应用就是大家非常常用的,这个应用缺省的模式下会创建16个一级目录,在每一个一级目录下创建256个二级目录,然后再二级目录下创建256个文件,这很整齐,我尝试用这个来试一下,把这些所有的文件充满需要多长时间,第二个就是更新之前的文件,更新需要多长时间,然后再试一下把目录全部删掉需要多长时间,当创建这个文件的时间是相似的,但是更新的时候会快6%,删除的时候会快86%。如果我有两个在操作的话,在同一个分区下操作两个目录,这时候创建目录会快10%,为什么会快呢,就是因为预留之后很整齐,不会有额外的快的读写。第二个就是在更新的时候会快14.6%,最后删除这些文件的时候会快43%。因为每个目录下的文件个数都非常整齐。
最后说一下为每个目录下预留(A node)不足之处,第一就是(A node)预留的空间大小是固定的。第二就是这个文件系统下对每一个目录预留的大小都是相同的,这是不太好的地方。第三就是在磁盘上(A node)顺序还没有跟随的(哈西)顺序。第四就是现在这些测试只能对有限的有帮助,比如说垃圾箱,CVS等等,因为它们的模式很像,就是会有很多目录,每个目录都是交替者添加。
最后总结一下,磁盘上的原数据的分布,对于文件特别是小文件的创建和删除的性能是有影响的。第二个就是重新排列文件系统的原数据的分布,是可以明显的提高小文件的创建和删除的性能。第三个就是静态的目录(A node)预留不能帮助每一个应用。所以就需要动态的目录做预留,所谓动态的就是会根据每个目录下文件多少不同,会动态的变更每一个目录预留的个数,这个现在正在思考,即便这些都做到了,还有一个就是原数据的碎片整理,这个原数据的碎片整理是非常麻烦的,但是它又是非常需要的。谢谢大家。
1