新しい会話を開始

未解決

Community Manager

 • 

5.3K メッセージ

10

2025年6月9日 22:49

RAIDのライトペナルティをきちんと理解しよう!

RAIDのライトペナルティをきちんと理解しよう!

(記事が古くなりすぎたせいか、最近はGoogle検索に引っかからなくなってきてしまった、2013年に書いた「RAID5のランダムライトにおけるWrite Penalty(ライトペナルティ)」を書き直したものです。)

RAIDにおけるライトペナルティについて、存在は知っているが動作詳細については「?」という方は是非一度目を通してみてください。RAID5を例として挙げますが、この動作を一度追いかけるとライトペナルティのイメージがわきやすくなると思います。

 

まず前提となる知識としてRAID5のパリティ計算に利用されるxor計算の説明をします。

 

xor (⊕) 計算は1もしくは0のどちらかの値を取り、計算対象が同じ値であれば0、異なれば1の値を取ります。すなわち以下の関係が成り立ちます。​

​ ​

​1 ⊕ 1 = 0​

​1 ⊕ 0 = 1​

​0 ⊕ 1 = 1​

​0 ⊕ 0 = 0​

 

ここからは、RAID5におけるランダムライトのライトペナルティの説明です。一番効率が悪い、2 Read+2 Writeが発生するパターンです。

 

今回は8+1のRAID5であるとし、1ストライプにはD1、D2、D3、D4、D5、D6、D7、D8、P(パリティ)が保存されているとします。

 

RAID5のパリティは、ストライプ内にある(パリティ以外の)全てのデータに対するxor計算により求められます。つまり今回の例では以下の通りです。

 

D1⊕D2⊕D3⊕D4⊕D5⊕D6⊕D7⊕D8=パリティ=P ・・・⓪

 

ここでD2をD2’に書き換えるランダムライトが来たとします。

 

D2がD2’に書き換わったことにより、再度パリティを計算しなおす必要がありますが、まず最初に思いつくことはD1及びD3~D8全てを読み込んでパリティ計算を行うという方法、つまり

 

D1⊕D2’⊕D3⊕D4⊕D5⊕D6⊕D7⊕D8=Newパリティ=New P ・・・①

 

を行う方法ですが、これを実行するためには今回の例ではD1とD3 ~D8までの合計7つのデータを読み込み、D2’とNewパリティの合計2つを書き込むという7 Read、2 Writeというとてつもないペナルティを課されることになります。

 

そのような多大なペナルティを避ける方法として取られるのが以下の賢い方法です。

 

D1⊕D2⊕D3⊕D4⊕D5⊕D6⊕D7⊕D8 +⊕D2⊕D2’ ・・・②

= P⊕D2⊕D2’ ・・・③

 

ここで行っているのは、②の後ろの方で書き換えられるデータのD2を1つ加えることによりD2を式内で2回登場させ、更に最後に新たに書き込まれるD2’を加えるという処理です。

それにより、D2⊕D2の結果はxor計算の特性上0となり影響がなくなった上で、D2‘が(D2の代わりに)計算に組み込まれるということになるのです。

つまり①のD1⊕D2’⊕D3⊕D4⊕D5⊕D6⊕D7⊕D8=Newパリティ=New Pと同じ計算をしたことになります。

一見無駄な計算をしているように見えるかもしれませんが、ここで②のD1からD8までのxor計算をしている部分を見ると、これは⓪の式と同じ、既存のパリティ情報であることがわかります。

つまり②は③に書き換えられるということです。

結局のところ、①の計算結果=②の計算結果=③の計算結果となるわけですが、この中で一番計算量が少なくてすむのは、式の長さからも分かるように③です。

では、③を実際に計算する場合に必要なReadとWrite数を数えてみると

D2を読みだす必要あり

Pを読みだす必要あり

(③の式を使ってメモリ上で計算)

D2’を書き込む必要あり

New Pを書き込む必要あり

ということで2 Read、2 Writeで完了できることがわかります(素晴らしい!)。

これがRAID5で発生する最悪なシナリオの2 Read、2 Writeのライトペナルティです。(個人的にはデータを書き込むという時点で1 Writeは必ず必要となるので、ペナルティとしてカウントするのは2 Read、1 Writeと言ってもいいのではと思っていたりします)

これでもかなりペナルティが多いような気がしますが、結構賢い計算をして頑張っていることが分かると思います。

 

ここまででメインの話は終わりなのですが、このような動作が分かると何故シーケンシャルな書き込みは高速で行うことができるのかも簡単に理解できるようになるので、その説明を最後に書いておきます。

とはいってもここまで理解できた方であれば簡単です。

今回の例に当てはめると、D1~D8まで全てのデータが、D1’~D8‘まで一気に書き換わるのがシーケンシャルな書き込みです。となると、既に保存されているD1~D8(と既存のP)の情報など全く読み込む必要はなく、新たに書き込まれたD1’~D8’を利用してNewパリティをメモリ上で計算し、それら全てを一気にドライブに書き込むだけという単純な処理を行うことができるので、ペナルティなく高速に処理ができるということです。

レスポンスがありません。
イベントは見つかりませんでした!

Top