ttt

getttyent

(FreeBSD) 4KセクタHDDでは、ZFSのzpoolをashift 12にすべきらしい

2013-11-07 23:59:00 | デジタル・インターネット

先日、

(FreeBSD) zpool replaceするつもりがzpool addしてしまって、ゲゲゲな結果になった

という、うっかり、をしてしまいまして、全ファイルを別のZFSに待避して、プールを作り直し、ということになりました。復旧するまで、3日かかりました

そんなわけで、プールを作り直したのですが・・・

プールを作って
# zpool create storage raidz ada1 ada2 ada3 ada4

zdbというコマンドを実行
# zdb
storage:
    version: 28
    name: 'storage'
    state: 0
    txg: 4
    pool_guid: ほにゃらら
    hostid: ほにゃらら
    hostname: 'ほにゃらら'
    vdev_children: 1
    vdev_tree:
        type: 'root'
        id: 0
        guid: ほにゃらら
        create_txg: 4
        children[0]:
            type: 'raidz'
            id: 0
            guid: ほにゃらら
            nparity: 1
            metaslab_array: 30
            metaslab_shift: 36
            ashift: 9
以下省略

というように、zdbコマンドで見ると、「ashift: 9」と出てきます。

しばらく前に知ったことなんですが、従来の512バイトセクタのハードディスクではこれでよいが、4K(4096バイト)セクタのハードディスクでは、ashiftは12にした方が性能がよくなるそうです。

2の9乗は512、2の12乗は4096ですが、ashift 12にしておくと、ZFSが4096バイト単位で、ディスクを扱ってくれるようになる、とかなんとかいう話でした

使っている2TBディスクなので、せっかくの機会だし、ashift 12にしたい!ということで、ネット検索して見つけた情報のとおりにやってみました。

ちなみに、9.2-RELEASEにアップデートしても ashift: 9 でした。

作ったばかりですが、プールを削除
# zpool destroy storage

gnopというコマンドを実行
# gnop create -S 4096 /dev/ada1
# gnop create -S 4096 /dev/ada2
# gnop create -S 4096 /dev/ada3
# gnop create -S 4096 /dev/ada4

gnopってコマンドを初めて知りました。

本物のハードディスクは
# diskinfo /dev/ada1
/dev/ada1       512     2000398934016   3907029168      4096    0       387602116       63
というように、512バイトセクタになっていますが、
gnopで作ったほうのディスク(ada1.nop)は
# diskinfo /dev/ada1.nop
/dev/ada1.nop   4096    2000398934016   488378646       0       0       484502 16       63
というように、4096バイトセクタに見せかけることができる、という仕組みらしいです。

そしてプールを作成
# zpool create storage raidz ada1.nop ada2.nop ada3.nop ada4.nop

zdbで確認
# zdb
storage:
    version: 5000
    name: 'storage'
    state: 0
    txg: 4
    pool_guid: ほにゃらら
    hostid: ほにゃらら
    hostname: 'ほにゃらら'
    vdev_children: 1
    vdev_tree:
        type: 'root'
        id: 0
        guid: ほにゃらら
        create_txg: 4
        children[0]:
            type: 'raidz'
            id: 0
            guid: ほにゃらら
            nparity: 1
            metaslab_array: 33
            metaslab_shift: 36
            ashift: 12
以下省略

というように、今度はashiftが12になりました。

# zpool list -v
NAME           SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
storage       7.25T  1.10M  7.25T     0%  1.00x  ONLINE  -
  raidz1      7.25T  1.10M  7.25T         -
    ada1.nop      -      -      -         -
    ada2.nop      -      -      -         -
    ada3.nop      -      -      -         -
    ada4.nop      -      -      -         -

# zpool status
  pool: storage
state: ONLINE
  scan: none requested
config:

        NAME          STATE     READ WRITE CKSUM
        storage       ONLINE       0     0     0
          raidz1-0    ONLINE       0     0     0
            ada1.nop  ONLINE       0     0     0
            ada2.nop  ONLINE       0     0     0
            ada3.nop  ONLINE       0     0     0
            ada4.nop  ONLINE       0     0     0

errors: No known data errors

プールができてしまった後は、「なんとか.nop」という変換する仕組みは不要らしいので、もとのada1などに戻します。

こんな感じ。

いったんプールをexportします。
# zpool export storage

プールが見えなくなります。
# zpool list
no pools available

「なんとか.nop」をやめます。
# gnop destroy ada1.nop ada2.nop ada3.nop ada4.nop

プールをimportします。
# zpool import storage

プールが見えるようになります。
# zpool status
  pool: storage
state: ONLINE
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        storage     ONLINE       0     0     0
          raidz1-0  ONLINE       0     0     0
            ada1    ONLINE       0     0     0
            ada2    ONLINE       0     0     0
            ada3    ONLINE       0     0     0
            ada4    ONLINE       0     0     0

errors: No known data errors

というわけで、ada1とかに戻りました。

一応確認。

# zdb
storage:
    version: 5000
    name: 'storage'
    state: 0
    txg: 25
    pool_guid: ほにゃらら
    hostid: ほにゃらら
    hostname: 'ほにゃらら'
    vdev_children: 1
    vdev_tree:
        type: 'root'
        id: 0
        guid: ほにゃらら
        children[0]:
            type: 'raidz'
            id: 0
            guid: ほにゃらら
            nparity: 1
            metaslab_array: 33
            metaslab_shift: 36
            ashift: 12
以下省略。

ashiftは12になってます。

さて、これで速くなったのかどうか…計測していないのでわかりません。

20131107