zfs块申请机制研究

来源:互联网 发布:php 清空文件夹内容 编辑:程序博客网 时间:2024/06/05 00:44

看了下面的这个文章,熟悉了zfs的块的申请的机制。

https://blogs.oracle.com/roch/entry/doubling_exchange_performance


首先如果某个zio要请求vdev,申请一个block,他会经过zio流水线的一级 zio_dva_allocate。

在块申请的时候 首先 会选择出top vdev,然后通过这个top vdev,找到一个metaslab,然后再在metaslab当中,找到所要请求块的dva。

(Data Virtual Address),挑选metaslab是系统写性能问题的核心和关键。  

       一个vdev被分为200个metaslab,每个metaslab可能会在内存当中,可能不会放到内存当中。放到内存当中的部分,将会有一个spacemap与之对应。并且我们可以从中申请块。

      同时也有可能不在内存当中,那么我们不能申请不在内存当中的metaslab,但是我们却可以释放(由于copy on write的原因,有些块已经被使用,由于不能overwrite,所以必须要copy到新的块,然后释放掉原来的块)。对于spacemap载入与载出的开销是很大的,所以目标就是缩小这个操作的开销。

    申请块的时候,所寻找的slab 是根据一些标准,和每个slab的权值来决定的,寻找权值最大的slab为最终的目标。

标准有两个:重用之前使用过的slab,当然比较容易想到的原因是:由于是刚刚使用过,那么肯定寻道的距离不会很长,这样可以缩短寻道时间,第二个是寻找空闲空间最大的slab。

解释一个名词LBA是(logical block addresses)的缩写。当LBA 越低,那么说明他的位置越靠近磁盘的外侧,性能越好。(不过这样也存在一个问题,就是写磁盘的时候,肯定会先写低LBA,如果不删除该文件,继续写磁盘,那么磁盘的速度肯定会越来越低。)

    所以如果空间空间都是一样的话,会优先选择外磁道的slab作为申请的对象。当磁盘的空间近乎满的状态的时候,space map维护了另一个avl树,这个树是按照空闲空间大小来进行组织的。

    对zfs的优化不仅仅体现在对数据结构上的优化,而且体现在对他所提供的参数上的优化。

    比如之前当slab空间大于70%的时候就才用best fit算法,而如果将threshold改成大于96%才进行best fit算法,能够提高系统写的速度。还有另一个可以优化的地方:之前是当slab的空闲程度为50%的时候,zfs会选择该slab作为申请的对象。而现在是当slab的空闲程度为33%的时候,该slab就会选择。

   经过测试发现,修改相关参数后,一些运行在zfs上的应用的性能提升了很多。



原创粉丝点击