mysql 4.0.30 でベンチマーク測定

## 準備

### CentOS 6, 7

```sh
# mysql benchに必要
yum install -y perl-DBD-MySQL
```

### CentOS 8 の場合

```sh
# ATIS などが失敗する場合、以下のパッケージを入れれば動く。
# centos 7 用の mysql 4.0.30 と以下の組み合わせで動いた。
# (centos 8 用の mysql 4.0.30 では ATIS, insert, select, wisconsinがFailedした。)

yum install --nogpgcheck -y \
 libnsl \
 ncurses-compat-libs
```

### Ubuntu 20.04 の場合

```sh
apt install -y libclass-dbi-mysql-perl
```

### 実行



```sh:実行
useradd mysql

ln -s /opt/mysql40/ /opt/mysql
'cp' -a /etc/my.cnf.example-40 /etc/my.cnf

mkdir -p /var/lib/mysql
chown mysql /var/lib/mysql

mkdir /var/log/mariadb
chown mysql /var/log/mariadb

# 初期インストールスクリプト
/opt/mysql/bin/mysql_install_db \
  --defaults-file=/etc/my.cnf \
  --datadir=/var/lib/mysql/ \
  --user=mysql

# mysqldの起動
nohup /opt/mysql/bin/mysqld_safe \
  --defaults-file=/etc/my.cnf \
  --datadir=/var/lib/mysql/ \
  --user=mysql \
  &

# ベンチマークテスト
cd /opt/mysql/sql-bench

# InnoDB small-test
time ./run-all-tests \
 --user root \
 --connect-options=mysql_read_default_file=/etc/my.cnf \
 --small-test \
 --create-options=TYPE=InnoDB
```

## 結果 (InnoDB) small-test

```rb:
# Xeon(R) CPU E5-2665 @ 2.40GHz
0m10.466s	proxmox6上のdocker(ubuntu2004) RAID1
```

```rb
# Xeon Silver 4210 CPU @ 2.20GHz
# ベアメタル
0m7.493s	CentOS7(ベアメタル)
0m7.625s	CentOS7(ベアメタル)
0m8.533s	CentOS7(ベアメタル)drbd B 300MB スタンドアロン
0m12.203s	CentOS7(ベアメタル)drbd C 300MB 通常時
0m12.121s	CentOS7(ベアメタル)drbd C 300MB 通常時
0m12.210s	CentOS7(ベアメタル)drbd C 300MB 通常時
0m13.202s	CentOS7(ベアメタル)drbd C 300MB sync中
0m14.781s	CentOS7(ベアメタル)drbd C 300MB sync中
0m14.791s	CentOS7(ベアメタル)drbd C 300MB sync中
0m15.715s	CentOS7(ベアメタル)drbd C 300MB sync中
0m16.565s	CentOS7(ベアメタル)drbd C 300MB sync中
0m16.946s	CentOS7(ベアメタル)drbd C 300MB verify中
0m18.033s	CentOS7(ベアメタル)drbd C 300MB verify中
0m19.707s	CentOS7(ベアメタル)drbd C 300MB verify中
0m22.267s	CentOS7(ベアメタル)drbd C 300MB verify中
0m29.077s	CentOS7(ベアメタル)drbd C 300MB sync中

# lxc
0m7.729s	proxmox6上のlxc(CentOS7) RAID10
0m7.739s	proxmox6上のlxc(CentOS7) RAID10
0m7.759s	proxmox6上のlxc(CentOS7) RAID10

# docker
0m6.595s	proxmox6上のdocker(CentOS7) RAID10
0m6.660s	proxmox6上のdocker(CentOS7) RAID10
0m6.686s	proxmox6上のdocker(CentOS7) RAID10
0m6.678s	proxmox6上のdocker(CentOS7) RAID10
0m6.723s	proxmox6上のdocker(CentOS7) RAID10
0m7.861s	proxmox6上のdocker(CentOS7) RAID1

# KVM cpu=host cache=nocache
0m14.732s	proxmox6上のkvm(CentOS7) RAID10 cpu=host
0m14.820s	proxmox6上のkvm(CentOS7) RAID10 cpu=host
0m15.175s	proxmox6上のkvm(CentOS7) RAID10 cpu=host
0m15.415s	proxmox6上のkvm(CentOS7) RAID10 cpu=host
0m15.465s	proxmox6上のkvm(CentOS7) RAID10 cpu=host
0m15.918s	proxmox6上のkvm(CentOS7) RAID10 cpu=host
0m17.030s	proxmox6上のkvm(CentOS7) RAID10 cpu=host
0m18.018s	proxmox6上のkvm(CentOS7) RAID10 cpu=host

# KVM cpu=host cache=nocache core数を半分に設定(HTあり)
0m16.395s	proxmox6上のkvm(CentOS7) RAID10 cpu=host

# KVM cpu=host cache=directsync
0m14.300s	proxmox6上のkvm(CentOS7) RAID10
0m15.026s	proxmox6上のkvm(CentOS7) RAID10
0m15.070s	proxmox6上のkvm(CentOS7) RAID10
0m16.269s	proxmox6上のkvm(CentOS7) RAID10

# KVM cpu=host cache=writethrough
0m21.148s	proxmox6上のkvm(CentOS7) RAID10
0m21.405s	proxmox6上のkvm(CentOS7) RAID10

# KVM cpu=host cache=writeback
0m17.757s	proxmox6上のkvm(CentOS7) RAID10
0m18.429s	proxmox6上のkvm(CentOS7) RAID10
0m20.032s	proxmox6上のkvm(CentOS7) RAID10
0m20.321s	proxmox6上のkvm(CentOS7) RAID10
0m21.167s	proxmox6上のkvm(CentOS7) RAID10

# KVM cpu=amd64 RAID10 cache=nocache
0m16.755s	proxmox6上のkvm(CentOS7) RAID10
0m17.427s	proxmox6上のkvm(CentOS7) RAID10
0m18.744s	proxmox6上のkvm(CentOS7) RAID10
0m19.327s	proxmox6上のkvm(CentOS7) RAID10
0m19.404s	proxmox6上のkvm(CentOS7) RAID10
0m19.739s	proxmox6上のkvm(CentOS7) RAID10
0m21.845s	proxmox6上のkvm(CentOS7) RAID10

# KVM cpu=amd64 RAID1 cache=nocache
0m26.997s	proxmox6上のkvm(CentOS7) RAID1
```

```rb
# Xeon Silver 4110 CPU @ 2.10GHz
0m9.443s	drbd protocol A,80MB
0m9.478s	drbd 非同期(1ノード)
0m36.188s	drbd protocol B,80MB
0m44.673s	drbd protocol C,80MB 通常Cを使う
```

```rb
# Core i5-4308U CPU @ 2.80GHz
0m54.765s	ubuntu 20.04 (virtualbox上のdocker)
2m55.218s	ubuntu 20.04 (ベアメタル上のdocker)
2m56.690s	ubuntu 20.04 (ベアメタル)
```

```rb
# Pentium G4560 @ 3.50GHz
2m6.377s	drbd protocol B,80MB
2m13.032s	drbd protocol C,80MB

# Xeon L5630 @ 2.13GHz
6m0.559s	drbd 非同期(1ノード)

# Core i3-3220T @ 2.80GHz
25m23.866s	kvm環境
```

```rb
# Core i7 4790S @ 3.20GHz
4m59.219s	centos7 (ベアメタル)
5m31.435s	centos6 (kvm)
6m14.403s	centos7 (kvm)
6m51.714s	centos8 (docker)

6m5.660s	ubuntu2004 (ベアメタル)

5m45.805s	ubuntu2004 (docker)
6m37.595s	ubuntu2004 (docker)
6m5.919s	ubuntu2004 (docker)
7m3.191s	ubuntu2004 (docker)
```

----


## 結果 (InnoDB)

```sh:benchmark.sh(InnoDB)
cd /opt/mysql/sql-bench/

time ./run-all-tests \
 --user root \
 --connect-options=mysql_read_default_file=/etc/my.cnf \
 --create-options=TYPE=InnoDB
```

```rb
# Xeon Silver 4210 CPU @ 2.20GHz
11m12.232s	CentOS7(ベアメタル)
11m14.017s	CentOS7(ベアメタル)

# Pentium G4560 @ 3.50GHz
28m55.946s	drbd 非同期(1ノード)
40m43.704s	drbd protocol A,NIC:1GBps

# Xeon Silver 4110 CPU @ 2.10GHz
44m51.161s	drbd protocol C,NIC:1GBps

# Pentium G4560 @ 3.50GHz
47m19.510s	drbd protocol B,NIC:1GBps
51m9.603s	drbd protocol C,NIC:1GBps
```

## 結果 (MyISAM)

```sh:benchmark.sh(MyISAMの場合)
cd /opt/mysql/sql-bench/

time sudo ./run-all-tests  \
 --user=root  \
 --socket=/var/run/mysqld/mysqld.sock2  \
 --log
# --password=hogehoge
```

```rb
# Pentium G4560 @ 3.50GHz
359	drbd 非同期(1ノード)
376	drbd protocol A,NIC:1GBps
380	drbd protocol C,NIC:1GBps
385	drbd protocol C,NIC:1GBps

# Core i3-3220T @ 2.80GHz
1095	kvm環境
1188	kvm環境

# Pentium N4200 @ 1.10GHz
317	kvm環境 2 tests didn't work
```


drbd protocol C,NIC:1GBps を複数回実行してみた

* 6m29.237s
* 6m30.119s
* 7m12.853s


## 失敗例

### Ubuntu 17.10ではそのままではperlからmysqldに接続できなかった

```sh:エラー
sudo ./run-all-tests \
 --user=root \
 --socket=/tmp/mysql.sock

Got error: 'Malformed packet' when connecting to DBI:mysql:database=test;host=localhost;mysql_socket=/tmp/mysql.sock with user: 'root' password: ''
```

`libdbd-mysql-perl`がmysql 4.0に対応していない様子。
自前でmysql4.0のライブラリを指定してリビルドすれば動いた。

![スクリーンショット_2019-11-11_08-12-23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/bdbeb37b-81fe-d899-99e2-6dc2eb5195ba.png)


* /etc/my.cnf

```apache:/etc/my.cnf
[mysqld]
socket=/var/lib/mysql/mysqld.sock
datadir=/var/lib/mysql

default-character-set=sjis
max_allowed_packet=512M # for insert big data

#log=/tmp/query.log
log-long-format

log_slow_queries=/tmp/mysql-slow.log
long_query_time = 1
#log-queries-not-using-indexes

query_cache_limit=16M
query_cache_size=256M

[client]
socket=/var/lib/mysql/mysqld.sock
```

```sh:client
/opt/mysql/bin/mysql \
  --defaults-file=/etc/my.cnf \
  --datadir=/var/lib/mysql/ \
  --user=mysql
```


## 別のサーバーから接続

* user: root
* pass: root

のアカウントを作る方法は以下

```sql
GRANT ALL ON *.* TO root@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;

flush privileges;
```

port 3306 に接続できることをtelnetなどで確認し以下実施

```sh:ベンチマーク
cd /opt/mysql/sql-bench/

# ログの書き込み権限付与
sudo chmod +w ./output/

time perl run-all-tests \
 --small-test \
 --create-options=TYPE=InnoDB \
 --user=root \
 --pass=root \
 --host=192.168.xx.xx
```

接続できない場合は、ファイアウォールでブロックされている可能性がある。

* `systemctl stop firewalld`