2021-05-16に更新

開発用の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%減りました 😮
また、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'

参考

Originally published at qiita.com
ツイッターでシェア
みんなに共有、忘れないようにメモ

sonota486

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント