2台のRaspberryPi4にMySQL8.0.20とMySQL5.7.31をソースから入れてみたので、速度比較などをしてみたい。

ただ、やみくもに思い付きで速度比較するんじゃなくて、この世の中には「ベンチマーク」って言葉があるわけで、そういったツールを使用して速度を測るのが良いんじゃないか、と思いついた。

はい、お約束の地獄の始まりです。

今回ベンチマークのツールとして選んだのはsysbench。

調べてみると、sysbenchに関する情報はいっぱい出てくるわけで、ラズパイ上だけれども楽勝っしょ!と思っていた。

少し甘かったw

というわけで、今回は速度比較の環境構築編です。

1.sysbenchのコンパイル

apt searchで調べてみると、sysbenchは少し古い気がする。

$ sudo apt search sysbench
ソート中... 完了
全文検索... 完了
sysbench/stable 0.4.12-1.2+b1 armhf
  Cross-platform and multi-threaded benchmark tool

そこでgithubから最新のソース取ってきてコンパイルしていこう。そう思いました。

…MySQLがコンパイルできたので、少し調子乗ってました。

まぁ進めていきます。

まずはrootユーザーにスイッチ。

$ su - root
パスワード:
# pwd
/root

そしたら、githubからソース取ってくるためにgit入れる。

# apt install -y git

MySQLコンパイル時もそうだったけどコンパイル作業は/root/tmpで実施するので、そこに移動してソース取ってくる。

# cd tmp/
# git clone https://github.com/akopytov/sysbench.git

cloneしてできたsysbenchディレクトリに移動して、ネット情報を頼りにautogen.shを実行。

# cd sysbench/
# ./autogen.sh

autoreconf: Entering directory `.'
autoreconf: configure.ac: not using Gettext
autoreconf: running: aclocal -I m4 --output=aclocal.m4t
Can't exec "aclocal": そのようなファイルやディレクトリはありません at /usr/share/autoconf/Autom4te/FileUtils.pm line 326.
autoreconf: failed to run aclocal: No such file or directory

はい安定のエラー。今日も出たよ!(絶叫

aclocalが無いって言われてるのかな?

調べてみるとautomakeを入れると解消されるみたい。なのでaptで入れて再度チャレンジ。

# apt install -y automake
# ./autogen.sh

autoreconf: Entering directory `.'
autoreconf: configure.ac: not using Gettext
autoreconf: running: aclocal -I m4
autoreconf: configure.ac: tracing
autoreconf: configure.ac: not using Libtool
autoreconf: running: /usr/bin/autoconf
configure.ac:61: error: possibly undefined macro: AC_PROG_LIBTOOL
      If this token and others are legitimate, please use m4_pattern_allow.
      See the Autoconf documentation.
autoreconf: /usr/bin/autoconf failed with exit status: 1

はい、対処してもまた出る安定エラーモードに入りました。ちっくしょー!(絶叫

sysbenchディレクトリ内にあるconfigure.acファイル中にAC_PROG_LIBTOOLが定義されていないから?

でもconfigure.acを見ると61行目に定義されているし!どういうこと?!

というわけでネット調べてみるとコメントアウトすると良いらしい。

なのでconfigure.acを編集して再度チャレンジ。

# vim configure.ac

:
# AC_PROG_LIBTOOL   # ←コメントアウト
:

# ./autogen.sh

autoreconf: Entering directory `.'
autoreconf: configure.ac: not using Gettext
autoreconf: running: aclocal -I m4
autoreconf: configure.ac: tracing
autoreconf: configure.ac: not using Libtool
autoreconf: running: /usr/bin/autoconf
autoreconf: running: /usr/bin/autoheader
autoreconf: running: automake --add-missing --copy --no-force
configure.ac:59: installing 'config/ar-lib'
configure.ac:40: installing 'config/compile'
configure.ac:27: installing 'config/config.guess'
configure.ac:27: installing 'config/config.sub'
configure.ac:32: installing 'config/install-sh'
configure.ac:32: installing 'config/missing'
src/Makefile.am: installing 'config/depcomp'
src/drivers/mysql/Makefile.am:18: error: library used but 'RANLIB' is undefined
src/drivers/mysql/Makefile.am:18:   The usual way to define 'RANLIB' is to add 'AC_PROG_RANLIB'
src/drivers/mysql/Makefile.am:18:   to 'configure.ac' and run 'autoconf' again.
src/drivers/pgsql/Makefile.am:18: error: library used but 'RANLIB' is undefined
src/drivers/pgsql/Makefile.am:18:   The usual way to define 'RANLIB' is to add 'AC_PROG_RANLIB'
(中略)
parallel-tests: installing 'config/test-driver'
autoreconf: automake failed with exit status: 1

はい、対処してもまた出る安定エラーモード、パート2ぅぅぅ。もう嫌だぁぁぁ。

sysbenchディレクトリ内にあるconfigure.acファイル中にRANLIBが定義されていないから?それともAC_PROG_RANLIB?どっちだ?

ネット調べてみるとAC_PROG_RANLIBを追加すればよいらしい。

なので、さっきコメントアウトしたAC_PROG_LIBTOOLの下にAC_PROG_RANLIBを追加。

# vim configure.ac

:
# AC_PROG_LIBTOOL
AC_PROG_RANLIB
:

# ./autogen.sh

autoreconf: Entering directory `.'
autoreconf: configure.ac: not using Gettext
autoreconf: running: aclocal -I m4
autoreconf: configure.ac: tracing
autoreconf: configure.ac: not using Libtool
autoreconf: running: /usr/bin/autoconf
autoreconf: running: /usr/bin/autoheader
autoreconf: running: automake --add-missing --copy --no-force
autoreconf: Leaving directory `.'
#

ででできた。

そしたら、MySQLのlibとincludeのディレクトリをパラメーター指定してconfigureしてmakeしてmake installする。

# ./configure --with-mysql-libs=/usr/local/mysql/lib/ --with-mysql-includes=/usr/ local/mysql/include/
# make
# make install

エラー出ませんでした。インストール完了です!

…まぁ、次の地獄が待ってるんだけどね。

2.sysbench実行エラー!共有ライブラリ編

さて、そんじゃまずはsysbenchのバージョンを確認してみよう。

# sysbench --version

sysbench: error while loading shared libraries: libmysqlclient.so.21: cannot open shared object file: No such file or directory

はい、えらーですね。どうもありがとうございます。

…って、なんでじゃーーー!

というわけで、libmysqlclient.so.21が本当に存在しないのか確かめる。

# find / -name libmysqlclient.so.21
/usr/local/mysql/lib/libmysqlclient.so.21

あるじゃん!(絶叫

ちうことは、共有ライブラリとして/usr/local/mysql/lib/が定義されていない、ってことだ。

ぱっと思いつくのは環境変数LD_LIBRARY_PATHを定義すること。

ただ、今回勉強になったんだけど、LD_LIBRARY_PATHは以下で定義しても反映されないようだ。

  • $HOME/.profile
  • /etc/profile
  • /etc/environment

いや、マジで勘違い。/etc/profileに定義しちゃって環境変数としては反映されるんだけど、sysbenchがそれ見てくれないの。sysbench --versionで、ずぅーっとエラー出るの。

.bashrcとかで定義すればよいのかも、だけど今回は「システム全体で永続的に使いたい」のでldconfigコマンドで共有ライブラリを追加します。

ちなみに参考にしたサイトは以下。

CentOS7でldconfigを使って共有ライブラリを追加する - Qiita

まずは、共有ライブラリにlibmysqlclient.so.21が無いことを確認。

# ldconfig -p | grep libmysqlclient.so.21
#

何も出ない。

そしたら、/etc/ld.so.conf.d/の下にconfファイルを作ってlibmysqlclient.so.21のあるディレクトリ/usr/local/mysql/libを共有ライブラリに追加する。

# vim /etc/ld.so.conf.d/libmysql.conf

/usr/local/mysql/lib

ldconfigコマンドを引数無しで実行してキャッシュファイル/etc/ld.so.cacheを更新します。

そして共有ライブラリにlibmysqlclient.so.21があることを確認。

# ldconfig
# ldconfig -p | grep libmysqlclient.so.21
libmysqlclient.so.21 (libc6,hard-float) => /usr/local/mysql/lib/libmysqlclient.so.21

そしたら、sysbenchのバージョンを確認。

# sysbench --version
sysbench 1.1.0-797e4c4

よし!よーし!!(ガッツポーズ

…まだ地獄は続くんだけどねw

3.sysbench実行エラー!ソケット編

そしたら、sysbench用のデータベースとユーザーを作成して…と思ったけど、前回のtestdb,
test_userを使用して、test_tblにデータを10000件ほど入れてみようと思う。

# sysbench --db-driver=mysql --mysql-host=localhost --mysql-user=test_user --mysql-password=test_Pa55! --mysql-db=testdb --table_size=10000 oltp_read_write prepare

sysbench 1.1.0-797e4c4 (using bundled LuaJIT 2.1.0-beta3)

FATAL: unable to connect to MySQL server on host 'localhost', port 3306, aborting...
FATAL: error 2002: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
FATAL: `sysbench.cmdline.call_command' function failed: /usr/local/share/sysbench/oltp_common.lua:88: connection creation failed

は?

またまた出ました安定のエラー。前途多難っ!(絶叫

冷静にエラーメッセージ見る。

sysbenchがMySQLと通信する際に見ているsocketファイルが/tmp/mysql.sock。。。

my.cnfに書いているmysqldのsocketの定義は確かsocket=/usr/local/mysql/data/mysql.sock。。。

うん、だめじゃん。

mysqldとclientでは同じsocketファイルを見なければいけないはずで、今回のclientに相当するのがsysbench。

というわけで、sysbench動かす時に見るべきsocketも指定してあげる。

つまり、こうだっ!

# sysbench --db-driver=mysql --mysql-host=localhost --mysql-user=test_user --mysql-password=test_Pa55! --mysql-db=testdb --table_size=10000 --mysql-socket=/usr/local/mysql/data/mysql.sock oltp_read_write prepare

sysbench 1.1.0-797e4c4 (using bundled LuaJIT 2.1.0-beta3)

Creating table 'sbtest1'...
Inserting 10000 records into 'sbtest1'
Creating a secondary index on 'sbtest1'...

で、で、できたんじゃ、ないか?

メッセージ見ると、テーブルとしてsbtest1っていうのを作ってそこに10000レコード作ってindex張っている、っぽい。

ちょっと見てみる。

# mysql -u test_user -p
Enter password:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| testdb             |
+--------------------+
2 rows in set (0.00 sec)

mysql> use testdb;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+------------------+
| Tables_in_testdb |
+------------------+
| sbtest1          |
| user             |
+------------------+
2 rows in set (0.00 sec)

mysql> desc sbtest1;
+-------+-----------+------+-----+---------+----------------+
| Field | Type      | Null | Key | Default | Extra          |
+-------+-----------+------+-----+---------+----------------+
| id    | int       | NO   | PRI | NULL    | auto_increment |
| k     | int       | NO   | MUL | 0       |                |
| c     | char(120) | NO   |     |         |                |
| pad   | char(60)  | NO   |     |         |                |
+-------+-----------+------+-----+---------+----------------+
4 rows in set (0.01 sec)

mysql> select count(*) from sbtest1;
+----------+
| count(*) |
+----------+
|    10000 |
+----------+
1 row in set (0.02 sec)

mysql>

今度こそ、sysbench動く環境が完成したんじゃないだろうか!完成したな!したよな!!

4.まとめ

MySQLのベンチマーク取る環境作るのに、こんなに手間取ってどうすんだ?ってのもあるけれども、今回も色々勉強になりました。

上記の手順で、MySQL8.0とMySQL5.7入ってるそれぞれのラズパイにsysbenchを入れて、出来る限り同じ環境同じ条件にして、次回は速度比較をやってみたいと思います。

今日は以上!