2011年11月22日火曜日

L2ARCを止めてみた(前編)

このエントリーをはてなブックマークに追加
RAID-Zは遅いよ」で書いたように、ZFSのSSDによるキャッシュとしてL2ARCと自作のpcacheを用いていています。SSDはIntel X25-M 160GBが4個あり、L2ARCとpcacheに2個ずつ割り当てています。pcacheはARCでキャッシュしています。pcacheの役割はARCとL2ARCが埋まるまでの時間かせぎなので、それでいいと思っていました。

でも最近はARCとL2ARCが全部埋まっても、ストレージの負荷がかなり高いです。キャッシュに使っているSSDの負荷は低いままです。以下のグラフはストレージとSSDの1日の負荷の変動をプロットしたものです。ストレージの負荷がピークで70%を超えています。
以下のグラフは長期的なストレージの負荷の変動と、その直線近似をプロットしたものです。じょじょに負荷が高くなっているのがわかります。もうすぐネットワークインターフェイスを20Gbpsに増速するのですが、この調子ではそのときの負荷に耐えられるか心配です。
ストレージの負荷を減らすには、キャッシュをより有効に使う必要があります。まず平均的なワークロードで1日のキャッシュのヒット率を調べたところ、ARCは平均で93.4%、pcacheは63.5%、L2ARCはふるわず38.3%でした。pcacheはARCでキャッシュしています。93.4%はARCにひろわれるので、ARCが埋まってしまえばpcacheへのアクセスはほとんどないと思っていました。

しかし、pcacheとL2ARCそれぞれのI/Oを調べてみたところ、予想に反した結果になりました。下のグラフは縦軸がMB/sで、pacheとL2ARCにわけてSSDのI/Oの帯域を表しています。最も読まれていたのはpcacheでした。L2ARCのI/Oはほぼ拮抗しています。
下に示したのはZFSのキャッシュ機構の概要です。ARCは基本的にはLRUです。アクセスされたブロックが先頭に回り、アクセスのないブロックが後ろに寄せられて消えていきます。L2ARCはARCの古い方から一定の範囲を読んで、まだキャッシュしていないブロックをキャッシュします。このブロックにアクセスがあったときに、ARCから消えていたらL2ARCから読まれます。L2ARCはリングバッファで、書いただけ古いのが消えます。

上のデータから読み取れるのは、この図の黒い矢印に示した流れです。pcacheから入ったブロックでARCが古い方に押されて、後ろのブロックがL2ARCに入ります。L2ARCに入ったブロックがすぐにARCから追い出されて、またL2ARCから読まれる。これを繰り返しているようです。

つまりpcacheをARCでキャッシュしているのが悪いということになります。一度ARCでキャッシュしない設定を試したときに、SSD 2つでは能力的にギリギリだったのでARCでキャッシュしていました。この様子を見ると、pcacheをARCでキャッシュするのを止めて、L2ARCからpcacheにSSDを回した方がいいかもしれません。

まずはpcacheのSSDは2つのままで、ARCでキャッシュしないとどうなるかデータを取ってみました。(後編に続く)

0 件のコメント:

コメントを投稿