RaidZのファイルサーバーを再構築した。

経緯

最近RaidZで構築したファイルサーバーで、読み込みがとても遅くなるようになりました。
35,000弱のファイルがあるフォルダをWindowsのエクスプローラーで開いたら、
5分くらいフリーズしちゃう状況です。

フリーズ中にiotopでプロセスを確認するとsambaがI/Oを99%使っている状態で
sambaをリスタートすると改善することがある。

待てばいいとはいえなんかおかしい。
と思ったのでdmesg出力してみたら以下のエラーが発生していました。

[水  5月  5 09:46:07 2021] ata4.00: exception Emask 0x0 SAct 0x70001eb6 SErr 0x0 action 0x0
[水  5月  5 09:46:07 2021] ata4.00: irq_stat 0x40000008
[水  5月  5 09:46:07 2021] ata4.00: failed command: READ FPDMA QUEUED
[水  5月  5 09:46:07 2021] ata4.00: cmd 60/00:10:78:62:b1/01:00:68:00:00/40 tag 2 ncq 131072 in
         res 41/40:00:60:63:b1/00:01:68:00:00/00 Emask 0x409 (media error) <F>
[水  5月  5 09:46:07 2021] ata4.00: status: { DRDY ERR }
[水  5月  5 09:46:07 2021] ata4.00: error: { UNC }
[水  5月  5 09:46:07 2021] ata4.00: configured for UDMA/133
[水  5月  5 09:46:07 2021] sd 3:0:0:0: [sdd] tag#2 FAILED Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE cmd_age=3s
[水  5月  5 09:46:07 2021] sd 3:0:0:0: [sdd] tag#2 Sense Key : Medium Error [current] [descriptor] 
[水  5月  5 09:46:07 2021] sd 3:0:0:0: [sdd] tag#2 Add. Sense: Unrecovered read error - auto reallocate failed
[水  5月  5 09:46:07 2021] sd 3:0:0:0: [sdd] tag#2 CDB: Read(10) 28 00 68 b1 62 78 00 01 00 00
[水  5月  5 09:46:07 2021] blk_update_request: I/O error, dev sdd, sector 1756455776
[水  5月  5 09:46:07 2021] ata4: EH complete

これが原因かはわかりませんが、
調べてみると壊れる予兆とか、物理的に壊れてるかもしれないなんて情報が出てきますね。
しかもdmesgを遡って行くとsddだけじゃなくて他のHDDでも発生しているっぽい。
RaidZ1なので複数壊れるのはまずい。
加えて実は容量もそろそろ逼迫してきている。
じゃあもう全体的に作り直しちゃおうか!

あ、ちなみにzpoolのscrubでファイルシステムチェックしてみましたが、エラーはなかったです。

# zpool status -v zfs
  pool: zfs
 state: ONLINE
  scan: scrub repaired 0B in 3h51m with 0 errors on Thu May  6 15:13:08 2021
config:

	NAME        STATE     READ WRITE CKSUM
	zfs         ONLINE       0     0     0
	  raidz1-0  ONLINE       0     0     0
	    sda     ONLINE       0     0     0
	    sdd     ONLINE       0     0     0
	    sdc     ONLINE       0     0     0
	    sdf     ONLINE       0     0     0

errors: No known data errors

物理構成

今までは2TBのHDDを4台使って合計容量5TBくらいでしたが、
今回は4TBのHDDを3台使って構築しようと思います。

以前1台買ってあったので追加でSEAGATE ST4000DM004を2台購入しました。
NAS向けじゃないけどヨシ!
7500円くらいでした。

アップグレード

構築してから結構経つので最新にしようと思います。

# zpool upgrade -v
This system supports ZFS pool feature flags.

The following features are supported:

FEAT DESCRIPTION
-------------------------------------------------------------
async_destroy                         (read-only compatible)
     Destroy filesystems asynchronously.
empty_bpobj                           (read-only compatible)
     Snapshots use less space.
lz4_compress                         
     LZ4 compression algorithm support.
multi_vdev_crash_dump                
     Crash dumps to multiple vdev pools.
spacemap_histogram                    (read-only compatible)
     Spacemaps maintain space histograms.
enabled_txg                           (read-only compatible)
     Record txg at which a feature is enabled
hole_birth                           
     Retain hole birth txg for more precise zfs send
extensible_dataset                   
     Enhanced dataset functionality, used by other features.
embedded_data                        
     Blocks which compress very well use even less space.
bookmarks                             (read-only compatible)
     "zfs bookmark" command
filesystem_limits                     (read-only compatible)
     Filesystem and snapshot limits.
large_blocks                         
     Support for blocks larger than 128KB.
large_dnode                          
     Variable on-disk size of dnodes.
sha512                               
     SHA-512/256 hash algorithm.
skein                                
     Skein hash algorithm.
edonr                                
     Edon-R hash algorithm.
userobj_accounting                    (read-only compatible)
     User/Group object accounting.

The following legacy versions are also supported:

VER  DESCRIPTION
---  --------------------------------------------------------
 1   Initial ZFS version
 2   Ditto blocks (replicated metadata)
 3   Hot spares and double parity RAID-Z
 4   zpool history
 5   Compression using the gzip algorithm
 6   bootfs pool property
 7   Separate intent log devices
 8   Delegated administration
 9   refquota and refreservation properties
 10  Cache devices
 11  Improved scrub performance
 12  Snapshot properties
 13  snapused property
 14  passthrough-x aclinherit
 15  user/group space accounting
 16  stmf property support
 17  Triple-parity RAID-Z
 18  Snapshot user holds
 19  Log device removal
 20  Compression using zle (zero-length encoding)
 21  Deduplication
 22  Received properties
 23  Slim ZIL
 24  System attributes
 25  Improved scrub stats
 26  Improved snapshot deletion performance
 27  Improved snapshot creation performance
 28  Multiple vdev replacements

For more information on a particular version, including supported releases,
see the ZFS Administration Guide.

# zfs upgrade -v
The following filesystem versions are supported:

VER  DESCRIPTION
---  --------------------------------------------------------
 1   Initial ZFS filesystem version
 2   Enhanced directory entries
 3   Case insensitive and filesystem user identifier (FUID)
 4   userquota, groupquota properties
 5   System attributes

For more information on a particular version, including supported releases,
see the ZFS Administration Guide.

zpoolが28でzfsが5ってことでしょうか。
アップグレードしてみましたが変わらなかったです。

$ zpool upgrade -a
This system supports ZFS pool feature flags.

All pools are already formatted using feature flags.

Every feature flags pool already has all supported features enabled.

$ zfs upgrade -a
0 filesystems upgraded

あと超久しぶりにyum updateしたんですが、
PT3のドライバが死んで録画できなくなって焦りました。
(zpoolとzfsには影響なし)

ストレージプール作成

データのバックアップが完了しましたらストレージプールを作成します。
HDDは初期不良とかはなく全て認識してくれました。
一応パーティションが作成されていたHDDはfdiskで削除しておきました。
ちなみに購入した4TBのHDDはノータッチです。

今までの使っていたHDDは全て外して、以下の状態で作業を進めます。

# zpool status
no pools available

デバイスIDを調べます。
実は以前 sdeとかsddで作成したんですが、
PCケースを交換する時にテキトーにSATA繋げたらエラーになっちゃいました。
おそらくデバイスIDにすれば配線変わっても大丈夫なんじゃないかと思うのでそうします。

# ls -lh /dev/disk/by-id/
lrwxrwxrwx 1 root root  9  5月  8 12:41 ata-ST4000DM004-XXXXXX_XXXXXXXX -> ../../sdc
lrwxrwxrwx 1 root root  9  5月  8 12:41 ata-ST4000DM004-XXXXXX_XXXXXXXX -> ../../sdd
lrwxrwxrwx 1 root root  9  5月  8 12:43 ata-TS120GSSD220S_XXXXXXXXXXXXXXXXXXXX -> ../../sdb
lrwxrwxrwx 1 root root  9  5月  8 12:41 ata-WDC_WD40EZRZ-XXXXXXX_XX-XXXXXXXXXXXX -> ../../sde

デバイスIDでストレージプールを作成します。
加えて、読み込みが速くなることを願って120GBのSSDをキャッシュデバイスとして加えます。
これでより快適になるといいなぁ。

# zpool create -f tank raidz ata-ST4000DM004-XXXXXX_XXXXXXXX ata-ST4000DM004-XXXXXX_XXXXXXXX ata-WDC_WD40EZRZ-XXXXXXX_XX-XXXXXXXXXXXX cache ata-TS120GSSD220S_XXXXXXXXXXXXXXXXXXXX

問題なく作成できたようです。

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

	NAME                                          STATE     READ WRITE CKSUM
	tank                                          ONLINE       0     0     0
	  raidz1-0                                    ONLINE       0     0     0
	    ata-ST4000DM004-XXXXXX_XXXXXXXX           ONLINE       0     0     0
	    ata-ST4000DM004-XXXXXX_XXXXXXXX           ONLINE       0     0     0
	    ata-WDC_WD40EZRZ-XXXXXXX_XX-XXXXXXXXXXXX  ONLINE       0     0     0
	cache
	  ata-TS120GSSD220S_XXXXXXXXXXXXXXXXXXXX      ONLINE       0     0     0

errors: No known data errors

容量は7.1TBになりました。

$ df -Th
ファイルシス            タイプ   サイズ  使用  残り 使用% マウント位置
devtmpfs                devtmpfs   5.7G     0  5.7G    0% /dev
tmpfs                   tmpfs      5.7G     0  5.7G    0% /dev/shm
tmpfs                   tmpfs      5.7G  9.1M  5.7G    1% /run
tmpfs                   tmpfs      5.7G     0  5.7G    0% /sys/fs/cgroup
/dev/mapper/centos-root xfs         50G  5.7G   45G   12% /
/dev/sde2               xfs       1014M  336M  679M   34% /boot
/dev/sdj1               xfs        1.9T  1.4T  476G   75% /recorded
/dev/mapper/centos-home xfs         55G  975M   54G    2% /home
tank                    zfs        7.1T  2.1T  5.0T   30% /tank
tmpfs                   tmpfs      1.2G     0  1.2G    0% /run/user/1000

sambaで無事共有もできたので問題なさそうです。

動作確認

ひとまず今のところdmesgにエラーは発生しなくなりました。
エクスプローラーで表示が遅いという件は解決せず。
ただ1回開くと2回目以降はすぐに表示されるようになるのでちょっと改善。
うーん。
まぁヨシとしますか。

最後に、ベンチマーク結果です。

raidz_rebuild_01.png