2台のRaspberryPi4に入れたMySQL8.0.20とMySQL5.7.31に対してsysbenchで速度比較をしてみたい。
今回参考にさせていただいたのは以下の記事です。ありがとうございます。
環境や条件は以下となります。
- 比較対象:MySQL8.0.20とMySQL5.7.31
- 2台のラズパイはRaspberryPi4 4GB、Raspbian Buster
- 使用するベンチマークソフト:sysbench
- レコード件数:100万件
- パラメータ:基本初期値のまま
上記5が特に曲者なのですが、とりあえずinnodb_buffer_pool_size見ると、MySQLの両方のバージョンで128MBでした。
$ mysqladmin -uroot -p[MySQLのrootのパスワード] variables | grep innodb_buffer_pool_size mysqladmin: [Warning] Using a password on the command line interface can be insecure. | innodb_buffer_pool_size | 134217728
他のパラメーターは…う~ん、まぁいっか。
1.sysbench計測準備
ラズパイ上でsysbench最新版をインストールする方法は前回記事を参考にしてください。
以下のSQLで両方のMySQLにデータベースとユーザーを作成。
CREATE DATABASE sbtestdb; CREATE USER sbtestuser@localhost IDENTIFIED BY 'Password!'; GRANT ALL PRIVILEGES ON sbtestdb.* to sbtestuser@localhost;
以下のコマンドで100万件を作成。
sysbench --db-driver=mysql \ --mysql-host=localhost \ --mysql-user=sbtestuser \ --mysql-password='Password!' \ --mysql-db=sbtestdb \ --table_size=1000000 \ --mysql-socket=/usr/local/mysql/data/mysql.sock \ oltp_read_write \ prepare
ちなみに。
以前100万件バルクインサート実行したときと同様、MySQL8.0は数分で終わったのに対して、MySQL5.7のほうは30分以上かかりました。
ちょっとおかしい。なので、調べる。
ストレージ(SDカード)の書き込み速度調査
疑わしきはSDカード。
MySQLのデータディレクトリに対して1GBのファイルを5回writeして速度測ってみたくて、こんなシェルを作ってみた。
start_time=`date +%s` max=5 for ((i=0; i < $max; i++)); do echo "**********" echo `expr $i + 1`回目書込 echo "**********" time sudo dd if=/dev/zero of=/usr/local/mysql/data/test_hdwrite.tmp ibs=1M obs=1M count=1024 done end_time=`date +%s` ss=`expr ${end_time} - ${start_time}` hh=`expr ${ss} / 3600` ss=`expr ${ss} % 3600` mm=`expr ${ss} / 60` ss=`expr ${ss} % 60` echo "********************" echo "Total time = ${hh}:${mm}:${ss}" echo "********************"
結果は以下。
MySQL5.7 | Disk性能 | MySQL8.0 | Disk性能 | |
---|---|---|---|---|
書込時間(s) | 書込速度(MB/s) | 書込時間(s) | 書込速度(MB/s) | |
1回目 | 79.7989 | 13.5 | 26.4813 | 40.5 |
2回目 | 72.5314 | 14.8 | 28.1249 | 38.2 |
3回目 | 70.0347 | 15.3 | 26.5251 | 40.5 |
4回目 | 73.3175 | 14.6 | 26.7778 | 40.1 |
5回目 | 72.6854 | 14.8 | 26.4169 | 40.6 |
合計 | 368.3679 | 73 | 134.326 | 199.9 |
平均 | 73.67358 | 14.6 | 26.8652 | 39.98 |
ビンゴ。
SDカードによっては書込速度にこれほどの差があるとは思っていなかったです。
性能の悪いSDカード・・・よりも性能の良いSDカードを紹介したほうが良いよね。
つ~わけで以下のSDカードを急遽用意して、Win32DiskImagerってソフトで現行SDカード上のRaspbianのイメージバックアップ&新しいSDカードに対してリストアを実施。
これで同じSDカードで2台のラズパイ、片方はMySQL5.7、もう片方はMySQL8.0の用意が完了。
2.ベンチマーク開始
参考にしたサイトと同様に測定してみる。
但し、innodb_buffer_pool_size=128MB。
あと試行回数は3回。
測定(30秒間でのトランザクション数)
oltp_read_only
sysbench --db-driver=mysql \ --mysql-host=localhost \ --mysql-user=sbtestuser \ --mysql-password='Password!' \ --mysql-db=sbtestdb \ --mysql-socket=/usr/local/mysql/data/mysql.sock \ --time=30 \ --threads=1 \ oltp_read_only \ run
MySQL5.7 | MySQL8.0 | |
---|---|---|
1回目 | 4,852(161.70 per sec.) | 4,192(139.70 per sec.) |
2回目 | 4,873(162.40 per sec.) | 4,155(138.90 per sec.) |
3回目 | 4,831(161.01 per sec.) | 4,309(143.63 per sec.) |
ん?
oltp_write_only
sysbench --db-driver=mysql \ --mysql-host=localhost \ --mysql-user=sbtestuser \ --mysql-password='Password!' \ --mysql-db=sbtestdb \ --mysql-socket=/usr/local/mysql/data/mysql.sock \ --time=30 \ --threads=1 \ oltp_write_only \ run
MySQL5.7 | MySQL8.0 | |
---|---|---|
1回目 | 7,543(251.42 per sec.) | 2,290(76.32 per sec.) |
2回目 | 7,460(248.29 per sec.) | 2,230(74.31 per sec.) |
3回目 | 7,124(237.44 per sec.) | 2,261(75.34 per sec.) |
はぁ?
oltp_read_write
sysbench --db-driver=mysql \ --mysql-host=localhost \ --mysql-user=sbtestuser \ --mysql-password='Password!' \ --mysql-db=sbtestdb \ --mysql-socket=/usr/local/mysql/data/mysql.sock \ --time=30 \ --threads=1 \ oltp_read_write \ run
MySQL5.7 | MySQL8.0 | |
---|---|---|
1回目 | 2,302(76.71 per sec.) | 1,511(50.36 per sec.) |
2回目 | 2,317(77.23 per sec.) | 1,516(50.53 per sec.) |
3回目 | 2,366(78.86 per sec.) | 1,463(48.76 per sec.) |
マジか。。。
3.考察
これはMySQLのバージョンアップの宿命なのか?
バージョンアップするたびにスループット性能、悪くなってませんかね?
Readに関しては、わずかにMySQL5.7に軍配が上がったわけだけど、Writeに関してはMySQL5.7の圧勝。
MySQL8.0良いとこ無し、です。
一瞬、SDカード以外にも2台のラズパイで何か差異があるのか疑ったけれど、MySQLのパラメータ以外は同じ状況です。
Google先生に聞いてみても、一般的にベンチマークテストではMySQL8.0よりもMySQL5.7のほうが高速という結果を記載しているブログなどが多く、正直びっくりでした。
というわけで、まだMySQL8.0は使用せずに5.7を使っておこう。オー!
・・・とは、そろそろいかない。
というのも、MySQLのサポート期限がバージョンごとに以下のように定義されているからだ。
リリース | GA日 | Premier Support 期限 | Extended Support 期限 |
---|---|---|---|
MySQL Database 5.7 | 2015年10月 | 2020年10月 | 2023年10月 |
MySQL Database 8.0 | 2018年4月 | 2023年4月 | 2026年4月 |
これを見るに、5.7→8.0にバージョンアップするタイミングと、システムによっては改修要否を検討の上、もう着手タイミングをそろそろ調整しなければいけないと思うんだ。
となると、今度はMySQL8.0のクセを見抜いて、以下にスループット性能を向上させるかを追求しなきゃいかん。
と、そういう時期に入ってきた、そんな気がする。
4.まとめ
- スループット性能は未だMySQL5.7のほうが上
- 特にWrite性能に差がある
- でもサポート期限の関係でそろそろMySQL8.0の使用を検討する時期か?
- MySQL8.0のスループット性能向上のTipsを今後まとめていきたい
てな感じです。
今日は以上!
コメント