InnoDB vs MyISAM vs Falcon benchmarks - part 1

InnoDB vs MyISAM vs Falcon benchmarks - part 1 | MySQL Performance Blog ってエントリをちょっと前にみて、MyISAM / InnoDB / Falcon のパフォーマンスについて興味が沸いてきました。約一年前のエントリなので全体的に Falcon ガンバレ!的な印象を受けてしまいます。

READ_PK_POINT.jpg

でも1年も経てば falcon の性能はきっと上がってるはず。しかも mysql6 は falcon 標準搭載っていうか、むしろ目玉的存在なわけでして、こりゃ現行バージョンでテストしなければ!と思った次第です。

falcon01.jpg

さて、では実験です! と言いながら先に結論を言っておくと mysql6-alpha では同ベンチマークプログラムを動かすことができませんでした。が、せっかくなので失敗例をつらつらと書いておきます。次エントリで mysql5 でもう一度試した結果を書く予定です。

- スポンサーリンク -

まずはオリジナルのブログでの実験環境についてまとめてみると、

MySQL version
We used MySQL 5.1.14-beta sources for MyISAM / InnoDB
and MySQL 5.1.14-falcon bitkeeper tree
bk://mysql.bkbits.net/mysql-5.1-falcon for Falcon
CentOS release 4.4 (Final)
2 х Dual Core Intel XEON 5130
model name : Intel(R) Xeon(R) CPU 5130 @ 2.00GHz
16GB of RAM

という環境。mysql5 と16GBのメモリでのテストです。今から実験しようと考えている自分の環境下と随分と違ってかなりリッチな環境ですね。自前の環境では物理マシンを用意できないので Vista 上に作成した CentOS4 x86_64 on vmware6 で実験します。VM 上のマシンスペックは Core2 E6700 + memory 700MB です。詳細は以下の通り。disk のパフォーマンスもそこそこ。

[root@localhost ~]# df -k
Filesystem           1K-ブロック    使用   使用可 使用% マウント位置
/dev/mapper/VolGroup00-LogVol00
                      29995992   6271504  22200776  23% /
/dev/sda1               101086     14609     81258  16% /boot
none                    383676         0    383676   0% /dev/shm

[root@localhost php-5.2.6]# cat /proc/meminfo
MemTotal:       767352 kB
....

[root@localhost ~]# cat /proc/cpuinfo
....
model name      : Intel(R) Core(TM)2 CPU          6700  @ 2.66GHz
stepping        : 8
cpu MHz         : 2671.116
cache size      : 4096 KB
....

[root@localhost ~]# hdparm -tf /dev/sda1
/dev/sda1:
 Timing buffered disk reads:  100 MB in  3.04 seconds =  32.88 MB/sec

さてベンチマークプログラムを動かすための環境構築でからはじめます。やっぱり最新の mysql6-alpha で実験したい!ってことで。※まぁ結果的にコレがハマリどころであったわけですが・・・

mysql6-alpha のインストールで MyISAM / InnoDB / Falcon の準備をする

とりあえずこんなコマンドを流しました。コンパイルが面倒なのでバイナリー使いました。

cd /usr/local/src/
wget http://dev.mysql.com/get/Downloads/MySQL-6.0/mysql-6.0.5-alpha-linux-x86_64-glibc23.tar.gz/from/http://ftp.iij.ad.jp/pub/db/mysql/
tar xvfz mysql-6.0.5-alpha-linux-x86_64-glibc23.tar.gz
cd mysql-6.0.5-alpha-linux-x86_64-glibc23

mv /usr/local/mysql /usr/local/mysql4
mv /usr/local/src/mysql-6.0.5-alpha-linux-x86_64-glibc23 /usr/local/mysql6
ln -s /usr/local/mysql6 /usr/local/mysql
cd /usr/local/mysql
chown -R mysql .
chgrp -R mysql .
scripts/mysql_install_db --user=mysql
chown -R root .
chown -R mysql data
./bin/mysqladmin -u root password test123

とりあえず mysql6 がちゃんと動いいる模様です。

[1] 4310
[root@localhost mysql]# 080718 09:50:43 mysqld_safe Logging to '/usr/local/mysql/data/localhost.localdomain.err'.
080718 09:50:44 mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/data

mysql-shell を起ち上げてエンジン一覧を見てみる。

mysql> show engines;
+------------+---------+----------------------------------------------------------------+--------------+-----+------------+
| Engine     | Support | Comment                                                        | Transactions | XA  | Savepoints |
+------------+---------+----------------------------------------------------------------+--------------+-----+------------+
| FEDERATED  | YES     | Federated MySQL storage engine                                 | NO           | NO  | NO         |
| MRG_MYISAM | YES     | Collection of identical MyISAM tables                          | NO           | NO  | NO         |
| CSV        | YES     | CSV storage engine                                             | NO           | NO  | NO         |
| Falcon     | YES     | Falcon storage engine                                          | YES          | NO  | YES        |
| BLACKHOLE  | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO  | NO         |
| MEMORY     | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO  | NO         |
| ARCHIVE    | YES     | Archive storage engine                                         | NO           | NO  | NO         |
| InnoDB     | YES     | Supports transactions, row-level locking, and foreign keys     | YES          | YES | YES        |
| MyISAM     | DEFAULT | Default engine as of MySQL 3.23 with great performance         | NO           | NO  | NO         |
+------------+---------+----------------------------------------------------------------+--------------+-----+------------+

おおーー!!いろんなエンジンが入ってます!トランザクションサポートは Falcon と InnoDB ですな。
ベンチマークプログラムが php でできてるっぽいんで php を確認してみておく。

[root@localhost mysql]# php -v
php: error while loading shared libraries: libmysqlclient.so.14: cannot open shared object file: No such file or directory

うげっ!いきなり version すら表示できねーっつーの。とりあえず最新の php をインストールしてみる。

php5.2.6のインストール

面倒くさいけど、ソースコードからコンパイル&インストール。configure でいろいろとパラメータ設定せないかん。ちなみにかなり適当。

cd /usr/local/src
wget http://jp.php.net/get/php-5.2.6.tar.gz/from/this/mirror
tar xvfz php-5.2.6.tar.gz
cd php-5.2.6

./configure \
 --enable-module=so \
 --enable-discard-path \
 --enable-force-cgi-redirect \
 --enable-mbstring \
 --enable-mbregex \
 --with-mysql=/usr/local/mysql \
 --with-zlib=/usr --with-zlib-dir=/usr \
 --with-mysqli=/usr/local/mysql/bin/mysql_config

make
make test
make install

さて動作させてみる・・・がエラーは一緒。

[root@localhost mysql]# php -v
php: error while loading shared libraries: libmysqlclient.so.14: cannot open shared object file: No such file or directory

どうやら mysql6 を source からコンパイルしないとダメなよう。そりゃそうか、.so が組み込めないってエラーだったんで。面倒くっさ。

素直に mysql6 を sourceからコンパイルしてインストールしてみる

とりあえずこんなコマンドを流しました。デフォルトでは mysql5 時代と同じで innodb とか入らないので、先ほどのエンジン一覧に出てきた名前をつらつらと書いてみた。エンジン名を小文字にして --with-エンジン名 でいいのかな?かなり適当。

cd /usr/local/src
wget http://dev.mysql.com/get/Downloads/MySQL-6.0/mysql-6.0.5-alpha.tar.gz/from/http://ftp.iij.ad.jp/pub/db/mysql/
tar xvfz mysql-6.0.5-alpha.tar.gz
cd mysql-6.0.5-alpha

mv /usr/local/mysql6 /usr/local/mysql6.old
CFLAGS="-O3" CXX=gcc CXXFLAGS="-O3 -felide-constructors \
       -fno-exceptions -fno-rtti" ./configure \
       --prefix=/usr/local/mysql6 --enable-assembler \
       --localstatedir=/usr/local/mysql/data \
       --with-mysqld-ldflags=-all-static \
       --with-innodb \
       --with-falcon \
       --with-archive \
       --with-blackhole \
       --with-federated
make
make install
/usr/local/mysql/bin/mysql_install_db --user=mysql

とりあえず falcon とか使えるようにちゃんとインストールできたかを確認しておく。

/usr/local/mysql/bin/mysqld_safe --user=mysql &
/usr/local/mysql/bin/mysql -u root

mysql> status
--------------
/usr/local/mysql/bin/mysql  Ver 14.14 Distrib 6.0.5-alpha, for redhat-linux-gnu (x86_64) using  EditLine wrapper

Connection id:          3
Current database:
Current user:           root@localhost
SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server version:         6.0.5-alpha-log Source distribution
Protocol version:       10
Connection:             Localhost via UNIX socket
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    latin1
Conn.  characterset:    latin1
UNIX socket:            /tmp/mysql.sock
Uptime:                 31 sec

Threads: 1  Questions: 4  Slow queries: 0  Opens: 14  Flush tables: 1  Open tables: 8  Queries per second avg: 0.129
--------------

mysql> show engines;
+------------+---------+------------------------------------------------------------+--------------+-----+------------+
| Engine     | Support | Comment                                                    | Transactions | XA  | Savepoints |
+------------+---------+------------------------------------------------------------+--------------+-----+------------+
| MyISAM     | DEFAULT | Default engine as of MySQL 3.23 with great performance     | NO           | NO  | NO         |
| MRG_MYISAM | YES     | Collection of identical MyISAM tables                      | NO           | NO  | NO         |
| CSV        | YES     | CSV storage engine                                         | NO           | NO  | NO         |
| Falcon     | YES     | Falcon storage engine                                      | YES          | NO  | YES        |
| InnoDB     | YES     | Supports transactions, row-level locking, and foreign keys | YES          | YES | YES        |
| MEMORY     | YES     | Hash based, stored in memory, useful for temporary tables  | NO           | NO  | NO         |
+------------+---------+------------------------------------------------------------+--------------+-----+------------+
6 rows in set (0.00 sec)

う〜ん・・・気のせいかバイナリーでインストールしたときよりもエンジンの種類が減っている気がするけど、falcon / innodb が入っているから良しとしておく。

おっし! mysql6 のインストールは完了。php も再コンパイルしてから php -v を確認してみる。

[root@localhost php-5.2.6]# php -v
PHP Warning:  PHP Startup: Unable to load dynamic library './msql.so' - ./msql.so: cannot open shared object file: No such file or directory in Unknown on line 0
PHP 5.2.6 (cli) (built: Jul 18 2008 10:08:05)
Copyright (c) 1997-2008 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies

あれ?? なんか旨くいかねぇー。 php なんだよっ!
msql.so ってなんだ? とりあえずエラーがでないようにしてみる。msql.so ってなんだこれ?mysql.so じゃないっぽいから、php.ini から該当の設定をコメントアウトしてやった。エラーはでなくなった。まぁとりあえず良しとしよう。

vi /usr/local/lib/php.ini
; ... or under UNIX:
;
;   extension=msql.so

何しろこれで環境は整ったと思われるので、次は /etc/my.cnf の設定。本記事の設定はこうらしい。あまりにゴージャスなメモリ設定。まぁ本番環境を想定するならこんな感じでしょうね。でも自宅サーバでしかもテスト環境ともなると、とてもとても同じ設定は無理ですね。

Falcon:
libexec/mysqld --no-defaults --user=root --falcon_min_record_memory=1G --falcon_max_record_memory=2GB --falcon_page_cache_size=1500M --max-connections=1500 --table-cache=512 --net_read_timeout=30 --net_write_timeout=30 --backlog=128

MyISAM / InnoDB:
libexec/mysqld --no-defaults --user=root --key-buffer-size=1500M --innodb-buffer-pool-size=1500M --innodb-log-file-size=100M --innodb-thread-concurrency=8 --max-connections=1500 --table-cache=512 --net_read_timeout=30 --net_write_timeout=30 --back_log=128

とりあえず今回は my-medium.cnf そのまま使う。

cp /usr/local/src/mysql-6.0.5-alpha/support-files/my-medium.cnf /etc/my.cnf
mv /etc/init.d/mysql /etc/init.d/mysql4
cp /usr/local/src/mysql-6.0.5-alpha/support-files/mysql.server /etc/init.d/mysql
chmod 755 /etc/init.d/mysql 


疲れてきました・・・いよいよベンチマークプログラムの用意です。

ベンチマークプログラムの用意

http://www.mysqlperformanceblog.com/2007/01/08/innodb-vs-myisam-vs-falcon-benchmarks-part-1/ をまずは参考に。

どうも、このプログラムは /home/vadim/ で動かすこと前提のようなので /home/vadim/ を作ってやる。

mkdir /home/vadim/
cd /home/vadim/
wget http://www.mysqlperformanceblog.com/files/benchmarks/phptestsuite.stable.tar.gz
tar xvfz phptestsuite.stable.tar.gz
mv phptestsuite.stable phptestsuite
cd phptestsuite
sh run.sh

にゃにぃ!?エラーで終了だとっ! php 頼むぜ! mysqli って何だよ!

Fatal error: Class 'mysqli' not found in /home/vadim/phptestsuite/main.php on line 299
Starting...
Test duration: 60
THREADS: 256
Operation: run
runQuery: READ_FTS
Test: normal
Engine: INNODB
Table size: 1000000
Threads are being started...

mysqli ってのが足りないんだな。調べてみる。すぐに情報が見つかった。
http://jp2.php.net/manual/ja/mysqli.installation.php

PHP に mysqli 拡張サポートを追加するには、 --with-mysqli=mysql_config_path/mysql_config オプションを指定して PHP をコンパイルする必要があります。 mysql_config_path には MySQL 4.1 以上に付属する mysql_config プログラムが存在するパスを 指定してください。

また php のインストールからやり直しかよ。面倒くっせーなーホント。

[root@localhost php-5.2.6]# make
/bin/sh /usr/local/src/php-5.2.6/libtool --silent --preserve-dup-deps --mode=compile gcc  -Iext/mysqli/ -I/usr/local/src/php-5.2.6/ext/mysqli/ -DPHP_ATOM_INC -I/usr/local/src/php-5.2.6/
include -I/usr/local/src/php-5.2.6/main -I/usr/local/src/php-5.2.6 -I/usr/include/libxml2 -I/usr/local/src/php-5.2.6/ext/date/lib -I/usr/local/src/php-5.2.6/ext/mbstring/oniguruma -I/us
r/local/src/php-5.2.6/ext/mbstring/libmbfl -I/usr/local/src/php-5.2.6/ext/mbstring/libmbfl/mbfl -I/usr/local/mysql/include/mysql -I/usr/local/src/php-5.2.6/TSRM -I/usr/local/src/php-5.2
.6/Zend    -I/usr/include -g -O2  -c /usr/local/src/php-5.2.6/ext/mysqli/mysqli.c -o ext/mysqli/mysqli.lo
/usr/local/src/php-5.2.6/ext/mysqli/mysqli.c: In function `zm_startup_mysqli':
/usr/local/src/php-5.2.6/ext/mysqli/mysqli.c:643: error: `MYSQL_RPL_MASTER' undeclared (first use in this function)
/usr/local/src/php-5.2.6/ext/mysqli/mysqli.c:643: error: (Each undeclared identifier is reported only once
/usr/local/src/php-5.2.6/ext/mysqli/mysqli.c:643: error: for each function it appears in.)
/usr/local/src/php-5.2.6/ext/mysqli/mysqli.c:644: error: `MYSQL_RPL_SLAVE' undeclared (first use in this function)
/usr/local/src/php-5.2.6/ext/mysqli/mysqli.c:645: error: `MYSQL_RPL_ADMIN' undeclared (first use in this function)
make: *** [ext/mysqli/mysqli.lo] エラー 1

んだよっ!結局 php5 は mysql6 に対応してないんでコンパイルできずってオチかよっ・・・(;´Д`)ウウッ…
ちょっと mysql のソースを除いてみたら、どうも mysql5 までと mysql6 とは include/mysql.h の中身が結構変わってるようです。

と言うわけで php-mysqli を対応させるぞ!なんて気は perler の僕には更々ないので今日はここで力尽きました。

だって、ドラクエ5プレーしながらやってるし。気が散ってしかたがないんです。

それでも最新の falcon のパフォーマンスが気になりますんで、次エントリに続きます。この連休中にきっと。

ちなみに、falcon に関する情報は 【特集】MySQLの新ストレージエンジン Falcon徹底リサーチ (1) Falconとは | エンタープライズ | マイコミジャーナル あたりが手頃な情報として読みやすいです。

__追記__
mysql5.1 で環境を構築しようとしたら、falcon が付属してきません。ちょっと調べてみたら、こんな記述が・・・。

http://dev.mysql.com/doc/refman/5.1/ja/faqs-storage-engines.html

27.2.2: Are there any new storage engines in MySQL 5.1?
MySQL 5.1 introduces an alpha version of the new Falcon storage engine.
Falconのサポートは、MySQL5.1の標準リリースではできません。FalconはMySQL 5.1の開発から特別に分岐したリリースにおいてのみ可能です。情報はここで評価のみの目的として供給されます。
For information about the Falcon storage engine, see The Falcon Storage Engine.

すでに mysql5.1 + falcon セットは公開されてねぇーーー!! ってことでこの企画はひとまず終了です。どうやらベンチを perl で書き直すしかなさそうです。

- スポンサーリンク -