MySQLデータベースにおける
Fusion-io社 ioDrive使用時の優位性について
© © ©
© 2012 Smart Style Co.,Ltd. 2012 Smart Style Co.,Ltd. 2012 Smart Style Co.,Ltd. 2012 Smart Style Co.,Ltd. 2 / 25
アジェンダ
• MySQLデータベースにおける
Fusion-io社 ioDrive使用時の優位性について
• 事例紹介
はじめに
• MySQLデータベースにおけるパフォーマンス向上の手段として、
ストレージ媒体をハードディスクドライブ(以下HDD)からFusion-io株式会社 ioDrive(以下ioDrive)に変更する選択肢に関して、
株式会社スマートスタイルがその有効性を検証した過程を記載し
たものです。
• 本書に記載された測定記録は、同様の構成を取った場合でも同
じ結果を保証するものではありません。
• 本書の執筆に際し全面的なご協力をいただきましたGMOイン
ターネット株式会社様、Fusion-io株式会社様に、この場を借りて
御礼申し上げます。
© © ©
© 2012 Smart Style Co.,Ltd. 2012 Smart Style Co.,Ltd. 2012 Smart Style Co.,Ltd. 2012 Smart Style Co.,Ltd. 4 / 25
測定緒元
•
CPU Intel Xeon CPU E5620 * 2
•
RAM 64GB
•
OS Red Hat Enterprize Linux 5(2.6.18)
•
MySQL 5.5.25-log Community Server (GPL)
•
HDD SAS 146GB 6台(Hardware RAID1+0)
•
ioDrive ioDrive Duo 320SLC 2台(Software RAID)
•
負荷テストツールpercona-tools tpcc-mysql
・負荷計測の直前にOSを再起動し、バッファ・キャッシュの内容をクリアする
・データベーステーブル数 9(tpcc-mysqlによる作成)
・負荷クライアントからの同時実行スレッド20(tpcc-mysqlによる実行)
・データベース起動直後から計測を行う
・tpcc-mysqlの算出するtpmCの値ではなく毎分のCom_queryの増分を計測し
QPS(Query Per Second)の推移を記録する
・測定は90分間を3回行い、値は記録された数値の平均を採用する
・メモリ関連のMySQLパラメータはHDD使用時、ioDrive使用時で同じものを使用するが、I/O関連のパラメータに関してはそれぞれの特
性が出る様チューニングを実施する
HDD + innodb_buffer_pool_size = 256M
HDD + innodb_buffer_pool_size = 256M
HDD + innodb_buffer_pool_size = 256M
HDD + innodb_buffer_pool_size = 256M
© © ©
© 2012 Smart Style Co.,Ltd. 2012 Smart Style Co.,Ltd. 2012 Smart Style Co.,Ltd. 2012 Smart Style Co.,Ltd. 6 / 25
HDD + Innodb_buffer_pool_size=256M
HDD + Innodb_buffer_pool_size=256M
HDD + Innodb_buffer_pool_size=256M
HDD + Innodb_buffer_pool_size=256M
0
500
1,000
1,500
2,000
2,500
3,000
3,500
4,000
4,500
5,000
0:0
0
0:0
3
0:0
6
0:0
9
0:1
2
0:1
5
0:1
8
0:2
1
0:2
4
0:2
7
0:3
0
0:3
3
0:3
6
0:3
9
0:4
2
0:4
5
0:4
8
0:5
1
0:5
4
0:5
7
1:0
0
1:0
3
1:0
6
1:0
9
1:1
2
1:1
5
1:1
8
1:2
1
1:2
4
1:2
7
1:3
0
Q
PS
90
90
90
90分の平均 4,200QPS
4,200QPS
4,200QPS
4,200QPS程度
測定開始から10
10
10
10分程度で急激
に処理量が増加し、その後緩
やかに低下する
メモリ増設 or ioDrive
or ioDrive
or ioDrive
or ioDrive化
H/Wのスケールアップとして、
1) メモリの増設(今回は割り当て量増加で代替)
2) ioDrive化
© © ©
© 2012 Smart Style Co.,Ltd. 2012 Smart Style Co.,Ltd. 2012 Smart Style Co.,Ltd. 2012 Smart Style Co.,Ltd. 8 / 25
HDD + Innodb_buffer_pool_size=40G
HDD + Innodb_buffer_pool_size=40G
HDD + Innodb_buffer_pool_size=40G
HDD + Innodb_buffer_pool_size=40G
0
2,000
4,000
6,000
8,000
10,000
12,000
14,000
0:0
0
0:0
3
0:0
6
0:0
9
0:1
2
0:1
5
0:1
8
0:2
1
0:2
4
0:2
7
0:3
0
0:3
3
0:3
6
0:3
9
0:4
2
0:4
5
0:4
8
0:5
1
0:5
4
0:5
7
1:0
0
1:0
3
1:0
6
1:0
9
1:1
2
1:1
5
1:1
8
1:2
1
1:2
4
1:2
7
1:3
0
90
90
90
90分平均11,500QPS
11,500QPS
11,500QPS
11,500QPS
メモリ割り当て増加前に比べて
実に2.7
2.7
2.7
2.7倍
ioDrive + innodb_buffer_pool_size=256M
ioDrive + innodb_buffer_pool_size=256M
ioDrive + innodb_buffer_pool_size=256M
ioDrive + innodb_buffer_pool_size=256M
0
2,000
4,000
6,000
8,000
10,000
12,000
14,000
16,000
0:0
0
0:0
3
0:0
6
0:0
9
0:1
2
0:1
5
0:1
8
0:2
1
0:2
4
0:2
7
0:3
0
0:3
3
0:3
6
0:3
9
0:4
2
0:4
5
0:4
8
0:5
1
0:5
4
0:5
7
1:0
0
1:0
3
1:0
6
1:0
9
1:1
2
1:1
5
1:1
8
1:2
1
1:2
4
1:2
7
1:3
0
90
90
90
90分平均
10,000QPS
10,000QPS
10,000QPS
10,000QPS程度
HDD
HDD
HDD
HDDに比べて
2.4
2.4
2.4
2.4倍程度の処理量
測定開始から2
2
2
2分間で
処理量がピークに達する
© © ©
© 2012 Smart Style Co.,Ltd. 2012 Smart Style Co.,Ltd. 2012 Smart Style Co.,Ltd. 2012 Smart Style Co.,Ltd. 10 / 25
ioDrive
ioDrive
ioDrive
ioDrive化よりもメモリ増設が有効なのか?
0
2,000
4,000
6,000
8,000
10,000
12,000
14,000
16,000
0:0
0
0:0
3
0:0
6
0:0
9
0:1
2
0:1
5
0:1
8
0:2
1
0:2
4
0:2
7
0:3
0
0:3
3
0:3
6
0:3
9
0:4
2
0:4
5
0:4
8
0:5
1
0:5
4
0:5
7
1:0
0
1:0
3
1:0
6
1:0
9
1:1
2
1:1
5
1:1
8
1:2
1
1:2
4
1:2
7
1:3
0
平均だけを見るとそうも考えられる
測定開始直後の大きなグラフの違い
起動直後の優位性
• メンテナンスやH/WダウンでMySQL停止
• 起動後しばらくの間レスポンスが悪く、
アプリのタイムアウトや
Too many connection発生
• mysqld起動直後はバッファが空なので、
バッファが暖まるまでは
ストレージから読み込むしかない。
© © ©
© 2012 Smart Style Co.,Ltd. 2012 Smart Style Co.,Ltd. 2012 Smart Style Co.,Ltd. 2012 Smart Style Co.,Ltd. 12 / 25
起動直後の優位性
0 2,000 4,000 6,000 8,000 10,000 12,000 14,000 16,000 0:00 0:03 0:06 0:09 0:12 0:15 0:18 0:21 0:24 0:27 0:30 0:33 0:36 0:39 0:42 0:45 0:48 0:51 0:54 0:57 1:00 1:03 1:06 1:09 1:12 1:15 1:18 1:21 1:24 1:27 1:30立ち上がり直後から十分な処理量
mysqld
mysqld
mysqld
mysqld再起動直後の処理量に
悩んでいる環境にはとても有効と思える
データベースサイズごとの平均処理量
• データベースが肥大化していくほど、
処理量は低下していく
• HDDとioDriveで
© © ©
© 2012 Smart Style Co.,Ltd. 2012 Smart Style Co.,Ltd. 2012 Smart Style Co.,Ltd. 2012 Smart Style Co.,Ltd. 14 / 25
0 2,000 4,000 6,000 8,000 10,000 12,000 14,000 16,000 18,000
HDD HDDメモリ追加 ioDrive HDD HDDメモリ追加 ioDrive HDD HDDメモリ追加 ioDrive
DB 8GB DB 16GB DB 24GB
データベースサイズごとの平均処理量
15%
15%
15%
15%ダウン
22%
22%
22%
22%ダウン
10%
10%
10%
10%ダウン
6%
6%
6%
6%ダウン
17%
17%
17%
17%ダ
ウン
26%
26%
26%
26%ダウン
データベースサイズごとの平均処理量
• HDDを使っている場合は
DBサイズが増えるにつれ
かなりの速度で処理量が減少していく
• ioDriveを使用しているケースは
DBサイズの増加と比較して
処理量減少が圧倒的に穏やか
• DBサイズ16GBのケースでメモリの増強と比較して
ほぼ同程度、DBサイズ24GBのケースでは
メモリの増強よりも処理量向上率は高い
© © ©
© 2012 Smart Style Co.,Ltd. 2012 Smart Style Co.,Ltd. 2012 Smart Style Co.,Ltd. 2012 Smart Style Co.,Ltd. 16 / 25
ioDrive + innodb_buffer_pool_size=40G
ioDrive + innodb_buffer_pool_size=40G
ioDrive + innodb_buffer_pool_size=40G
ioDrive + innodb_buffer_pool_size=40G
0
10,000
20,000
30,000
40,000
50,000
60,000
0:0
0
0:0
3
0:0
6
0:0
9
0:1
2
0:1
5
0:1
8
0:2
1
0:2
4
0:2
7
0:3
0
0:3
3
0:3
6
0:3
9
0:4
2
0:4
5
0:4
8
0:5
1
0:5
4
0:5
7
1:0
0
1:0
3
1:0
6
1:0
9
1:1
2
1:1
5
1:1
8
1:2
1
1:2
4
1:2
7
1:3
0
ioDrive + メモリ
スレッドチューニングなし
ioDrive + メモリ
スレッドチューニング
後
チューニングなしだと
性能は半分しか出ない
まとめ
こんな方々に特にioDriveが有効だと思います。
• メンテナンス明けのレスポンス低下
• 物理的にこれ以上メモリが増設できない
• データベースサイズが大きくなりすぎて
導入当初に比べて性能劣化が大きい
• アプリケーションの修正に時間が割けない
• とにかく速さを追求したい
© © ©
© 2012 Smart Style Co.,Ltd. 2012 Smart Style Co.,Ltd. 2012 Smart Style Co.,Ltd. 2012 Smart Style Co.,Ltd. 18 / 25
事例紹介
最近ソーシャル関連のお客様から
お問い合わせのあった事例として
・アクセス数の増加に伴いWEBサーバを増設、
MySQLへの接続数が増えた
・イベント開催に伴いアクセスがバーストし、
MySQLへの接続数が増えた
事例紹介
• Too many connectionsとは
アプリケーションからMySQLに接続できる数はmy.cnfで
設定されている(max_connections)
max_connections以上の接続をしようとすると出るエ
ラー。
max_connectionsの値を増やすことで
エラーの回避は可能だが、
全体的なスループットは低下する傾向にある。
(アプリ側でリトライ処理を実装しなくて良いという
メリットはある)
© © ©
© 2012 Smart Style Co.,Ltd. 2012 Smart Style Co.,Ltd. 2012 Smart Style Co.,Ltd. 2012 Smart Style Co.,Ltd. 20 / 25
Too many connections
Too many connections
Too many connections
Too many connectionsのメカニズム
threads
time
max_connections
max_connections
max_connections
max_connectionsを増やすと
• スレッドバッファ分メモリ使う
⇒検証環境でstraceを追ってmmap関数を調べたところ、
1スレッド生成あたり64MB程度メモリを確保している。
⇒スレッドが100本生成されるなら、6GBにもなる。
• スレッド生成時にオーバーヘッドがかかる
⇒検証環境でstraceを追った時の待機状態になるまでの時間。
スレッドキャッシュなし .. 50ms~150ms程度
スレッドキャッシュあり .. 15ms~35ms程度
これらがもともとのクエリの速度を圧迫する
© © ©
© 2012 Smart Style Co.,Ltd. 2012 Smart Style Co.,Ltd. 2012 Smart Style Co.,Ltd. 2012 Smart Style Co.,Ltd. 22 / 25
理想的な解決法
threads
time
実験
ローカルホストにLinux,Apache,MySQL,Perlの環境を作成。
abクライアントからApache越しにPerlスクリプトを叩く。
PerlスクリプトはMySQL10多重アクセスをして結果を返す。
そのターンアラウンドタイムを計測。
Perl
Perl
Perl
Apache
ab
ab
ab
MySQL
ab
ab
ab
abは3
3
3
3多重で起動
Perlは10多重で
MySQLへアクセス
© © ©
© 2012 Smart Style Co.,Ltd. 2012 Smart Style Co.,Ltd. 2012 Smart Style Co.,Ltd. 2012 Smart Style Co.,Ltd. 24 / 25