即効クエリチューニングMySQLのリアルタイムモニタリングに「innotop」2016年6月15日(水)yoku0825Tweetinnotopとは「innotop」はMySQLのクエリー実行状況やステータス変数の変化などをtopコマンド風に出力してくれる、Perlで書かれたスクリプトです。topライクなインターフェイスはリアルタイムモニタリングと相性が良く、非常に直観的でわかりやすい情報を提供してくれます。TABLE(またはpt-online-schema-change)をかける際の負荷モニター」や「MySQLが高負荷状態になっている時の状況確認」などによく利用しています。topコマンドと同じような使い方です。innotopの開発とメンテナンスinnotopの立ち位置は少し微妙です。Codeのサービス終了に伴いGitHubに移行しました。Code時代にはrpmパッケージも配布されていましたが、2016/05/05現在ではGitHub上でタグやリリースは作成されていません。Issueへの対応も活発とは言い難く、今後どのようにメンテナンスされていくのかが気になるところです。5.7関連のPull-Requestがマージされ、現在では息を吹き返しつつある感があります。modes.innotopのインストールinnotopをインストールするには、Debian系では初期設定リポジトリーのmysql-clientリポジトリーに、RHEL系ではepelリポジトリーにinnotopパッケージがあり、それぞれ利用できます。/usr/bin/innotopinnotop-1.10.0-0.3.81da83f.el6.noarchGitHubのリポジトリーからインストールする場合は以下のようになります。PerlおよびExtUtils::MakeMaker、DBD::mysql、Term::ReadKeyモジュールが必要です。install上記の手順ではモジュールのチェックと/usr/local/binへのファイルコピー、manpageの追加などを行っているだけなので、取りあえず動かしたいのであれば、リポジトリをクローンした後innotopのファイルをそのまま実行するだけで問題ありません。接続先を指定するオプションinnotopからMySQLに接続するためのオプションは、パスワードの対話入力を除いてmysqlコマンドと同じものが使用できます。--socketただし、mysqlコマンドでは引数なしで-pまたは--passwordでパスワードの対話式入力が指定できますが、innotopでは--askpassオプションを利用します。リアルタイムモニタリングに関する操作topライクな画面でinnotopを利用するためのオプションは多くありません。ほとんどの表示切り替えは、起動後にinnotop内のキーで操作します(インターバルの変更も起動後に可能)。オプション(バッチモード)に近い)、表示する画面によってはvmstatコマンドのように利用することも可能です。--noint以下の説明で表記するキーは大文字小文字を区別します。コンフィグファイルやオプションで指定せず、通常モード(非インタラクティブモードでない)でinnotopを起動した場合、最初にダッシュボード画面が表示されます。topライクな画面でダッシュボードというのも変な気分がしますが、これはinnotopが「複数のMySQLサーバーにコネクションを張り、innotop内でそれらを切り替えながら見ることができる」ためです。画面には1つのMySQLしか表示されていませんが、複数のMySQLに接続した場合は複数行並んで表示されます。マスターとスレーブを1つのグループとしてまとめて設定(~/.innotop/innotop.confに記録)しておくことで、ダッシュボード画面からレプリケーションの系全体を眺めるなどのユースケースがあるかと思いますが、筆者はこの方法ではなくtmuxを利用して複数のサーバーに同時にログインし、各サーバー上でinnotopを起動させています。これはinnotopの全ての機能を使うにはrootユーザーの方が都合が良いことや、innotopと合わせてdstatを起動しておくことが多いためです。innotopも複数の画面(例えばレプリケーションステータスとInnoDBバッファプール)を一度に見たい場合も、tmuxであれば簡単に画面を分割し、innotopを複数起動できます。割り当てられていますが、筆者は上記のような使い方もあり、好んでこの画面に戻ってくることはありません。キーで遷移できるクエリー画面です。PROCESSLISTステートメントの出力結果をパースしてtopライクに表示してくれます。モニタリングのインターバル(-dオプションまたは[d]キーの押下で設定できる)ごとに現在実行されているクエリーの一覧が更新されます。その際、StateがSleepのスレッドは除外して表示してくれる、クエリーの実行時間(Timeの値)に応じて文字色を変更してくれるなど、少しずつ便利な機能が含まれています。キーによるKILLステートメント(同様にスレッドIDを入力するプロンプトが表示される)があります。キーの押下でソートするカラムを変更できます。キーのInnoDBバッファプール画面を見てみましょう。MEMORY"セクションをパースした結果が表示されます。STATUSの結果のままなので、特に説明は要らないと思います。innodb_read_io_threads、innodb_write_io_threadsを大きくしている場合は画面が少し狭く感じるかも知れません。Statisticsは[I]キーによる増分表示に対応していないため、少し残念に思っています。Lock画面に遷移できます。Lock画面ではinformation_schema.INNODB_LOCKSテーブルを一覧します。Waits画面を使います(どちらの画面もクエリー画面と同様に[k]キーでKILLステートメントを呼び出せる)。STATUSの出力結果を見ることができます(以下の参考画面は、段落の冒頭で説明したようにtmuxコマンドと組み合わせて上段がマスター、下段がスレーブでそれぞれinnotopを起動)。Status)が空になっています。STATUSを実行した結果です。StatusにはTimeLag(Seconds_Behind_Masterの値)やCatchup(前回のTimeLagとの差分を時間で割ったもの)が含まれており、レプリケーションの様子を気にしながら流すバッチのお供としては最適です。STATUSでよく見る類のカウンターが集まっています。TABLEになった)ため、以前ほどこの画面を眺め続けることは少なくなりました。セクションをパースしたものです。そのため、個々のクエリーのUNDOログ数まで見られるようになっており、大きなトランザクションをロールバックしている時に役立ちます(本当はこれが役立つ事態が起こらない方が喜ばしいのだが)。help)"と表示されています。キーを押下すると、各モードに対応するキー操作などの情報が表示されます。キー、とだけ憶えておくのが良いと思います(常に画面表示されているため憶える必要すらないが)。非インタラクティブモードでの利用について非インタラクティブモードはinnotopをバックグラウンドで利用するためのモードと説明しましたが、実際の使いどころはあまり多くありません。紹介したようにCactiなどのグラフ化ツールを利用する方が有効です。いえ、「一晩だけ1秒感覚でSeconds_Behind_Masterの値を監視したい」など、ユースケースが合えば利用しやすいことも事実です。innotopを非インタラクティブモードで利用するには、以下のようにします。182043888..-nオプションが非インタラクティブモードを指定するオプションで、-ttは1行ごとに時間も出力させるオプション、-mで画面を指定します(-mに渡すアルファベットはインタラクティブモードで起動中のinnotop内で画面を切り替えるキーと同じ)。