2011年12月24日土曜日

L2ARCの仕組み

このエントリーをはてなブックマークに追加
これは英語版の和訳です。 内容が重複する日本語の記事を2つ削除しました。

ZFSのL2ARCは名前こそL2ですが、CPUのL2キャッシュとは大きく異なっています。次の図はZFSのキャッシュの構造を示しています。L2ARCはHDDからARCに読み込まれたブロックのみをキャッシュします。ARCのHDDに書き込まれようとしているダーティなブロックはキャッシュしません。L2ARCとHDDの間のデータ転送はありません。ZFSは要求されたブロックがARCになくL2ARCにあったときに、L2ARCからARCに読み込んで返します.


L2ARCはもうすぐARCから追い出されそうになっているブロックをキャッシュします。ZFSはARCを構成するLRUを後ろから一定の範囲走査して、まだL2ARCにキャッシュしていないブロックを合計のサイズがl2arc_write_maxに達するまで集めます。l2arc_write_maxのデフォルトは8MiBです。スキャンする範囲はl2arc_write_maxとl2arc_headroomを掛けた数字です。l2arc_headroomのデフォルトは2です。この数字を大きくすると集まるブロックの合計サイズがl2arc_write_maxに近くなります。 次の図はこのプロセスを示したものです。この図はarc.cのコメントを元に作成しました。


L2ARCは1つ以上のリングバッファを構成しています。ZFSはヒットしたL2ARCのブロックをARCに読み込みますが、L2ARCの先頭にそのブロックを移動することはありません。ZFSはL2ARCに新しいブロックをコピーするときに古いブロックを追い出します。L2ARCに複数のSSDを割り当てたときには、それぞれが別のリングバッファになります。ZFSはそれをラウンドロビンで使います。

走査のサイクルは複数のパラメータで決まります。ZFSは集めたブロックの合計サイズに基づいて2つのサイクルのどちらかを選びます。合計サイズがl2arc_write_maxの半分以下なら、l2arc_feed_secsで指定された秒数で、デフォルトは1秒です。そうでなければl2arc_feed_min_msで指定されたミリ秒で、デフォルトは200ミリ秒です。L2ARCが十分に埋まっていて、キャッシュすべきブロックがあまり集まらなかったときにはサイクルは遅く、そうでなければ速くなります。

以下のdtraceスクリプトを用いて、ZFSがL2ARCにキャッシュする様子をわれわれのサーバで観察したところ、次のことがわかりました。l2arc_headroomに大きな値を指定するとキャッシュする速度が上がります。l2arc_write_maxに大きな値を指定してもキャッシュする速度は上がりますが、これはキャッシュが十分埋まっていないときだけです。埋まってくると走査のサイクルが遅くなるため速度が落ちます。

0 件のコメント:

コメントを投稿