performance_schemaのsetup_instrumentsテーブルによる性能差

先日のMyNA会(2013年7月)の際に@sheeriさんがperformance_schema(以下p_s)について発表されていた際に取得項目がsetup_instrumentsテーブルで制御出来るようなお話をしていました。

MySQL5.6ではp_sが有効だと性能が1割程度落ちたりするというのは最近では割と良く知られてきている話しだと思います。p_sが有効な状態でsetup_instrumentsテーブルで全部取得しないようにした場合にどの程度の性能差が出るか試してみました。

設定ファイルのmysqldセクションでperformance_schema=ON, OFFを切り替えてテストしました。
また今回はread-onlyなケースしか行っていないのでバイナリログ周りの設定は結構ザルです。

ベンチマークについて

設定を変えつつsysbenchを以下の内容で実行しています。

#!/bin/sh

threads='8 16 32 64 128 256 512 1024'
DIR=ケース名

[ ! -d $DIR ] && mkdir $DIR
cp -pi ./mysql/etc/my.cnf $DIR/.

for thread in $threads; do
  echo "==== $thread ===="
  /usr/local/sysbench/bin/sysbench \
    --test=/usr/local/src/sysbench/sysbench/tests/db/oltp.lua \
    --init-rng=1 \
    --db-driver=mysql \
    --db-ps-mode=disable \
    --oltp-table-size=3750000 \
    --oltp-dist-type=uniform \
    --oltp-read-only=on \
    --oltp-tables-count=12 \
    --mysql-db=sbtest5 \
    --mysql-user=sbtest \
    --mysql-password=パスワード\
    --mysql-socket=/tmp/mysql-5.6.13.sock \
    --max-time=180 \
    --max-requests=0 \
    --num-threads=$thread \
    run | tee $DIR/ro-$thread
    sleep 30
done

ベンチマークパターン

以下3パターンで取得しました。

  • ケース1: p_s OFF
  • ケース2: p_s ON (setup_instrumentsテーブルはデフォルト)
  • ケース3: p_s ON (setup_instrumentsテーブルのENABLEDが全てOFF)
    • UPDATE performance_schema.setup_instruments SET enabled = 'NO'; を実行

ベンチマーク結果

上記スクリプト実行前に512スレッドで1分、ベンチマークを実行し、データ/インデックスをバッファに載せる作業をしています。

それほどケースが多くないのでグラフにはしていません。上記のスクリプトによる一発取りです。また、単位はtpsになります。

スレッド数 8 16 32 64 128 256 512 1024
ケース1 2596.08 4413.11 5721.59 5644.72 5619.35 5600.32 5597.74 5697.52
ケース2 2487.02 4333.26 5363.82 5298.40 5278.34 5258.75 5250.21 5333.69
ケース3 2727.37 4673.24 5751.39 5667.72 5671.37 5621.66 5611.42 5609.69

今回に関してはp_sがONでもsetup_instrumentsテーブルのENABLEDが全てNOだとp_sがOFFより性能出てますが所詮一発取りなので誤差と考えられます。とはいえ、p_sがONでも誤差程度の差になったのが割と驚きでした。

ではp_sがONでsetup_instrumentsテーブル変更して運用すれば良いんじゃ、と思うかもしれませんがメモリ使用率がp_sがONと比較して多くなってしまいます。今回の環境ではMySQL再起動後、512スレッドで10分間、sysbenchを実行した場合、psコマンドで表示されるmysqldのRSSは以下のようになりました。

RSS
ケース1 8762784
ケース2 9605508
ケース3 9615032

900MB程度多くメモリを使用する結果となりました。ということで一応デメリットはあります。

まとめ

p_sを有効にしても無効と遜色の無い性能がread-onlyでは出る事が分かりました。ただ、ベンチマークは所詮ベンチマークなので実環境では異なる結果になる可能性がありますので必ず実環境に沿ったベンチマークを取得する事を推奨します。
その結果、記載したベンチマークの結果と同じ傾向になり、メモリ使用率の増加が許容出来るのであればp_sが有効で、必要になるまではsetup_instrumentsを変更(ENABLEDをNOに)して運用するのも有りだと思います。

なお、setup_instrumentsの設定値はMySQLを再起動するとデフォルトになるため、本番運用に組み込む場合は起動スクリプト等でENABLEDをNOに変更する処理を入れる必要があります。 追記参照。

以下の通り設定によりp_sで使うメモリ量は設定値により固定されるようなので極端に使用率が増えることは無いと考えられます。

@yoku8025さん、情報ありがとうございました。

追記

my.cnfのmysqldセクションに以下内容を記載すれば起動時からsetup_instrumentsテーブルのENABLEDをNOに出来ました

performance-schema-instrument='%=off'