6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

開発用のMySQL Dockerコンテナのメモリ消費が大きくて辛かったのでperformance_schemaを無効にしてどれくらい減るか調べたメモ

Last updated at Posted at 2021-05-09
  • 開発時に手元のマシンでコンテナを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%減りました :open_mouth:
また、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

調査方法

使ったもの

ディレクトリ・ファイル配置

- (作業用ディレクトリ)
  - 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'

参考

6
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?