› オタクSEのブログ@別館 › performance::mysql
2010年02月12日
performance::mysql
MySQLのベンチマークを取得
Dom0で動作しているMySQLが、どれくらいのパフォーマンスを持っているかを調べてみたいと思います
まずは、サーバのスペックから確認します
CPU情報
※一部省略
メモリ情報
※一部省略
使用するベンチマークユーティリティをmakeします
今回はSuper Smackを使用します
ベンチマーク用のシェルを作成します
スレッドとスレッド当たりのクエリーで、パフォーマンスを評価します
シェルを実行します
スレッドが10パターン、スレッド当たりのクエリー数を10パターンで、合計100回の評価なので、最後の結果だけを記載します
毎秒11144のクエリーを処理していることが確認できます
一見良さそうに思えますが、ある程度アクセスがあるポータルサイト、オンラインショップでは、全く要件を満たすことができません
とりあえず、評価は現場を想定して、非機能要件的に実行しないといけませんからね
100スレッド、100クエリー/スレッド時点でのサーバの負荷を確認します
1.53という数値から、本番環境での運用に不適切であることが分かります
※単一テーブルへのselectの発行を考慮
ちなみに、9万件のレコードを追加した時のレプリカの状態を確認してみます
Slave1
Slave2
Slave3
意外に安定しています
Dom0で動作しているMySQLが、どれくらいのパフォーマンスを持っているかを調べてみたいと思います
まずは、サーバのスペックから確認します
CPU情報
※一部省略
$ > cat /proc/cpuinfo
model name : Intel(R) Xeon(R) CPU 5150 @ 2.66GHz
cpu MHz : 2660.000
cache size : 4096 KB
model name : Intel(R) Xeon(R) CPU 5150 @ 2.66GHz
cpu MHz : 2660.000
cache size : 4096 KB
メモリ情報
※一部省略
$ > cat /proc/meminfo
MemTotal: 1048752 kB
MemFree: 424000 kB
MemTotal: 1048752 kB
MemFree: 424000 kB
使用するベンチマークユーティリティをmakeします
今回はSuper Smackを使用します
# makeに必要なデベロップメントツールをインストール
$ > yum -y install mysql-devel
# Super Smackのターボールを取得
$ > wget http://vegan.net/tony/supersmack/super-smack-1.2.tar.gz
# make開始
$ > ./configure --with-mysql \
> --prefix=$HOME \
> --with-smacks-dir=/var/share \
> --with-datadir=/var/share/data \
> && make && make install
# ベンチマークに必要なデータを作成
# 9万レコードを作成
$ > gen-data -n 90000 -f %12-12s%n,%25-25s,%n,%d > /var/share/data/perf.dat
# テーブルの作成
$ > mysql -uroot -p*******
mysql > use test;
mysql > create table http_auth(
> username char(255) not null primary key,
> pass char(25),
> uid int,
> gid int);
# 設定ファイルの編集
$ > vi /var/share/select-key.smack
# user, host, db, passを変更
# ※環境に依存
client "admin"
{
user "root";
host "localhost";
db "test";
pass "*****";
socket "/var/lib/mysql/mysql.sock"; // this only applies to MySQL and is
// ignored for PostgreSQL
}
# user, host, db, passを変更
# ※環境に依存
client "smacker1"
{
user "root"; // connect as this user
pass "*****"; // use this password
host "localhost"; // connect to this host
db "test"; // switch to this database
socket "/var/lib/mysql/mysql.sock"; // this only applies to MySQL and is
// ignored for PostgreSQL
query_barrel "2 select_by_username"; // on each round,
// run select_by_username query 2 times
}
$ > yum -y install mysql-devel
# Super Smackのターボールを取得
$ > wget http://vegan.net/tony/supersmack/super-smack-1.2.tar.gz
# make開始
$ > ./configure --with-mysql \
> --prefix=$HOME \
> --with-smacks-dir=/var/share \
> --with-datadir=/var/share/data \
> && make && make install
# ベンチマークに必要なデータを作成
# 9万レコードを作成
$ > gen-data -n 90000 -f %12-12s%n,%25-25s,%n,%d > /var/share/data/perf.dat
# テーブルの作成
$ > mysql -uroot -p*******
mysql > use test;
mysql > create table http_auth(
> username char(255) not null primary key,
> pass char(25),
> uid int,
> gid int);
# 設定ファイルの編集
$ > vi /var/share/select-key.smack
# user, host, db, passを変更
# ※環境に依存
client "admin"
{
user "root";
host "localhost";
db "test";
pass "*****";
socket "/var/lib/mysql/mysql.sock"; // this only applies to MySQL and is
// ignored for PostgreSQL
}
# user, host, db, passを変更
# ※環境に依存
client "smacker1"
{
user "root"; // connect as this user
pass "*****"; // use this password
host "localhost"; // connect to this host
db "test"; // switch to this database
socket "/var/lib/mysql/mysql.sock"; // this only applies to MySQL and is
// ignored for PostgreSQL
query_barrel "2 select_by_username"; // on each round,
// run select_by_username query 2 times
}
ベンチマーク用のシェルを作成します
スレッドとスレッド当たりのクエリーで、パフォーマンスを評価します
$ > vi perf_mysql
#!/bin/sh
smack=/bin/super-smack
log=/var/log/perf_mysql.log
conf=/var/share/select-key.smack
st=`date "+%Y/%m/%d %H:%M:%S"`
echo "Start MySQL Stress Test" > ${log}
echo ${st} >> ${log}
echo >> ${log}
# Parameter for sleds
for sled in 10 20 30 40 50 60 70 80 90 100
do
# Parameter for query per sled
for que in 10 20 30 40 50 60 70 80 90 100
do
${smack} ${conf} ${sled} ${que} >> ${log}
echo "" >> ${log}
done
done
fn=`date "+%Y/%m/%d %H:%M:%S"`
echo >> ${log}
echo "Finish MySQL Stress Test" >> ${log}
echo ${fn} >> ${log}
exit 0;
$ > chmod 700 perf_mysql
#!/bin/sh
smack=/bin/super-smack
log=/var/log/perf_mysql.log
conf=/var/share/select-key.smack
st=`date "+%Y/%m/%d %H:%M:%S"`
echo "Start MySQL Stress Test" > ${log}
echo ${st} >> ${log}
echo >> ${log}
# Parameter for sleds
for sled in 10 20 30 40 50 60 70 80 90 100
do
# Parameter for query per sled
for que in 10 20 30 40 50 60 70 80 90 100
do
${smack} ${conf} ${sled} ${que} >> ${log}
echo "" >> ${log}
done
done
fn=`date "+%Y/%m/%d %H:%M:%S"`
echo >> ${log}
echo "Finish MySQL Stress Test" >> ${log}
echo ${fn} >> ${log}
exit 0;
$ > chmod 700 perf_mysql
シェルを実行します
$ > sh perf_mysql
スレッドが10パターン、スレッド当たりのクエリー数を10パターンで、合計100回の評価なので、最後の結果だけを記載します
Query Barrel Report for client smacker1
connect: max=940ms min=0ms avg= 228ms from 100 clients
Query_type num_queries max_time min_time q_per_s
select_index 20000 1 0 11144.06
connect: max=940ms min=0ms avg= 228ms from 100 clients
Query_type num_queries max_time min_time q_per_s
select_index 20000 1 0 11144.06
毎秒11144のクエリーを処理していることが確認できます
一見良さそうに思えますが、ある程度アクセスがあるポータルサイト、オンラインショップでは、全く要件を満たすことができません
とりあえず、評価は現場を想定して、非機能要件的に実行しないといけませんからね
100スレッド、100クエリー/スレッド時点でのサーバの負荷を確認します
1.53という数値から、本番環境での運用に不適切であることが分かります
※単一テーブルへのselectの発行を考慮
$ > top
top - 20:24:32 up 21:03, 3 users, load average: 17.02, 4.55, 1.53
top - 20:24:32 up 21:03, 3 users, load average: 17.02, 4.55, 1.53
ちなみに、9万件のレコードを追加した時のレプリカの状態を確認してみます
Slave1
mysql> select count(*) from http_auth;
+----------+
| count(*) |
+----------+
| 90000 |
+----------+
1 row in set (0.00 sec)
+----------+
| count(*) |
+----------+
| 90000 |
+----------+
1 row in set (0.00 sec)
Slave2
mysql> select count(*) from http_auth;
+----------+
| count(*) |
+----------+
| 90000 |
+----------+
1 row in set (0.00 sec)
+----------+
| count(*) |
+----------+
| 90000 |
+----------+
1 row in set (0.00 sec)
Slave3
mysql> select count(*) from http_auth;
+----------+
| count(*) |
+----------+
| 90000 |
+----------+
1 row in set (0.00 sec)
+----------+
| count(*) |
+----------+
| 90000 |
+----------+
1 row in set (0.00 sec)
意外に安定しています
Posted by オタクSE at 23:30│Comments(0)