ZFSの仕組み-パート1:vdev

Vdev、または仮想デバイスは、ZFS(zpool)データ配列が構築される基本単位です。 ZFSが機能するには、少なくとも1つのvdevが必要です。これは、ブロックレベルで情報へのランダムアクセスを許可する仮想デバイスです。



通常、ディスク全体またはiScsi / FC LUN(raw-disk vdev)がそのようなブロックとして使用されますが、ディスクパーティションまたはファイルを使用することもできます。 ZFSはオンボード書き込みキャッシュを使用するため、ディスク全体が望ましいため、書き込みパフォーマンスが大幅に向上します。 当分の間、論理vdevとリーフvdevの違いについては説明しません。これは、RaidzNとzfsミラーがどのように機能するかについての別の記事のトピックです。

src.illumos.org/source/xref/illumos-gate/usr/src/uts/common/fs/zfs/vdev_disk.c#314
if (vd->vdev_wholedisk == 1) { int wce = 1; /* * If we own the whole disk, try to enable disk write caching. * We ignore errors because it's OK if we can't do it. */ (void) ldi_ioctl(dvd->vd_lh, DKIOCSETWCE, (intptr_t)&wce, FKIOCTL, kcred, NULL); }
      
      





仮想デバイスの構造の説明では、どのパラメーターが何に使用されているかを確認できますが、誰にも説明するつもりはありません。この記事の目的は、ZFSがデータを保存および書き込む方法を説明することです。



各vdevは論理パーティション(metaslab)に分割され、 ディスクがZFSプールに追加されると自動的に作成されます。 そのようなパーティションの数はvdevのサイズに依存します-約200パーティションですが、実際には<128、> 256になります。

src.illumos.org/source/xref/illumos-gate/usr/src/uts/common/fs/zfs/vdev.c#1552
 void vdev_metaslab_set_size(vdev_t *vd) { /* * Aim for roughly 200 metaslabs per vdev. */ vd->vdev_ms_shift = highbit(vd->vdev_asize / 200); vd->vdev_ms_shift = MAX(vd->vdev_ms_shift, SPA_MAXBLOCKSHIFT); }
      
      





さらに、各メタスラブの内部には、いわゆる場所マップ-スペースマップがあります。 ZFSのほとんどの構造と同様に、 AVLツリーに基づいて作成されており、ブロックのサイズやメタスラブ内の場所に関係なく、占有スペースと空きスペースのブロックを効果的に操作できます。



ZFSがこの構造をどのように使用するかを示す小さな例を次に示します
 zdb -mmm -   20   metaslab'a  vdev'a   : 
      

Metaslabs: vdev 0 metaslabs 323 offset spacemap free --------------- ------------------- --------------- ------------- metaslab 0 offset 0 spacemap 34 free 84.8M segments 72 maxsize 24.9M freepct 16% .... [ 73] A range: 001f00ba00-001ffffa00 size: ff4000 [ 74] A range: 001eff8200-001f00ae00 size: 012c00 [ 75] A range: 001b091200-001b130200 size: 09f000 [ 76] A range: 0012a84e00-0013a84e00 size: 1000000 [ 77] A range: 0013a84e00-00141bb800 size: 736a00 [ 78] A range: 0006b88000-0007707200 size: b7f200 [ 79] FREE: txg 9153385, pass 1 [ 80] F range: 0000282000-0000283200 size: 001200 [ 81] F range: 0000b47200-0000b48600 size: 001400 [ 82] ALLOC: txg 9252698, pass 1 [ 83] A range: 0000282000-0000283a00 size: 001a00 [ 84] A range: 0000b47200-0000b48e00 size: 001c00 [ 85] A range: 00008e6e00-00008e8a00 size: 001c00 [ 86] FREE: txg 9279297, pass 2 [ 87] F range: 00008e9000-00008e9c00 size: 000c00 [ 88] FREE: txg 9328122, pass 2 [ 89] F range: 0010a7be00-0010a7c800 size: 000a00 [ 90] FREE: txg 9444756, pass 1 [ 91] F range: 0009b14200-000ab14200 size: 1000000 [ 92] F range: 000ab14200-000b402000 size: 8ede00 ....






, , , . , ZFS - - Copy-on-write . ZFS - , .



space map - 512 (0200), - 16 (01000000). space map , , - , .



- metaslab "" , free map, , , disk seek. , 84 "free" , - 24.9 "maxfree".



ZFS write pipeline - , , () metaslab allocator.



, - , , . .




zdb -mmm - 20 metaslab'a vdev'a :

Metaslabs: vdev 0 metaslabs 323 offset spacemap free --------------- ------------------- --------------- ------------- metaslab 0 offset 0 spacemap 34 free 84.8M segments 72 maxsize 24.9M freepct 16% .... [ 73] A range: 001f00ba00-001ffffa00 size: ff4000 [ 74] A range: 001eff8200-001f00ae00 size: 012c00 [ 75] A range: 001b091200-001b130200 size: 09f000 [ 76] A range: 0012a84e00-0013a84e00 size: 1000000 [ 77] A range: 0013a84e00-00141bb800 size: 736a00 [ 78] A range: 0006b88000-0007707200 size: b7f200 [ 79] FREE: txg 9153385, pass 1 [ 80] F range: 0000282000-0000283200 size: 001200 [ 81] F range: 0000b47200-0000b48600 size: 001400 [ 82] ALLOC: txg 9252698, pass 1 [ 83] A range: 0000282000-0000283a00 size: 001a00 [ 84] A range: 0000b47200-0000b48e00 size: 001c00 [ 85] A range: 00008e6e00-00008e8a00 size: 001c00 [ 86] FREE: txg 9279297, pass 2 [ 87] F range: 00008e9000-00008e9c00 size: 000c00 [ 88] FREE: txg 9328122, pass 2 [ 89] F range: 0010a7be00-0010a7c800 size: 000a00 [ 90] FREE: txg 9444756, pass 1 [ 91] F range: 0009b14200-000ab14200 size: 1000000 [ 92] F range: 000ab14200-000b402000 size: 8ede00 ....






, , , . , ZFS - - Copy-on-write . ZFS - , .



space map - 512 (0200), - 16 (01000000). space map , , - , .



- metaslab "" , free map, , , disk seek. , 84 "free" , - 24.9 "maxfree".



ZFS write pipeline - , , () metaslab allocator.



, - , , . .







All Articles