cachefilesdでNFSの読み込みを高速化する

cachefilesd(fscache)とは?

システムを構築する際に複数のウェブサーバーが存在する場合、
NFSがよく使われますが、NFSを利用しているとパフォーマンスの問題をよく耳にします。
実際に弊社でもNFSを導入した場合のパフォーマンスの落ち込みはローカルディスクと比べて1/3程度、
更にDRBD等でNFSサーバー同士を冗長化をしていると、
10GbEを用いない場合ではシーケンシャルで60MB/sまでスピードが落ち込んでしまいます。

fscacheとはNFSマウントされる共有ファイルシステムをローカルにキャッシュし、
NFSサーバーの負荷軽減、読み込み速度の高速化を実現し、パフォーマンス改善を行う事ができます。

fscacheをインストールする

fscacheはNFSをマウントするクライアント側にインストールします。
CentOS6では公式リポジトリに追加されていますので、インストールは簡単です。

・cachefilesdのインストール

yum -y install cachefilesd

・cachefilesdの設定
今回は特に設定を行いませんが、設定ファイルには以下の記述があります。

vi /etc/cachefilesd.conf
--------------------------------------------------
# cache保存ディレクトリの指定
dir /var/cache/fscache

# キャッシュタグの指定、複数のタグを指定する事で使い分けが可能
tag mycache

# キャッシュの容量制御設定
# runは空き容量がこれ以下になったらcullに移行する
# cullはキャッシュを整理する
# stopは空き容量がこれ以下になったら動作を停止する設定です。
# bはブロックサイズ(ファイル容量)、fはファイル数(inode数)を表しています。
brun 10%
bcull 7%
bstop 3%
frun 10%
fcull 7%
fstop 3%
# Assuming you're using SELinux with the default security policy included in
# this package
secctx system_u:system_r:cachefiles_kernel_t:s0

・cachefilesdの起動
以下のコマンドにより実行されます。

/etc/init.d/cachefilesd start

・cachefilesdの利用
設定を行っただけでは実はまだ使う事ができません。
1つはキャッシュ利用先のファイルシステムがuser_xattr属性に対応している必要があります。
CentOS6の場合は標準で対応していますので、特に設定は不要です。

2つ目にNFSサーバーのマウントオプションにFSCを追加する必要があります。
既存でマウント済の場合は、/etc/fstabにfscというオプションを追加し、netfsの再起動を行ってください。

・cachefilesdのステータスを確認
まずは上記設定が終わった後に、/var/cache/fscacheを見てみましょう。

find /var/cache/fscache/
--------------------------------------------------
(中略)
./cache/@4a/I03nfs/@52/Jc0000000000000cG2Md0/@18/J11000000000004120000000000000000000M00000080000w000Kb000wFe000jt000oG3000000040000g000000000/@f0/Es0g000w00w00h800000A1Eb0OPzSlf0wt30qpwtR
./cache/@4a/I03nfs/@52/Jc0000000000000cG2Md0/@18/J11000000000004120000000000000000000M00000080000w000Kb000wFe000jt000oG3000000040000g000000000/@f0/Es0g000w00w00h80000g92Xd0tzhSlzxMu30QoAtR
./cache/@4a/I03nfs/@52/Jc0000000000000cG2Md0/@18/J11000000000004120000000000000000000M00000080000w000Kb000wFe000jt000oG3000000040000g000000000/@f0/Es0g000w00w00h80000gV0yg0ZEuSlb1w84wTcBtR
./cache/@4a/I03nfs/@52/Jc0000000000000cG2Md0/@18/J11000000000004120000000000000000000M00000080000w000Kb000wFe000jt000oG3000000040000g000000000/@f0/Es0g000w00w00h80000wD1Xd0ZChSlTeMu3gFnAtR

上記ファイルが作成されていればOKです。

NASの利用状況を確認するには、以下のコマンドを入力します。
FSCがyesとなっていればfscacheが利用されています。

cat /proc/fs/nfsfs/volumes--------------------------------------------------
NV SERVER	PORT DEV	 FSID			  FSC
v3 c0a802dc  801 0:19	811:0			 yes
v3 c0a8026d  801 0:20	ebed734dbd543b64  yes

またキャッシュの利用状況を確認するには以下のコマンドを入力します。

cat /proc/fs/fscache/stats--------------------------------------------------
FS-Cache statistics
Cookies: idx=12 dat=532 spc=0
Objects: alc=535 nal=0 avl=535 ded=0
ChkAux : non=0 ok=0 upd=0 obs=0
Pages  : mrk=1545 unc=0
Acquire: n=544 nul=0 noc=0 ok=544 nbf=0 oom=0
Lookups: n=535 neg=535 pos=0 crt=535 tmo=0
Invals : n=0 run=0
Updates: n=0 nul=0 run=0
Relinqs: n=8 nul=0 wcr=0 rtr=0
AttrChg: n=0 ok=0 nbf=0 oom=0 run=0
Allocs : n=0 ok=0 wt=0 nbf=0 int=0
Allocs : ops=0 owt=0 abt=0
Retrvls: n=470 ok=0 wt=177 nod=470 nbf=0 int=0 oom=0
Retrvls: ops=470 owt=197 abt=0
Stores : n=1545 ok=1545 agn=0 nbf=0 oom=0
Stores : ops=514 run=2059 pgs=1545 rxd=1545 olm=0
VmScan : nos=0 gon=0 bsy=0 can=0 wt=0
Ops	: pend=197 run=984 enq=2059 can=0 rej=0
Ops	: dfr=0 rel=984 gc=0
CacheOp: alo=0 luo=0 luc=0 gro=0
CacheOp: inv=0 upo=0 dro=0 pto=0 atc=0 syn=0
CacheOp: rap=0 ras=0 alp=0 als=0 wrp=0 ucp=0 dsp=0

最近は手順が長くて大変そうに思えるような記事が続いていましたが、
今回はお手軽に利用できるfscacheを注目してみました。

弊社システムではmemcachedにデータをキャッシュする方法が主流なので、
fscacheの注目度は低いですが、
プログラムに変更を加えずNFSのパフォーマンスを改善してみたい方、是非トライしてみてください。

最新ブログ一覧