てぃーだブログ › オタクSEのブログ@別館 › performance::mysql

2010年02月12日

performance::mysql

MySQLのベンチマークを取得

Dom0で動作しているMySQLが、どれくらいのパフォーマンスを持っているかを調べてみたいと思います

まずは、サーバのスペックから確認します

CPU情報
一部省略
$ > cat /proc/cpuinfo
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

使用するベンチマークユーティリティを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
}

ベンチマーク用のシェルを作成します

スレッドとスレッド当たりのクエリーで、パフォーマンスを評価します
$ > 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

シェルを実行します
$ > 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

毎秒11144のクエリーを処理していることが確認できます

一見良さそうに思えますが、ある程度アクセスがあるポータルサイト、オンラインショップでは、全く要件を満たすことができません

とりあえず、評価は現場を想定して、非機能要件的に実行しないといけませんからね

100スレッド、100クエリー/スレッド時点でのサーバの負荷を確認します

1.53という数値から、本番環境での運用に不適切であることが分かります
単一テーブルへのselectの発行を考慮
$ > top
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)

Slave2
mysql> select count(*) from http_auth;
+----------+
| 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)

意外に安定しています



Posted by オタクSE at 23:30│Comments(0)
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。