SSDをキャッシュデバイスとして使用できるFlashcacheの紹介 | サイバーエージェント 公式エンジニアブログ
こんにちは。アメーバでインフラエンジニアをやっているSakamotoです。

今回はSSDをキャッシュデバイスとして使用できるFlashcacheについて書きたいとおもいます。

■Flashcacheとは
 Facebookが開発したSSDをキャッシュ領域として使用し、
 データを書きこむ際にHDDと同時にSSDに書き込み(ライトバック)を
 行うことができるカーネルモジュールです。
 データの読み出し時もSSDを参照するため高速になります。

 Device-Mapper(論理/物理デバイスのマッピング機構)を使用しており、
 OSからはキャッシュで使用する領域とデータとして使用する領域が
 論理的に一つのスライスとして認識されます。

$サイバーエージェント 公式エンジニアブログ-flashcache


 MySQLのInnoDB用に開発されたようですが、
 上記のことから他アプリケーションでも通常のディスクとして
 キャッシュ領域を意識することなく使用することができます。

 今回はファイルサーバにFlashcacheを適用することを目的として
 使ってみることにします。

■動作確認環境
 CPU   :Xeon E5540 @ 2.53GHz
 Memory  :512MB
 SATA HDD : 80GB
 SSD    :160GB
 OS    :CentOS 5.4

 ※ディスクIO検証のためOSキャッシュに乗らないようメモリを少なくしています。

■Flashcacheのインストール
1.カーネルモジュールのビルドに必要なパッケージのインストール

 -----------------------------------------------------------
# yum install rpm-build redhat-rpm-config unifdef
 -----------------------------------------------------------


2.必要なパッケージのビルド
今回はOSがCentOS 5.4なので以下のようにRPMパッケージのビルドを行います。

 -----------------------------------------------------------
# cd /usr/src/redhat/SRPM/
# wget http://vault.centos.org/5.4/updates/SRPMS/kernel-2.6.18-164.15.1.el5.src.rpm
# rpm -i kernel-2.6.18-164.15.1.el5.src.rpm 2>&1 | grep -v mockb
# cd /usr/src/redhat/SPECS
# rpmbuild -bp --target=`uname -m` kernel-2.6.spec 2> prep-err.log | tee prep-out.log
 -----------------------------------------------------------


3. 現在の設定を引継ぎ
 現在のカーネルパラメータ設定などを引き継ぐようビルドします。

 -----------------------------------------------------------
# cd /usr/src/redhat/BUILD/kernel-2.6.18/linux-2.6.18.x86_64
# make oldconfig
# make prepare
# make modules_prepare
 -----------------------------------------------------------


4. Flashcasheのソースを準備
 Flashcacheのプロジェクトサイトからgit cloneなどでソースを入手し、以下を実施します。 

 -----------------------------------------------------------
# mv flashcache /usr/src/redhat/BUILD/kernel-2.6.18/linux-2.6.18.x86_64
# vim /usr/src/redhat/BUILD/kernel-2.6.18/linux-2.6.18.x86_64/flashcache/src/Makefile
 -----------------------------------------------------------

   最初の一行目を以下の用に変更します。
   変更前

 -----------------------------------------------------------
   EXTRA_CFLAGS=-I$(KERNEL_TREE)/drivers/md -I./
 -----------------------------------------------------------

   変更後

 -----------------------------------------------------------
   EXTRA_CFLAGS=-I$(KERNEL_TREE)/drivers/md -I$(KERNEL_TREE)/include/linux -I./
 -----------------------------------------------------------


5. カーネルモジュールのコンパイル

 -----------------------------------------------------------
# cd /usr/src/redhat/BUILD/kernel-2.6.18/linux-2.6.18.x86_64/flashcache/src
# make KERNEL_TREE=/usr/src/redhat/BUILD/kernel-2.6.18/linux-2.6.18.x86_64/
 -----------------------------------------------------------


6. モジュールのロード
  モジュールのロードを実施します。
  ロードされていることとFlashcacheのバージョンを確認します。

 -----------------------------------------------------------
# /sbin/insmod flashcache.ko
# /sbin/lsmod | grep flashcache
# cat /proc/flashcache_version
 -----------------------------------------------------------



■データ領域作成とマウントまで
 例えば、/dev/sdcがSSD、/dev/sdbがHDDだった場合以下のようにデータ領域を作成します。

 -----------------------------------------------------------
# flashcache_create -s 32g -b 4k cachedev /dev/sdc /dev/sdb
 -----------------------------------------------------------

  sdcにIOが発生するときsdbのSSDキャッシュとして使用する。
  キャッシュ領域は32GB、ブロックサイズは4KB、デバイス名はcachedevとする。

 上記を実行すると、/dev/mapper/cachedev が作成されますので
 こちらをフォーマットしてマウントします。

 -----------------------------------------------------------
# mkfs.ext3 /dev/mapper/cachedev
# mount -t ext3 /dev/mapper/cachedev /data
 -----------------------------------------------------------

 以上で使用することができます。



■管理コマンドについて
Flashcacheには以下の3つの管理コマンドが存在しています。
1. flashcache_create
 上記の通りFlashcacheボリュームを新規作成します。 

2. flashcache_destroy
 作成したFlashcacheボリュームを削除します。
 cache_devnameがcachedevだった場合は以下のようになります。

 -----------------------------------------------------------
# flashcache_destroy cachedev
 -----------------------------------------------------------


3. flashcache_load
 すでに存在しているキャッシュ領域を使用してFlashcacheボリュームを作成します。

 -----------------------------------------------------------
# flashcache_load cachedev /dev/sdc /dev/sdb
 -----------------------------------------------------------






■ロードテスト内容
 以下条件で指定のボリュームに書き込みと読み込み
 ファイルサイズ        :1MB
 ファイル数          :1万ファイル(10GB)
 スレッド数          :10
 キャッシュ領域のブロックサイズ:4KB
 キャッシュサイズ       :5GBの場合と、10GBの場合で実施
 ファイルシステム       :ext3

■ロードテスト結果

$サイバーエージェント 公式エンジニアブログ-loadtest


 writeについて
  SSD単体のパフォーマンスには及びませんが、
  頻繁に呼び出すデータがSSD内に入る程度のデータであれば、
  そこそこのパフォーマンスは出ているように思います。

 readについて
  SSD単体のパフォーマンスにはかなり劣る結果となりました。
  iostatを見てみると、データがSSDにすべて乗っている場合でもSSDのみから読み
  出しているわけではなくHDDにもアクセスしているため遅くなっています。


■Flashcacheの良いところ
 ディスク容量を大きくもつことができ、SSDのように高速なwriteアクセスを実現できる。
 アプリケーション側でFlashcacheを使用していることを考慮することなしにファイルアクセスできる。


■Flashcacheの悪いところ
 SSDの性能をフルに活かすことができない。


■最後に
 今回は簡易的な負荷試験に終始してしまい、
 障害試験や詳細は負荷試験などはこれから行う予定です。
 その際にはまた何かの機会に報告したいと考えています。
 Flashcacheはまだ色々と発展途上な部分はありますが、期待できるプロダクトだと思っています。