技术开发 频道

李勇:通过重新排列文件系统元数据提高创建/删除文件的性能

【IT168技术资讯】 
   
   主持人:我们谢谢邸博士的演讲,下面我们请Novell的李勇演讲。

    李勇:我是在Novell实验室做与文件系统相关的东西。现在我是在维护两个系统,之前是做OPMI的开发。其实我还有一个角色就是北京Linux开发者的成员。

    首先说一下通过重新排列原数据,提高文件系统的创建和删除工作,为什么要做这件事情。实际上从关系到我自己的问题引发出来的,第一就是我要不要等一个小时清空我的垃圾箱。第二个就是在不升级硬件的前提下,有没有可能把速度再快一些。第三就是如果跑一些软件的话,那么有一些目录,如果不能去格式化分区,能不能删除这些目录更快一些。那么这些问题本质是什么呢,这些问题的本质就是如果有大量的目录,在目录下又有大量的文件,那么或者更糟糕的话,这些目录下的已经文件不是说一次创建的,可能是今天在这儿创建几个目录,明天在那儿创建几个文件,是这样交替创建的。那么在这种情况下,我们能不能让文件创建得更快一些,还有就是删除文件的时候更快一些,这就是这个问题的本质。



     我在尝试想解决这个问题的时候,就看到了UAT4,在做这之前一下例子,在一个单独的目录下创建了50个空文件,这种文件去删的时候呢,我Reback模式下需要10分钟,但实际上这有多少数据呢,所有这些东西加起来的数据不超过80兆,大概是70多兆,保守的说不超过80兆,这80兆数据写在硬盘上9秒钟就完了。大部分时间是在Sleep状态。为什么这么慢呢,是因为顺序分配的,换句话说找到第一个空闲的槽就可以释放出来,但是为了提高路径查找的速度,它的目录文件是用哈西顺利做的。 比如说生成文件的时候,用ADJRMP,按这个样子来生成这么多文件,那么在这个图里面第一个彩色图对应的是这些文件的Anode表,在这个表里面的分裂,就按照这个文件创建的顺序排列的,这个表很杂乱,过是访问文件的顺序,大家可以看到这个时候因为(哈西)顺序,就是分配化访问的顺序是不一样的,这个时候会有大量的磁盘裙到,而且会有冗余。

    就三个磁盘快可能需要提交24次指示,而且大家不要忘了,这只是目录里面的文件,那么我们在删除目录里面文件的时候,我还要把目录的放到磁盘上去,这也是一个开销,这是导致速度慢的主要原因,这种说法准不准确呢,咱们就要找证据了。 比如在刚才那个例子里面,那些目录的话,咱们在删之前先把它拷到另外一个地方去,拷过去以后,把拷过去的目录删掉,这样比较一下就很明显,左侧是之前用的乱序升成的文件,右边就是按照顺序拷过去的,这样时间差别就很大,大概速度可以快到15倍左右。那么这个提高的性能是非常的显著的。

    这是在一个理想的情况下,我们很难能碰到正好访问目录顺序的时候,正好是一样的,这是很难碰到的,但是至少这个测试显示出一个愿景,就是也许这样改进可以提高性能。 我们可以看到,通过刚才那些拷贝之后,原本排列是在第一行这个样子,那么经过重新拷贝之后排成了第二行的样子,这样就大量减少了磁盘裙道,而且在访问的时候同一个目录下的,相靠近的有可能会被按照一种方式写到磁盘上去,而且这样减少了磁盘裙道的时间, 而且也减少了IO的次数。刚才讲的只是在一个目录下有大量文件的情况下。 那么还有一种情况就是我们有很多的目录,这种情况下问题就更糟糕了。
   
    比如这个例子里面这些花花绿绿的,每种颜色代表我在每一个目录下,不同的目录下的文件对应的Anode,如果按这种情况下做的话,我先创建了很多目录,每个目录里面有很多文件,这个综合加起来之后这个顺序还是很糟糕的,所以这种情况下还是会有大量的额外的磁盘裙道和IO操作。 面对这两种问题的解决办法呢,比较理想的解决办法有两个,第一个就是每个目录下,当我们创建目录的时候,为这个目录的预留一段区域,当生成新文件的时候,是从为这个目录预留的区域里面找。那么这样就避免把不同目录下文件混合在一起。这样就降低了对IO写的次数。但是这种方式当一个目录下的文件数太的时候对性能提高是没有帮助的,如果想要提高性能,那么就要把这个顺序排得尽量一致。但是这种方式又对存在多个目录下有很多文件的删除帮助不大,所以要提高文件删除的性能必须把这两种办法合起来做。 但是我经过实验之后发现,想把目录下的文件的A node顺序做成一致这是非常困难的。另外就是如果按照(哈西)顺序分配的话,有可能在预留区域内跳着分配,这样会影响到磁盘操作。那么一个可行的方案就是先不要考虑目录下(A node)顺序。预留区域不要太大。而且要尽量避免对文件系统在磁盘上的修改,还有向前兼容EST23,这是什么意思呢,就是我拿一个EST2和EST3的分区过来,加一个选项就可以这样用。

    用完了之后我把它当作EST2和EST3运作还可以工作,不受影响。这本质就是新的对磁盘的(A node)的分配器。我在网上发布的是第三版的补丁,我手里是第五版的补丁,这包括注释,包括空行在里面的,代码是98行。 比如说我现在创建4个目录,以前的会把这四个目录紧紧挨在最前面,现在我把中间空出一段,这就是预留的区域。比如说我要给A下面分配一个文件的话,那么比如说我用小写的a代替,那么a就放在a的预留区,b就放在b的预留区,c就放在c的预留区。因为这是一个尽量去尝试的分配机制,并不是硬把这些要预留给我,所以别人占了没关系,我再找。就这么一个分配策略,那么它对兼容性是没有问题的。 第一个不需要修改软件包。第二个就是为每一个目录预留的(A node)的大小。

    另外就是说可以用这种模式运行EST2和EST3。这里面有一个地方可能会头疼,就是它会影响到EST4的一个性能,这个特性是为了减少FSK的时间,所以会EST每一个块组里面,标志没有被分配的标志,所以它会标志在之前的地方,由于这个会跳着分配的,所以创建很多空目录的话,那么以前的也会被检查,这就是一个需要权衡的性能。

0
相关文章