- 開発時に手元のマシンでコンテナを2個、3個と同時に動かさないといけない場面があって辛い
- 特に MySQL 5.6。扱うデータが少量でも 400MB を越える。
- データちょっとしか入れてないのに? MySQL ってそういうものなの……??
- あれこれ調べてパフォーマンススキーマを無効にする方法に辿りついた
以下、どのくらい減るかを調べたメモです。
※ 無効にして問題ないのかという点については断定を避け(詳しくないので)、この記事では無効にしたときにどのくらいメモリ消費が減るか調べたことについてのみ書きます。ただ、軽く調べた限りでは、障害の調査やパフォーマンスチューニングをしないのであれば、開発用途では無効にしても不都合はなさそうに思えました。
結果
※ 以下、"ps" と書いているのは performance_schema の略です。
起動した後のメモリ使用量(docker stats
で表示される値):
MySQL のバージョン | ps = ON(MiB) | ps = OFF(MiB) |
---|---|---|
5.6.61 | 464.6 | 59.8 |
5.7.34 | 194.3 | 62.7 |
8.0.24 | 335.9 | 118.6 |
5.6.61 では無効にすることで 88%減りました
また、5.7 でパフォーマンススキーマのメモリ消費がかなり改善されたことが分かります。
show engine performance_schema status
でパフォーマンススキーマ全体でのメモリ使用量を見てみると次のようになっており、上記で減った量とほぼ一致していました。
MySQL のバージョン | performance_schema.memory (MiB) |
---|---|
5.6.61 | 403.9 |
5.7.34 | 131.3 |
8.0.24 | 208.4 |
調査方法
使ったもの
- ホスト: Ubuntu 18.04
- MySQL の公式 Docker イメージ
- Sakila サンプルデータ
ディレクトリ・ファイル配置
- (作業用ディレクトリ)
- sakira-db/
- 0_sakila-schema.sql
- 1_sakila-data.sql
- conf.d/
- my.cnf
conf.d/
と sakila-db/
をそれぞれマウントして読み込ませました。下記のスクリプト参照。
conf.d/my.cnf
[mysqld]
# デフォルトでは ON
performance_schema=OFF
調査用スクリプト
client.sh
#!/bin/bash
CONTAINER_NAME=mysql-sakila
docker exec -it -e MYSQL_PWD=root $CONTAINER_NAME \
mysql --protocol=tcp -uroot -Dsakila "$@"
restart.sh
#!/bin/bash
CONTAINER_NAME=mysql-sakila
TIMEOUT_SEC=120
# MYSQL_VER=5.6.51
# MYSQL_VER=5.7.34
MYSQL_VER=8.0.24
# 動いていたら止める
if (docker ps --format "{{.Names}}" | grep '^'${CONTAINER_NAME}'$' > /dev/null); then
docker stop $CONTAINER_NAME
fi
# mysqld 起動
docker run --rm -it \
-e MYSQL_ROOT_PASSWORD=root \
-v "$(pwd)/conf.d:/etc/mysql/conf.d" \
-v "$(pwd)/sakila-db:/docker-entrypoint-initdb.d" \
--name $CONTAINER_NAME \
-d \
mysql:$MYSQL_VER
# mysqld の起動完了を待って exit
for i in $(seq $TIMEOUT_SEC); do
if (./client.sh -e "select 1" > /dev/null 2>&1); then
printf "\n"
echo "ok"
exit 0
else
printf "."
sleep 1
fi
done
echo "failed"
exit 1
ps_info.sh
#!/bin/bash
set -o xtrace
./client.sh -e "
show variables like 'performance_schema'
"
# パフォーマンススキーマ全体でのメモリ使用量
./client.sh -e "
show engine performance_schema status
" | grep 'performance_schema.memory'