VTRyo Blog

一歩ずつ前に進むブログ

performance_schemaが簡単に見れるps-top

f:id:vtryo:20180716123833p:plain お久しぶりになりました。

Techブログは一ヶ月以上更新できていなくて、自分の力不足を感じるこの頃です。

言い訳と言い訳と記録のために話をすると、5月に転職しまして、ちょっとバタバタしていました。

転職後、色んなことしまくってるので、その辺のことも書いていきたいので頑張っていきまする(ネタだけがメモ帳に溜まっている…)

DBのボトルネックが何か知りたい経緯

テスト環境が重いという報告をもらってから performance_schema を調査するとよいぞ、というアドバイスを頂いたのでperformance_schemaを調査してました。

どっこい、やったことある人はわかると思いますが、こいつはどうも見にくい。
SQLを工夫しないと、とても人が見るようにはなっていないような(笑)

さらに、これがDB初心者だとなおのこと大変です。SQLを調べる手間もかかったりしますね。

performance_schemaとは

DBチューニングする人にはお馴染みなのかもしれません。

・「パフォーマンススキーマ」は、MySQL 5.5.3から導入されたパフォーマンスモニタリングのためのストレージエンジンです。
引用:performance_schemaをsysで使い倒す!

・performance_schema データベースのテーブルをクエリーし、それを実行しているサーバーとアプリケーションのパフォーマンス特性に関するリアルタイムの情報を確認できます。
引用:8.12.4 performance_schema によるパフォーマンスの測定

言ってることはなんだか難しげですが、「DBチューニングするぞい。でもどこがボトルネックで何をチューニングしたらいいか見えてないぞい」ってときにここを確認すればいいかなと思います。

雑ですが、実際にDBでperformance_schemaを見る場合はこんな感じ。

mysqlログイン後に実行します。

  • DBを選択
> use performance_schema;
  • みたいテーブルをselectする
> select * from <table_name>;

performance_schemaの注意点

ちなみに、performance_schemaはMysql5.6以降はデフォルトで有効化されてます。

performance_schemaはメモリを食う生き物なので、本番環境ではOFFにしておくパターンが多いようです。

なお私はstg, dev環境でperformance_schemaの設定を有効にしてます。

performance_schemaのサマリーテーブル

サマリーテーブルについてちょっとだけ紹介。

以下に書くのはDBでselectしたときの表示の一部です。(公式に載ってる分)

また、サマリーテーブル名のwaitstageに関してはきちんと意味があります。

パフォーマンススキーマのテーブル名や格納されている値の"⁠Instruments⁠"名は階層構造の各レベルに対応しています。

stage:SQL実行プロセスのステップ
wait:処理実行待ち

table_io_waits_summary_by_table

テーブル I/O 待機イベントを集計。

file_summary_by_instance

I/O 操作に関する情報を集計。
ファイルインスタンスごとに要約されたファイルイベント。

SELECT * FROM file_summary_by_instance\G
...
*************************** 2. row ***************************
                FILE_NAME: /var/mysql/share/english/errmsg.sys
               EVENT_NAME: wait/io/file/sql/ERRMSG
               EVENT_NAME: wait/io/file/sql/ERRMSG
    OBJECT_INSTANCE_BEGIN: 4686193384
               COUNT_STAR: 5
           SUM_TIMER_WAIT: 13990154448
           MIN_TIMER_WAIT: 26349624
           AVG_TIMER_WAIT: 2798030607
           MAX_TIMER_WAIT: 8150662536
...

table_lock_waits_summary_by_table

テーブルロック待機イベントを集計。
ロックとは、複数のセッションから同時にデータを変更されないようにレコードを保護する仕組み。

processlist

どのスレッドが実行されているかを表示。
重たい処理から抜けられなくなったときなどに、このprocesslistでプロセスIDを特定してKillしたりできる。

events_waits_summary_global_by_event_name

イベント名ごとに要約された待機イベント。

mysql> SELECT * FROM events_waits_summary_global_by_event_name\G
...
*************************** 6. row ***************************
    EVENT_NAME: wait/synch/mutex/sql/BINARY_LOG::LOCK_index
    COUNT_STAR: 8
SUM_TIMER_WAIT: 2119302
MIN_TIMER_WAIT: 196092
AVG_TIMER_WAIT: 264912
MAX_TIMER_WAIT: 569421
...
*************************** 9. row ***************************
    EVENT_NAME: wait/synch/mutex/sql/hash_filo::lock
    COUNT_STAR: 69
SUM_TIMER_WAIT: 16848828
MIN_TIMER_WAIT: 0
AVG_TIMER_WAIT: 244185
MAX_TIMER_WAIT: 735345
...

events_stages_summary_global_by_event_name

イベント名ごとに要約されたステージ待機。

SELECT * FROM events_stages_summary_global_by_event_name\G
...
*************************** 5. row ***************************
    EVENT_NAME: stage/sql/checking permissions
    COUNT_STAR: 57
SUM_TIMER_WAIT: 26501888880
MIN_TIMER_WAIT: 7317456
AVG_TIMER_WAIT: 464945295
MAX_TIMER_WAIT: 12858936792
...
*************************** 9. row ***************************
    EVENT_NAME: stage/sql/closing tables
    COUNT_STAR: 37
SUM_TIMER_WAIT: 662606568
MIN_TIMER_WAIT: 1593864
AVG_TIMER_WAIT: 17907891
MAX_TIMER_WAIT: 437977248
...

ps-topとは

本題のps-topに行きましょう。

ps-topがどれくらいお手軽かも見てもらいたいところです。

ps-topとはtopコマンドライクにperformance_schemaを表示できるGo製のツールです。

データベースから情報を収集して、リアルタイムに表示してくれるようです。
個人的なGoodポイントは

  • インストールが簡単
  • select, insert, update, deleteで分けられていて見やすい
  • タブひとつで項目が切り替わる
  • ちゃんとソースコードがメンテナンスされてる(何年も放置されてない)

という感じで、DBよくわからないマンな人でも簡単にモニタリングできそうなところです。

goのインストールとセットアップ

Goがインストールされていない人はここから始めます。

  • go install
$ wget https://dl.google.com/go/go1.10.2.linux-amd64.tar.gz
$ tar -C /usr/local -xzf go1.10.2.linux-amd64.tar.gz
  • PATHの設定
$ vim ~/.bash_profile

export PATH=$PATH:/usr/local/go/bin

ps-topのインストール

$ mkdir ~/go ; cd ~/go
$ go get -u github.com/sjmudd/ps-top/cmd/ps-top

表示してみる

$ ~/go/bin/ps-top --host=YOUR_DB_NAME --user USERNAME --password PASSWORD

こんな感じで表示されるかと思います!

f:id:vtryo:20180716124132p:plain

ちなみに、表示項目の変更はキーボードのTabを押していくだけです。

所感

コマンド一行でtopコマンドっぽく値が見れるので、やっぱ簡単だなと思います!
SQLで指定してやる必要がなく、みたい情報をバンバン拾える感じです。

結局、このps-topのおかげで簡単にボトルネックを発見でき、パフォーマンス改善に繋がりました!

ps-topはたまたま見つけて、えいやでインストールしてみたんですが、他の人からも割と好評でした^^

ぜひ試してみてください!