小型PCサーバのため、NVMeのM.2スロットが一つ、2.5インチSATAコネクタが1つしかない。そのため、RAID0やRAID1でSATA側が足を引っ張る。
対策としてwrite-mostlyを設定した。これにより、SATA側を「ほぼ書き込み専用」としてマークする。
なお、書き込み性能の根本的なボトルネックは解消できない。RAID1の整合性を保つには、データは必ず両方のディスクに書き込まれる必要があり、その完了は遅い方のディスクを待つ必要がある。
しかし、その「待ち時間」をアプリケーションから見てどのように扱うか、という点でwrite-mostlyにより改善される可能性がある。
write-mostlyの効果
書き込み時:
システムは高速なNVMe SSDへの書き込みが完了した時点で、アプリケーションに「書き込み完了」を通知します。遅いSATA SSDへの書き込みはバックグラウンドで継続されます。これにより、書き込み処理の待ち時間(レイテンシ)が改善され、アプリケーションの応答性が向上する(はず)。
読み込み時:
mdドライバは、write-mostly が指定されたディスクからの読み込みを可能な限り避けるようになる。これにより、読み込みが高速なNVMe SSDに集中しやすくなる。
リスク:
NVMeへの書き込み後、SATAへの書き込みが完了する前にシステムがクラッシュした場合、ミラー間に不整合が生じる可能性があります。次に起動した際に再同期(resync)がかかるが、同期が取れていない間にNVMe側が完全に壊れてしまうリスクは認識しておく必要がある。
同期速度の改善
SATA側への再同期の速度を改善することは、write-mostlyを使った運用においては、重要になる。具体的な対策としては、write-intent bitmapを利用し、ディスクのどの領域に変更があったかを記録する「目印(ビットマップ)」をRAIDアレイ内に保持させる。
write-intent bitmapの効果
システムが不意にシャットダウンした後、通常はRAIDアレイ全体のデータが一致しているかを確認するために、全領域の再同期(resync)が始まり、その間パフォーマンスが大きく低下する。ビットマップを有効にしておくと、変更があったブロックだけを同期すれば済むため、この復旧プロセスが数秒から数十秒で完了する。結果として、パフォーマンスが低下する時間を大幅に短縮できる。
設定方法
まず、write-intent bitmapを設定する。コマンドは以下のような形になる。
# mdadm --grow /dev/md3 --bitmap=internal
/proc/mdstatを確認したときに、bitmapの行があれば設定されている。
# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4] [raid0] [raid1] [raid10] [linear]
md3 : active raid1 sda3[3](F) nvme0n1p3[2]
62913536 blocks super 1.2 [2/1] [U_]
bitmap: 1/1 pages [4KB], 65536KB chunk
unused devices: <none>
続いて、write-mostlyを設定する。mdadm --manageで設定できるような記述や、
echo write-mostly | sudo tee /sys/block/md3/md/dev-sda3/state
という書き込みがあったがうまくいかなかったので、SATA側を一旦外して、取り付けることにした。
# mdadm /dev/md3 --fail /dev/sda3
# mdadm /dev/md3 --remove /dev/sda3
mdadm: hot removed /dev/sda3 from /dev/md3
# mdadm --add /dev/md3 --write-mostly /dev/sda3
mdadm: re-added /dev/sda3
# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4] [raid0] [raid1] [raid10] [linear]
md3 : active raid1 sda3[3](W) nvme0n1p3[2]
62913536 blocks super 1.2 [2/1] [U_]
[==>..................] recovery = 10.1% (6369408/62913536) finish=11.9min speed=78538K/sec
bitmap: 1/1 pages [4KB], 65536KB chunk
unused devices: <none>
sda3[3](W)のように(W)がついているので、write-mostlyが有効になっていることがわかる。
0 件のコメント:
コメントを投稿