MySQLのリアルタイムモニタリングに「innotop」
![](https://thinkit.co.jp/sites/default/files/styles/main_image_730x/public/main_images/MySQL_3.jpg?itok=EoUrpOwW)
innotopとは
「innotop」はMySQLのクエリー実行状況やステータス変数の変化などをtop
コマンド風に出力してくれる、Perlで書かれたスクリプトです。中身は非常にシンプル(SHOW GLOBAL STATUSやSHOW ENGINE INNODB STATUSなどをパースして表示するだけ)ですが、 top
ライクなインターフェイスはリアルタイムモニタリングと相性が良く、非常に直観的でわかりやすい情報を提供してくれます。
筆者はこれを「稼働中のサービスにALTER TABLE
(またはpt-online-schema-change
)をかける際の負荷モニター」や「MySQLが高負荷状態になっている時の状況確認」などによく利用しています。いかにもtop
コマンドと同じような使い方です。
innotopの開発とメンテナンス
innotopの立ち位置は少し微妙です。innotopはかつてPercona社のBaron Schwartzによって開発され、Google Codeにホスティングされていましたが、Google Codeのサービス終了に伴いGitHubに移行しました。Google Code時代にはrpmパッケージも配布されていましたが、2016/05/05現在ではGitHub上でタグやリリースは作成されていません。Issueへの対応も活発とは言い難く、今後どのようにメンテナンスされていくのかが気になるところです。
と、本記事を執筆し始めた時点ではMySQL 5.7へのサポートが不完全で全ての機能を利用できませんでしたが、5月中に下記のようなMySQL 5.7関連のPull-Requestがマージされ、現在では息を吹き返しつつある感があります。
- Added support for replication channels under MySQL 5.7
- Fix broken test for 5.7
- fixed crashes on the T and L modes.
innotopのインストール
innotopをインストールするには、Debian系では初期設定リポジトリーのmysql-client
リポジトリーに、RHEL系ではepelリポジトリーにinnotop
パッケージがあり、それぞれ利用できます。
- Debian 8で確認
$ sudo apt-get install mysql-client
..
$ dpkg -S /usr/bin/innotop
mysql-client-5.5: /usr/bin/innotop
- CentOS 6.6で確認
$ sudo yum install epel-release
..
$ sudo yum install innotop
..
$ rpm -qf /usr/bin/innotop
innotop-1.10.0-0.3.81da83f.el6.noarch
GitHubのリポジトリーからインストールする場合は以下のようになります。PerlおよびExtUtils::MakeMaker、DBD::mysql、Term::ReadKeyモジュールが必要です。
$ git clone https://github.com/innotop/innotop.git
$ cd innotop
$ perl Makefile.PL
$ make
$ sudo make install
上記の手順ではモジュールのチェックと/usr/local/bin
へのファイルコピー、manpageの追加などを行っているだけなので、取りあえず動かしたいのであれば、リポジトリをクローンした後innotopのファイルをそのまま実行するだけで問題ありません。
接続先を指定するオプション
innotop
からMySQLに接続するためのオプションは、パスワードの対話入力を除いてmysql
コマンドと同じものが使用できます。
オプションの意味 | オプション |
---|---|
MySQLアカウントの指定 | -u または --user |
認証用パスワードの指定 | -p または --password(引数あり) |
接続先IPアドレス | -h または --host |
接続先ポート | -P または --port |
ソケットファイルの指定 | -S または --socket |
ただし、mysql
コマンドでは引数なしで-pまたは--passwordでパスワードの対話式入力が指定できますが、innotop
では--askpassオプションを利用します。
リアルタイムモニタリングに関する操作
top
ライクな画面でinnotop
を利用するためのオプションは多くありません。ほとんどの表示切り替えは、起動後にinnotop内のキーで操作します(インターバルの変更も起動後に可能)。非インタラクティブモードはinnotop
をバックグラウンドで利用するためのモードで(top
コマンドの-b オプション(バッチモード)に近い)、表示する画面によってはvmstat
コマンドのように利用することも可能です。
オプションの意味 | オプション |
---|---|
モニタリングのインターバル | -d または --delay |
非インタラクティブモード | -n または --noint |
以下の説明で表記するキーは大文字小文字を区別します。
ダッシュボード画面
特にコンフィグファイルやオプションで指定せず、通常モード(非インタラクティブモードでない)でinnotop
を起動した場合、最初にダッシュボード画面が表示されます。
top
ライクな画面でダッシュボードというのも変な気分がしますが、これはinnotop
が「複数のMySQLサーバーにコネクションを張り、innotop
内でそれらを切り替えながら見ることができる」ためです。画面には1つのMySQLしか表示されていませんが、複数のMySQLに接続した場合は複数行並んで表示されます。
例えば、マスターとスレーブを1つのグループとしてまとめて設定(~/.innotop/innotop.conf
に記録)しておくことで、ダッシュボード画面からレプリケーションの系全体を眺めるなどのユースケースがあるかと思いますが、筆者はこの方法ではなくtmux
を利用して複数のサーバーに同時にログインし、各サーバー上でinnotop
を起動させています。これはinnotop
の全ての機能を使うにはrootユーザーの方が都合が良いことや、innotop
と合わせてdstat
を起動しておくことが多いためです。また、innotop
も複数の画面(例えばレプリケーションステータスとInnoDBバッファプール)を一度に見たい場合も、tmux
であれば簡単に画面を分割し、innotop
を複数起動できます。
なお、キーは[A] が割り当てられていますが、筆者は上記のような使い方もあり、好んでこの画面に戻ってくることはありません。
クエリー画面
innotop
で筆者がよく使う画面といえば、[Q] キーで遷移できるクエリー画面です。
クエリー画面はSHOW PROCESSLIST
ステートメントの出力結果をパースしてtop
ライクに表示してくれます。モニタリングのインターバル(-d
オプションまたは[d]キーの押下で設定できる)ごとに現在実行されているクエリーの一覧が更新されます。その際、StateがSleepのスレッドは除外して表示してくれる、クエリーの実行時間(Timeの値)に応じて文字色を変更してくれるなど、少しずつ便利な機能が含まれています。
クエリー画面から利用できるキーシーケンスとしては[e] キーによるEXPLAIN
([e] キーの押下後スレッドIDを入力するプロンプトが表示される)、[k] キーによるKILL
ステートメント(同様にスレッドIDを入力するプロンプトが表示される)があります。デフォルトのソート順はTimeカラムの降順ですが、[s] キーの押下でソートするカラムを変更できます。
InnoDBバッファプール画面
次に、[B] キーのInnoDBバッファプール画面を見てみましょう。
SHOW ENGINE INNODB STATUS
の"BUFFER POOL AND MEMORY"セクションをパースした結果が表示されます。この画面で表示される項目はほぼSHOW ENGINE INNODB STATUS
の結果のままなので、特に説明は要らないと思います。
InnoDB I/O画面
続いて、[i]キーのInnoDB I/O画面です。
innodb_read_io_threads
、innodb_write_io_threads
を大きくしている場合は画面が少し狭く感じるかも知れません。筆者はLog Statisticsを見るためにこの画面をよく呼び出しますが、Log Statisticsは[I]キーによる増分表示に対応していないため、少し残念に思っています。
InnoDB Lock画面
[L]キーでInnoDB Lock画面に遷移できます。
[L]キーのInnoDB Lock画面ではinformation_schema.INNODB_LOCKS
テーブルを一覧します。かの有名なビューのようにinformation_schema.INNODB_LOCK_WAITS
、information_schema.INNODB_TRX
テーブルなどとJOINしてブロックしているクエリーとブロックされているクエリーの一覧を見る場合は[K]キーのInnoDB Lock Waits画面を使います(どちらの画面もクエリー画面と同様に[k]キーでKILL
ステートメントを呼び出せる)。
レプリケーション画面
[M] キーではSHOW SLAVE STATUS
とSHOW MASTER STATUS
の出力結果を見ることができます(以下の参考画面は、段落の冒頭で説明したようにtmux
コマンドと組み合わせて上段がマスター、下段がスレーブでそれぞれinnotop
を起動)。
マスター側ではSHOW SLAVE STATUS
をパースして得られる上の2段(Slave SQL Status、Slave I/O Status)が空になっています。スレーブ側のMaster Statusに表示されているのはスレーブから見たマスターの状態ではなく、スレーブ上でSHOW MASTER STATUS
を実行した結果です。注意してください。
スレーブ側のSlave SQL StatusにはTimeLag(Seconds_Behind_Master
の値)やCatchup(前回のTimeLagとの差分を時間で割ったもの)が含まれており、レプリケーションの様子を気にしながら流すバッチのお供としては最適です。
InnoDB Row画面
[R]キーのInnoDB Row画面には、SHOW ENGINE INNODB STATUS
でよく見る類のカウンターが集まっています。
MySQL 5.5以前はInnodb_rows_insertedの値からALTER TABLE
の進捗を確認するテクニックもありましたが、MySQL 5.6以降のオンラインALTER TABLEではInnodb_rows_insertedがカウントアップされなくなった(INPLACE ALTER TABLEになった)ため、以前ほどこの画面を眺め続けることは少なくなりました。
InnoDB Transaction画面
[T] キーではトランザクションの一覧を見ることができますが、これはinformation_schema.INNODB_TRX
テーブルのものではなく 、SHOW ENGINE INNODB STATUS
の"TRANSACTIONS" セクションをパースしたものです。
そのため、個々のクエリーのUNDOログ数まで見られるようになっており、大きなトランザクションをロールバックしている時に役立ちます(本当はこれが役立つ事態が起こらない方が喜ばしいのだが)。
ヘルプ画面
今までの画面にも含まれていましたが、innotop
を起動しているとヘッダー部分に"(? for help)"と表示されています。それに従って[?] キーを押下すると、各モードに対応するキー操作などの情報が表示されます。
迷った時は[?] キー、とだけ憶えておくのが良いと思います(常に画面表示されているため憶える必要すらないが)。
非インタラクティブモードでの利用について
非インタラクティブモードはinnotop
をバックグラウンドで利用するためのモードと説明しましたが、実際の使いどころはあまり多くありません。多くの(ステータス変数をモニタリングしたい)場合はmysql
コマンドラインクライアントをそのまま利用したシェルスクリプトをバックグラウンドで動かしておけば十分ですし、間隔が長く丸めが許容できるレベルでモニタリングしておきたい場合は第4回 で紹介したようにCactiなどのグラフ化ツールを利用する方が有効です。とはいえ、「一晩だけ1秒感覚でSeconds_Behind_Masterの値を監視したい」など、ユースケースが合えば利用しやすいことも事実です。
innotop
を非インタラクティブモードで利用するには、以下のようにします。
$ innotop -S/path/to/socket/file -uroot -pxxxx -d 1 -n -tt -m M
2016-05-23T18:54:59 master_host slave_sql_running time_behind_master slave_catchup_rate slave_open_temp_tables relay_log_pos last_error
2016-05-23T18:54:59 xxx.yyy.zzz.aaa Yes 00:00 0.00 0 182023897
2016-05-23T18:55:00 xxx.yyy.zzz.aaa Yes 00:00 0.00 0 182034599
2016-05-23T18:55:01 xxx.yyy.zzz.aaa Yes 00:00 0.00 0 182043888
..
-n
オプションが非インタラクティブモードを指定するオプションで、-tt
は1行ごとに時間も出力させるオプション、-m
で画面を指定します(-m
に渡すアルファベットはインタラクティブモードで起動中のinnotop
内で画面を切り替えるキーと同じ)。-m K
(InnoDB Lock Wait画面。ロック待ちがあった時のみ表示)や-m C
(コマンド画面。SHOW GLOBAL STATUS LIKE 'Com\_%'
を差分つきで表示)や-m M
(レプリケーション画面)などでは使いどころがありそうな気がします。
まとめ
innotop
はtop
ライクにMySQLの状況を確認できるツールです。クエリー画面の[Q]キー、レプリケーション画面の[M]キーくらいは憶えておいても損はないと思います。
また、今回説明した以外にもinnotop
にはいくつかの機能があります。なかなか略語が難解(例えば"Connections"を"Cxns"と省略しているツールを筆者は他に知らない)、[S] キーのステータス変数一覧などは扱いづらい面もあります(筆者は正直この画面を扱うことを諦めmysqladmin -r
などのワンライナーで済ませることにしている)。
まずは「いかにもtop
ライクな」ところから手軽、便利に利用し、時間に余裕がある時に他の機能を探してみるのが良いかと思います。
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- performance_schemaをsysで使い倒す!
- MySQLのチューニングを戦う方へ
- 再現性のあるスロークエリーには「SHOW PROFILE」を試してみよう
- MySQL 5.6での機能強化点(その3)- 人気のレプリケーションが更に機能強化
- MySQL Clusterにおけるレプリケーション環境構築例
- MySQL Clusterにおけるレプリケーションの基礎
- SQL実行計画の疑問解決には「とりあえずEXPLAIN」しよう
- Pythonで作られた便利なコマンドラインツール MySQL Utilities
- MySQL Clusterのバックアップ/リストアの具体例
- スローログの集計に便利な「pt-query-digest」を使ってみよう