この連載が書籍になりました!『MySQL 即効クエリチューニング

MySQLのリアルタイムモニタリングに「innotop」

2016年6月15日(水)
yoku0825

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がマージされ、現在では息を吹き返しつつある感があります。

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_threadsinnodb_write_io_threadsを大きくしている場合は画面が少し狭く感じるかも知れません。筆者はLog Statisticsを見るためにこの画面をよく呼び出しますが、Log Statisticsは[I]キーによる増分表示に対応していないため、少し残念に思っています。

InnoDB Lock画面

[L]キーでInnoDB Lock画面に遷移できます。

[L]キーのInnoDB Lock画面ではinformation_schema.INNODB_LOCKSテーブルを一覧します。かの有名なビューのようにinformation_schema.INNODB_LOCK_WAITSinformation_schema.INNODB_TRXテーブルなどとJOINしてブロックしているクエリーとブロックされているクエリーの一覧を見る場合は[K]キーのInnoDB Lock Waits画面を使います(どちらの画面もクエリー画面と同様に[k]キーでKILLステートメントを呼び出せる)。

レプリケーション画面

[M] キーではSHOW SLAVE STATUSSHOW 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(レプリケーション画面)などでは使いどころがありそうな気がします。

まとめ

innotoptopライクにMySQLの状況を確認できるツールです。クエリー画面の[Q]キー、レプリケーション画面の[M]キーくらいは憶えておいても損はないと思います。

また、今回説明した以外にもinnotopにはいくつかの機能があります。なかなか略語が難解(例えば"Connections"を"Cxns"と省略しているツールを筆者は他に知らない)、[S] キーのステータス変数一覧などは扱いづらい面もあります(筆者は正直この画面を扱うことを諦めmysqladmin -rなどのワンライナーで済ませることにしている)。

まずは「いかにもtopライクな」ところから手軽、便利に利用し、時間に余裕がある時に他の機能を探してみるのが良いかと思います。

GMOメディア株式会社

GMOメディア株式会社のDBAで日本MySQLユーザ会員。Oracle ACE(MySQL)、MySQL 5.7 Community Contributor Award 2015受賞。ぬいぐるみとイルカが好きなおじさん。

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています