InnoDB vs MyISAM vs Falcon benchmarks - part 1
InnoDB vs MyISAM vs Falcon benchmarks - part 1 | MySQL Performance Blog ってエントリをちょっと前にみて、MyISAM / InnoDB / Falcon のパフォーマンスについて興味が沸いてきました。約一年前のエントリなので全体的に Falcon ガンバレ!的な印象を受けてしまいます。
でも1年も経てば falcon の性能はきっと上がってるはず。しかも mysql6 は falcon 標準搭載っていうか、むしろ目玉的存在なわけでして、こりゃ現行バージョンでテストしなければ!と思った次第です。
さて、では実験です! と言いながら先に結論を言っておくと mysql6-alpha では同ベンチマークプログラムを動かすことができませんでした。が、せっかくなので失敗例をつらつらと書いておきます。次エントリで mysql5 でもう一度試した結果を書く予定です。
まずはオリジナルのブログでの実験環境についてまとめてみると、
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 がちゃんと動いいる模様です。
[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 の設定。本記事の設定はこうらしい。あまりにゴージャスなメモリ設定。まぁ本番環境を想定するならこんな感じでしょうね。でも自宅サーバでしかもテスト環境ともなると、とてもとても同じ設定は無理ですね。
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 って何だよ!
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 のインストールからやり直しかよ。面倒くっせーなーホント。
[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
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 で書き直すしかなさそうです。
コメントやシェアをお願いします!