【研究課題レポート抜粋】各無償OSにおけるFSとMySQLの性能 | サイバーエージェント 公式エンジニアブログ
これは第1回研究課題(2008年前半期)におけるDaikoku氏のレポート「Linux,OpenSoralis,FreeBSDの各ファイルシステムにおけるMySQLの性能評価」からの抜粋です。当時の環境、状況における結果の有用性から、最優秀賞を受賞しました。
1. はじめに
これまでは,Linux上でMySQLを利用することが多かったが,昨今,他のOSもオープン化や利便性向上,新しいファイルシステムへの取り組み等,注目すべき点がある.本稿では,IAサーバにLinux,OpenSolaris,FreeBSDをインストールし,MySQLを稼動させ特徴や性能の評価を行う.
2. ファイルシステムについて
現在のところ,アメーバで利用しているMySQLはext3を利用している.その他の主なファイルシステムとしては,下表のようなものがある.
本稿では,特に実用性が高いと思われるext3,UFS2(以降UFSと呼ぶ),XFS,ZFSを使用する.

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

3. 評価
3.1. 方法
下記のベンチマーク・ソフトを用いて性能評価を行う.ただし,測定を行うデータ領域はOSがインストールされている領域とは異なるディスクとする.

1) Bonnie++ (v 1.03d)
ファイルシステム単体でのファイル読み書きの性能を測定する.
2) Super-Smack (v 1.3)
別の筺体からINSERT/SELECT/UPDATE/DELETEクエリーを発行し,スループットを測定する.

3.2. 環境

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

3.3. 設定(OS)
カーネルはデフォルト設定,ファイルシステムについては、以下の設定で測定を行なうこととした.

1) ext3
デフォルト
2) XFS
デフォルト(osyncisdsync)
3) ZFS
圧縮機能(compression):ON/OFFで検証
チャンクサイズ(recordsize):基本的にデフォルトの128Kで検証.レスポンスが上がらない場合は随時変更
4) UFS
soft-updateを有効とする

3.4. 設定(MySQL)
各OSでのconfigureは以下とした.
1. Linux
./configure \
--prefix=/usr/local/mysql4.1.21 \
--localstatedir=/usr/local/mysql4.1.21/data \
--with-mysqld-user=mysql \
--with-charset=utf8 \
--with-extra-charsets=all \
--enable-thread-safe-client

2. OpenSolaris
CC=gcc CFLAGS="-O3 -m64" \
CXX=gcc CXXFLAGS="-O3 -m64 -felide-constructors -fno-exceptions -fno-rtti" \
LDFLAGS="-m64" \
./configure \
--prefix=/usr/local/mysql4.1.21 \
--localstatedir=/usr/local/mysql4.1.21/data \
--with-mysqld-user=mysql \
--with-charset=utf8 \
--with-extra-charsets=all \
--enable-thread-safe-client \
--build=x86_64-solaris

3. FreeBSD
/* portsの内容を参考 */
./configure
--prefix=/usr/local/mysql4.1.21 --localstatedir=/usr/local/mysql4.1.21/data \
--with-libwrap \
--with-mysqlfs \
--with-vio \
--with-comment=FreeBSD port: mysql-server-4.1.21 \
--enable-thread-safe-client \
--with-named-thread-libs=-pthread \
--build=x86_64-freebsd

3.5. 結果
1) Bonnie++
各OS-ファイルシステムで実行した結果を以下に示す(10回実行した結果の平均値).

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


この時点では,ZFS,UFSがext3を上回った.また,FreeBSDについては,UFSが最も性能が高いように見受けられる.

2) Super-Smack
上記,Bonnie++の結果を受け,以下の組み合わせに絞り込み,MySQLのスループットを計測することとした.

1. Linux – ext3 及び XFS
2. OpenSolaris – ZFS(圧縮あり/なし)
3. FreeBSD – UFS

尚,MySQLの共通条件として
MyISAMエンジンを使用
key_bufferは1Gbyte,query_cacheはOFF
使用するデータのレコードサイズは1Kbyte
とした.

結果は次項.


1. INSERT について
以下の条件での測定結果
・ 合計で100万クエリーを実行
・ スレッド数を1,10,20と増やして計測
$サイバーエージェント 公式エンジニアブログ

2. SELECT について
以下の条件での測定結果
・ 合計で100万クエリーを実行
・ スレッド数を1,10,20と増やして計測
・ クエリー条件はプライマリキーをランダム指定
・ 対象テーブルのサイズは2Gbyte(200万件)
サイバーエージェント 公式エンジニアブログ

3. UPDATE について
以下の条件での測定結果
・ 合計で10万クエリーを実行
・ テーブルロックの影響が大きいので
スレッド数は1とした
・ クエリー条件はプライマリキーをランダム指定
・ 対象テーブルのサイズは2Gbyte(200万件)
サイバーエージェント 公式エンジニアブログ

4. DELETE について
以下の条件での測定結果
・ 合計で10万クエリーを実行
・ テーブルロックの影響が大きいので
スレッド数は1とした
・ クエリー条件はプライマリキーをランダム指定
・ 対象テーブルのサイズは2Gbyte(200万件)
サイバーエージェント 公式エンジニアブログ

4. 考察
Bonnieの結果に反し,MySQLの性能がとりわけ高かったのがLinux + XFS の組み合わせだった.要因としては,XFSの遅延アロケーションが影響していると考えられる.vmstatやiostatを確認してもsyncのタイミングでI/OやLoadが一時的に高騰するものの,総合的にCPUの待ちが他と比べて少なく,高負荷時でも高いレスポンスを示した.

ZFSも遅延アロケーションが実装されているようだが,XFSには及ばなかった.また,SELECTに関しては,非常にI/Oが高くなり,他と比較すると良い結果を得られなかった.recordsizeも変えてみたが結果は悪くなるばかりだった.恐らく,MyISAMがOSのbuffre cacheを利用するということや,MySQLのconfigureやバージョン自体が適していなかったのではないかと考えられる.

FreeBSD + UFSについては,XFSの次に性能が高く,全ての検証パターンでバランスも良かった.

今回の計測に関して,性能に順位をつけるとすると,高い順に
Linux+XFS > FreeBSD+UFS > OpenSolaris+ ZFS(圧縮ON) > Linux + ext3 > OpenSolaris + ZFS(圧縮OFF)
となった.
5. 最後に
今回の結果を受け,XFSは実践でも利用していきたいと思った.安全面に関しては,ext3よりも下がるのかもしれないのでその点を踏まえてうまく利用していきたい.

また,今回検証はできなかったが以下の点は確認しておきたい.

1. XFS + innodbのO_DIRECT(OSのbuffer cacheを利用しない)の場合
2. XFS + LVM2 でのMySQLバックアップ
3. OpenSolaris上でのMySQL及び,ZFSのチューニング
4. ファイルシステムのatimeの更新なしでの性能評価
5. 各OSのオリジナルなMySQLパッケージの使用

参 考 文 献
[1] Solaris ZFS 管理ガイド
(http://docs.sun.com/app/docs/doc/819-6260)
[2] A look at MySQL on ZFS
(http://dev.mysql.com/tech-resources/articles/mysql-zfs.html)
[3] MySQL InnoDB Performance Tuning for the Solaris 10 OS
(http://developers.sun.com/solaris/articles/mysql_perf_tune.html)
[4] FreeBSD 7.0 へようこそ
(http://gihyo.jp/admin/feature/02/freebsd-7)