お久しぶりになりました。
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したときの表示の一部です。(公式に載ってる分)
また、サマリーテーブル名のwait
やstage
に関してはきちんと意味があります。
パフォーマンススキーマのテーブル名や格納されている値の"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
こんな感じで表示されるかと思います!
ちなみに、表示項目の変更はキーボードのTabを押していくだけです。
所感
コマンド一行でtopコマンドっぽく値が見れるので、やっぱ簡単だなと思います!
SQLで指定してやる必要がなく、みたい情報をバンバン拾える感じです。
結局、このps-topのおかげで簡単にボトルネックを発見でき、パフォーマンス改善に繋がりました!
ps-topはたまたま見つけて、えいやでインストールしてみたんですが、他の人からも割と好評でした^^
ぜひ試してみてください!