Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
2
Help us understand the problem. What is going on with this article?
@sonota88

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

  • 開発時に手元のマシンでコンテナを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'

参考

2
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
2
Help us understand the problem. What is going on with this article?