2011年6月24日金曜日

MySQL5.5のベンチマークテスト その1

こんにちは、matsuiです。

弊社ではソーシャルアプリを開発・運用していますが、主な実行環境の一つとして Amazon EC2を利用しています。
EC2について知りたい方はAWS(Amazon Web Service)のサイトを見て頂くとして、
今回は弊社システムでよく利用している「MySQL」のベンチマークテストについてです。

長らく安定版は5.1系で止まっていましたが、ようやく5.5系安定版が公開されたことを受けて、どの程度の性能アップがなされているのかを確認してみました。

確認方法はMySQL 5.1.4から標準で付属しているmysqlslap(クライアント負荷エミュレーション)を使います。
mysqlslapを使う理由としては、標準で付属しており、事前準備がいらないというのがいいですね。
どれぐらい性能アップしたか知りたいという欲求を満たすには十分な気がします。

今回は比較対象として、実際にシステム内で使われているMySQLと同じバージョンを用意することにします。

環境としては、以下の通りです。

Amazon EC2(AWS)
EC2 Instance Type : t1.micro

MySQL 5.1.54(比較対象)
設定は、innoDB plugin有効、--innodb-buffer-pool-sizeに200MB程度割り当て(弊社内の貧弱マシン用の設定)、他細かいところを少しだけ修正。

MySQL 5.5.4
設定はデフォルトのまま。

次にmysqlslap実行時オプションについて、今回使うものだけを簡単に解説します。

--auto-generate-sql
ファイルやコマンドオプションを介して提供されていない場合、SQLステートメントを自動的に生成

--auto-generate-sql-guid-primary
GUIDベースのプライマリキーカラムを作成

-e innodb
テーブル作成の際使用するストレージエンジン

--number-int-cols=3
INT型カラムの作成数

--number-char-cols=5
CHAR型カラムの作成数

--concurrency=10
クライアント数

--auto-generate-sql-write-number=1000
テーブルに格納するデータ数

--auto-generate-sql-execute-number=1000
クライアントごとのクエリ数

--auto-generate-sql-load-type=mixed
アクセスパターン(mixedはpkによるselectとinsert)

--create-schema=test
スキーマ名

-h localhost
接続先ホスト

-u root
接続ユーザ

-p
パスワード

では実際のベンチマークのスコアです。
差がわかりやすいように同条件のmysqlslapを実行し、MySQL5.1をMySQL5.5でどのような違いが現れるかを一つ一つ見ていきます。

条件1
$ mysqlslap --auto-generate-sql --auto-generate-sql-guid-primary -e innodb --number-int-cols=3 --number-char-cols=5 --concurrency=10 --auto-generate-sql-write-number=1000 --auto-generate-sql-execute-number=1000 --auto-generate-sql-load-type=mixed --create-schema=test -h localhost -u root -p

MySQL5.1
Average number of seconds to run all queries: 2.934 seconds
Minimum number of seconds to run all queries: 2.934 seconds
Maximum number of seconds to run all queries: 2.934 seconds
Number of clients running queries: 10
Average number of queries per client: 1000

MySQL5.5
Average number of seconds to run all queries: 2.181 seconds
Minimum number of seconds to run all queries: 2.181 seconds
Maximum number of seconds to run all queries: 2.181 seconds
Number of clients running queries: 10
Average number of queries per client: 1000

10クライアントで1000クエリずつということで、特に弊社のようなサービスではあまり現実では発生しない条件ですね。
MySQL5.5の方が40%程度高いスコアが出ています。

条件2
$ mysqlslap --auto-generate-sql --auto-generate-sql-guid-primary -e innodb --number-int-cols=3 --number-char-cols=5 --concurrency=100 --auto-generate-sql-write-number=1000 --auto-generate-sql-execute-number=1000 --auto-generate-sql-load-type=mixed --create-schema=test -h localhost -u root -p

MySQL5.1
Average number of seconds to run all queries: 127.041 seconds
Minimum number of seconds to run all queries: 127.041 seconds
Maximum number of seconds to run all queries: 127.041 seconds
Number of clients running queries: 100
Average number of queries per client: 1000

MySQL5.5
Average number of seconds to run all queries: 72.507 seconds
Minimum number of seconds to run all queries: 72.507 seconds
Maximum number of seconds to run all queries: 72.507 seconds
Number of clients running queries: 100
Average number of queries per client: 1000

次は100クライアントで1000クエリにしてみました。
やはりこのようなケースは少ないですが、条件1と同じ方向性でさらに負荷をかけてみました。
やはりMySQL5.5の方が40%程度高いスコアが出ています。


条件3
$ mysqlslap --auto-generate-sql --auto-generate-sql-guid-primary -e innodb --number-int-cols=3 --number-char-cols=5 --concurrency=500 --auto-generate-sql-write-number=100 --auto-generate-sql-execute-number=100 --auto-generate-sql-load-type=mixed --create-schema=test -h localhost -u root -p

MySQL5.1
Average number of seconds to run all queries: 49.727 seconds
Minimum number of seconds to run all queries: 49.727 seconds
Maximum number of seconds to run all queries: 49.727 seconds
Number of clients running queries: 500
Average number of queries per client: 100

MySQL5.5
Average number of seconds to run all queries: 12.090 seconds
Minimum number of seconds to run all queries: 12.090 seconds
Maximum number of seconds to run all queries: 12.090 seconds
Number of clients running queries: 500
Average number of queries per client: 100

条件3では500クライアントで100クエリにしてみました。
条件1と2の少ないクライアントで多くのクエリという流れとは逆に多いクライアントで少ないクエリという方向性でテストしてみました。
クエリ総数は条件2の時の半分になっていますので、単純に条件2よりはいいスコアになるのではないかと推測していましたが、予想よりも早かったです。
特に条件2の時のMySQL5.5が72 sec -> 12 secということでスコアの伸びが、MySQL5.1側に比べて高くなっています。

条件4
$ mysqlslap --auto-generate-sql --auto-generate-sql-guid-primary -e innodb --number-int-cols=3 --number-char-cols=5 --concurrency=1000 --auto-generate-sql-write-number=30 --auto-generate-sql-execute-number=30 --auto-generate-sql-load-type=mixed --create-schema=test -h localhost -u root -p

MySQL5.1
Average number of seconds to run all queries: 82.359 seconds
Minimum number of seconds to run all queries: 82.359 seconds
Maximum number of seconds to run all queries: 82.359 seconds
Number of clients running queries: 1000
Average number of queries per client: 30

MySQL5.5
Average number of seconds to run all queries: 6.553 seconds
Minimum number of seconds to run all queries: 6.553 seconds
Maximum number of seconds to run all queries: 6.553 seconds
Number of clients running queries: 1000
Average number of queries per client: 30

条件3の結果を受けて、さらにクライアント数を増やし、クエリ数を減らす方向で実施してみました。
弊社のシステムではどちらかといえばクライアント数が多く、クエリ数は少なめになることが多いです。
そういう意味では実際の利用想定負荷パターンに少し近づいたといえます。
驚くことに、MySQL5.1と5.5でまったく逆の結果が得られました。
5.1は条件3に比べて総クエリ数は減っているのにも関わらず、処理時間は増えています。
5.5は条件3に比べて、処理時間が半分になっています(200%のスコア)。

中間報告
ここまでの結果からMySQL5.5は5.1に比べて全ての条件で高いスコアを出しています。
さらに特徴として5.5は多くのクライアントが存在するケースにおいて、5.1よりも高いスコアが出る傾向にあるようです。

さて、長くなってしまいましたので、今回は一旦ココまでとします。
次回「MySQL5.5のベンチマークテスト その2」では、さらに別の条件で5.1と5.5の性能の違いを見てみたいと思います。

0 件のコメント:

コメントを投稿