ブログ

mytopの使い方

2007年06月28日 │ 谷口

谷口です。

今回は私がmysqlの運用時に重宝しているmytopというツールの紹介をしたいと思います。
ご存知の方も多いと思いますが、mytopはunixのtopコマンドのような感覚でmysqldの実行状況を監視できる、Perlスクリプトです。
基本的には show status と show full processlist を発行し、取得した情報から統計情報などを算出して表示しています。
(モード切替によって、発行するmysqlコマンドは変化します。)

使いどころとしましては、以下のような場合に有効かと思います。

  • logを解析するのが面倒。
  • デッドロックやブロッキングが起きていないか検出したい。
  • 現在何か問題が起こっていそうなので、すぐに調べたい。

インストール方法や動作環境などは、mytopのページを参照していただくとしまして、本記事では簡単に使い方を記します。

まず、実行中の画面は下のような感じです。
少し分かりにくいですが、実行中のスレッドが黄色で、接続されているだけでのスレッドが白色で、
レプリケーションなどのシステム関連のスレッドが緑色でそれぞれ表されています。*1

画面上部のヘッダー部分は様々な統計情報をあらわしています。ざっと簡単に説明します。

  • Queries: mysqld起動時からの総クエリ数
  • qps: mysqld起動時からの平均秒間クエリ数( Queries Per Second )
  • Slow: mysqld起動時からの総スロークエリ数
  • Se/In/Up/De(%): 各クエリの比率( Alter文やCreate文なども含めたパーセンテージのため、合計は100%になりません )
    • Se: Select文
    • In: Insert文
    • Up: Update文
    • De: Delete文
  • qps now: 観測時のqps *2
  • Slow qps: 観測時のスロークエリのqps
  • Threads: 実行中のスレッド数
    • [アクティブスレッド数] / [総スレッドキャッシュ数]
  • Key Efficiency: key_buffer(myISAM)のヒット率 *3
  • Bps in/out: データ転送速度(累積平均)[Bytes/sec]
  • Now in/out: データ転送量(観測時)[bits/sec]

コマンドの説明も簡単に記します。

制御系コマンド

  • ?: ヘルプ
  • q: mytopを終了
  • k: スレッドの停止
  • r: ステータスのリセット(Queriesなど一部の情報はリセットされない)
  • p: 表示の一時停止
  • s: 更新の間隔設定。秒単位(デフォルト5秒)

フィルター系コマンド(リアルタイム監視時によく使う)

  • d: 特定データベースへの接続のみ表示
  • u: 特定ユーザのスレッドのみ表示
  • h: 特定ホストからの接続のみ表示
  • i: 実行中のスレッドのみ表示
  • F: フィルタ解除
  • o: 実行時間の多い順に表示(もう一度コマンド発行すると元に戻る)

i → o [→ d, u, h] で、特に監視したい情報のみに絞ることができます。

表示モード切替え系コマンド

  • c: 各mysqlコマンドの累積実行比率を表示(mytopで実行されているものも含む)
  • m: qpsのみを表示
  • I: InnoDB status
  • H: ヘッダー部分を非表示
  • t: デフォルトモードに戻す

パフォーマンスチューニング時によく使うコマンド

  • f: 特定スレッドの実行中クエリを全文表示
  • e: クエリのExplain結果を表示

非常に時間のかかるクエリの場合、Explainするのにも時間がかかる場合もあります。
そのため、よほどの事情がない限りExplainは運用環境では実行しないことをおススメします。
実際の開発現場では、開発環境と運用環境が分かれている場合がほとんどだと思いますが、
mytopを使う場面は主に運用環境だったりしますので、注意が必要です。
運用環境では f コマンドで全文をチェックして開発環境でExplainするなど、運用環境にあまり負荷がかからないように工夫するのがいいかと思います。

最後に、私はクエリチューニングやメモリチューニングなどでmytopをよく使っており、非常に助けられています。
まだ使ったことのない方は、是非使ってみてください。
また、同じようなツールにinnotopというのもありますが、こちらはまだ使ったことがありません・・・。
近々使ってみようと思ってますので、そのうち比較とかできたらなぁなどと考えています。

*1 要Term::ANSIColor

*2 要Time::HiRes

*3 key_bufferとはmyISAMのグローバルバッファで、各テーブルのindex情報を展開するために確保するメモリ空間。パフォーマンスに大きく寄与するので、95%以上を保てるよう設定することが望ましい。key_buffer_sizeで変更可能。