2013年11月2日土曜日

レベリングのしくみ

レベリングのしくみをざっと説明します。

 Flash Drive Levelingの基本の動作は、さまざまなアドレスへのライトデータをまとめて、連続データとしてフラッシュメモリに書き込むというものです。要求のあった順番にまとめていくので、もともと指定されたアドレスとは異なる場所に書き込まれることになります。そこで、どのアドレスのデータをどこに書き込んだかをインデックスとして記憶しておきます。後に読み出し要求があったときには、このインデックスを参照して、正しいデータを読み出すことができます。

 フラッシュメモリは、小サイズのランダムライトが極端に遅いという特徴があるため、この動作によって最大で千倍近い大幅な性能向上が見込めます(実測データ)。また、同一アドレスへの繰り返しの書き込みでも、書き込みの順に異なる場所へマッピングされるため、素子の消耗が分散します(ウェアレベリング)。

 似たような管理手法として、ネット通販大手のアマゾンの在庫管理があります。アマゾンの倉庫では、商品を入荷した順に空いた棚に並べていくそうです。このとき、どの商品がどの棚に置かれたかはコンピュータで管理されるため、商品を棚の上に整理して配置する必要はありません。商品を書き込みデータに、倉庫をフラッシュメモリになぞらえてみると、これはFlash Drive Levelingの動作と類似しています。

 さて、どんどん倉庫に商品が保管されていって、空いている棚がなくなったときにはどうすればよいでしょうか。以前に入荷した商品の相当数はすでに出荷されているはずです。売れ残り商品がほとんど無く、ほぼ空いている棚もいくつかはあるでしょう。そこで、そのような棚から売れ残り商品を取り除き、新しい入荷商品を並べていけばよいでしょう(実際にアマゾンでそのようにしているかどうかは私は知りません)。

 レベリングにおいても、同様な処理を行っています。比較的空き領域の多いところをみつけ、そこからまだ有効なデータ(売れ残り)だけを他へ移動させて、新規のデータをまとめて書き込むための連続した空き領域を確保します。これを再配置と呼んでいます。なお、再配置データも新規の書き込みデータとあわせて連続データとしてまとめて書き込みます。ところで、以前に書き込んだ領域になぜ空き領域があるのでしょうか。アマゾンの場合は、商品が売れて出荷したからですが、レベリングの場合は、同じアドレスへの書き込みにより以前のデータが不要となるためです。

 レベリングを開始した直後では、空き領域が多く再配置は不要なので、最高の書き込み性能が得られます。ところが、使い込んでいくうちに空き領域が少なくなり、再配置が必要になってきます。再配置の量が多くなれば、新規に書き込むデータの割合がそれだけ減少し、性能が劣化することになります。これを低減するためには、仮想ドライブの容量(仮想サイズ)を、フラッシュメモリの容量よりも相当小さくします。例えば、仮想サイズをフラッシュメモリ容量の1/3に設定すると、フラッシュメモリ全体のうちで、有効なデータは1/3しかありません。比較的に空き領域の多いところで再配置を行えば、再配置の量が全書き込み量の1/3を超えません。つまり、再配置が全くないときの性能を1とすると、再配置の量が最大のときの性能は2/3です。式で表すと、以下のようになります。

 最低の書き込み性能 : 最高の書き込み性能
  =(フラッシュメモリ容量 − 仮想サイズ) : フラッシュメモリ容量

 この式からわかるように、仮想サイズをフラッシュメモリ容量に近づけると、最低の書き込み性能が悪化します。このような理由で、仮想サイズは約8割のサイズまでしか指定できないようになっています。8割で設定すると上記式の比の値は1/5です。なお、この計算式は、アクセスのパタンや、再配置のポリシー設定によって実際には変わってきます。

 最後に実装に関してすこしだけ。

 Flash Drive Levelingのドライバは、ファイルシステムとストレージドライバの間に挿入されます。アプリケーションから発行されたアクセス要求は、ファイルシステム→レベリングドライバ→ストレージドライバと渡っていき、最終的にフラッシュメモリに到達します。レベリングドライバのところでは、要求の分割とマッピングが行われます。なお、レベリングの設定をしていないフラッシュメモリの場合は、アクセス要求はレベリングドライバを素通りします。

 レベリングドライバは、ファイルシステムよりも下に位置しているため、どのようなファイルシステムでフォーマットしても使用可能です。また、NTFSの暗号化や圧縮なども使用可能です。なお、デフラグも実行可能ですが効果はありません。

0 件のコメント:

コメントを投稿