md raid5 の破棄が非常に遅い

md raid5 の破棄が非常に遅い

こんにちは、MDレイドの専門家の皆さん

Centos 8 (最新のアップデートをすべて適用、カーネル 4.18.0-240.1.1.el8_3.x86_64) を実行しています。ここでは、3x2T Samsung SSD 860 QVO 2TB を raid5 で使用しています (一部の KVM VM のベースとして使用)。破棄を伴う操作を行うと、速度が遅いだけでなく、使用できないほど遅くなります。1.5T LV を作成し、"mkfs.ext4" を実行したところ、4 時間後に破棄ステージで "デバイス ブロックを破棄しています: 10489856/409148416" と表示され、最初は "25% で 4 時間、これはまずい" と思いましたが、2.5% しかないことに気付き、1 週間の話になりました。

私は RAID を分割し、3 つの個別のドライブで blkdiscard を実行しましたが、それぞれ約 18 秒かかりました。

ハードウェアは、Smart Array P420i コントローラー (特別なドライバーは使用せず、すべて標準の Centos ドライバーを使用) を搭載した HP Proliant DL380p Gen8 です。これを HBA モード用に構成したので、パススルーのみになります (hw raid を使用している場合、破棄はまったくサポートされません)。

デバイスを破棄した後、再度RAIDを作成しました

mdadm --create /dev/md20 --level=5 --raid-devices=3 --chunk=64 /dev/sd{b,d,e}1

一晩放置して同期させました。その後、vg を作成し、lv 作成をテストしたところ、100M を破棄するのに 7 分かかりました。

root@terrok:~ # lvcreate -nDELME -L100M vgssd2  && date && time mkfs.ext4 /dev/vgssd2/DELME && date && time lvremove -f /dev/vgssd2/DELME;date
  Logical volume "DELME" created.
Mon Dec 21 12:47:42 EST 2020
mke2fs 1.45.6 (20-Mar-2020)
Discarding device blocks: done
Creating filesystem with 102400 1k blocks and 25688 inodes
Filesystem UUID: f7cf3bb6-2764-4eea-9381-c774312f463b
Superblock backups stored on blocks:
        8193, 24577, 40961, 57345, 73729

Allocating group tables: done
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done


real    7m20.095s
user    0m0.004s
sys     0m0.195s
Mon Dec 21 12:55:02 EST 2020
  Logical volume "DELME" successfully removed

real    7m17.881s
user    0m0.018s
sys     0m0.120s
Mon Dec 21 13:02:20 EST 2020
root@terrok:~ #

比較として、同じシステムで RAID 1 に 2 つの WDC WDS100T2B0A-00SM50 (1T SSD) も使用していますが、そこでは破棄が非常に高速で、10G で 4 秒です。

その後、Samsung SSD を 2 つ取り出して RAID 1 を作成し、破棄時にフルスピードに設定しました。他の 2 つのドライブの組み合わせでも同じ操作を繰り返しましたが、問題はありませんでした。これは RAID 5 に問題があることを示しています。今のところ、2 つの SSD を RAID 1 にし、1 つのホット スペアを使用しており、少なくともこれで動作しますが、もちろん予想よりも 2T 少ない容量です。

これを raid5 で使用できるようにするにはどうすればいいか、何か提案はありますか?

答え1

テストで実証されているように、RAID5 は確かに単純な RAID 1 アレイよりも集中的な操作です。RAID 1 は文字通り 2 つのディスク間の同期だけだからです。

一方、RAID 5では、3つのディスク間でこの計算をすべて実行する必要があります。そしてそれらをパリティアップします。少なくとも「単純な」RAID 1 アレイと比較すると、これは大変な作業です。

また、補足として、QVO ドライブは、通常ドライブのアクティビティが重要となる VM のサービスなどの負荷には適していません。RAID 5 などのパリティ アレイも同様です。その点と RAID 5 自体の状況を考慮して、展開戦略を再検討したほうがよいかもしれません。

答え2

私もこの問題に取り組みました。raid5 のドライバーを詳しく調べたところ、raid5 は受信した破棄要求を基盤デバイス上の 4k 破棄要求に分割していることがわかりました。さらに、これはかなり前から壊れていたため、実質的に devices_handle_discard_safely を無視しています。その結果、すべての 4k 破棄は基盤デバイスと同期して行われるため、全体としてさらに遅い操作になります。補足: この問題については近々 LKML に取り上げますので、そちらでご確認ください。既存のカーネルで利用できる回避策についてはよく知りません。

関連情報