看了下面的这个文章,熟悉了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的原