負荷テストでRstudioを使ってSHOW ENGINE INNODB STATUSを可視化したお話

こんにちは、大曲です。

前回に dstatの可視化に関してお話ししましたが、
今回のMySQLの状態を可視化したのでその内容を話します。

負荷テスト


負荷テストの概要


約5分間MySQLJMeter から 負荷(SQL実行) をかけ続けるというテストを行いました。

詳細は話せないのですが、ざっくりとこんな感じです。

この時にMySQLの状態を確かめるために、Rstudioを使ってデータ可視化に踏み切りました。

今回は以下の順番でお話しします。
  1. データの取得
  2. データの整形
  3. データの可視化 
それでは、行ってみよう!!!

1.データの取得


MySQL-5_1



SHOW ENGINE INNODB STATUS のデータは、
そのままのデータとしても活用できるので、そのまま出力しました。

while true; do echo `date`; mysql -u root -e "SHOW ENGINE INNODB STATUS;" >> show_innodb_status.txt; sleep 10; done;
 
10秒ごとに SHOW ENGINE INNODB STATUS を実行するだけのコマンドです。
これを負荷テスト時に実行し続けました。

出力結果は、以下のようになります。
SHOW ENGINE INNODB STATUS の内容が1行にまとまります。

InnoDB          \n=====================================\n150303 10:40:35 INNODB MONITOR OUTPUT\n=====================================\nPer second averages calculated from the last 25 seconds\n-----------------\nBACKGROUND THREAD\n-----------------\ ....


2.データの整形


素のままの SHOW ENGINE INNODB STATUS では、可視化できません。
可視化するために、まず数値化します。

このときに利用したのが、 Cactiphpスクリプトです。

cacti_logo


CactiMySQLプラグインで表示されるグラフは、
SHOW ENGINE INNODB STATUS をそのまま解析して
数値化してグラフ表示にしています。
そのため、数値化に使われているスクリプトをそのまま流用しました。

percona-monitoring-plugins
↑のサイトからダウンロードしました。

流用したスクリプトは、cacti\scripts\ss_get_mysql_stats.php です。 

function get_innodb_array($text) というメソッドが
SHOW ENGINE INNODB STATUSのテキストデータを1行1行処理して、
ハッシュの配列に置き換えてくれてます。
今回は、これを利用しました。

実際のコードは、長いので下のリンクにあるので、見てみてください。

phpのスクリプト

変更点としては、以下の通りです。
  • 取得したデータをCSVとして、ファイル出力する
  • SHOW INNODB STATUSの実行時間の情報も取得する
  • 「 \n 」単位で文字を区切って1行として処理する
SHOW INNODB STATUSの実行時間に関して。

InnoDB          \n=====================================\n150303 10:40:35 INNODB MONITOR OUTPUT\n=====================================\nPer second averages calculated from the last 25 seconds\n-----------------\nBACKGROUND THREAD\n-----------------\ ....

上の内容で言うと 「 150303 10:40:35 」 が実行した時間になります。
( 2015年3月3日 10時40分35秒という内容です)
時間を取り出す処理、以下の内容を追加しました。
      if (preg_match('/[0-9][0-9]:[0-9][0-9]:[0-9][0-9] INNODB MONITOR OUTPUT/', $line)) {
        $results['time'] = $row[0] . ' ' . $row[1];
      }
あとは、作ったPHPファイルを実行するだけです。

php convert_innodb_status.php "input_file" > output_file

上の内容のように実行すると、CSV形式の出力結果が出ます。
これで、数値化の完了です。

はい、簡単です!!
 

3.データの可視化


次に数値化が完成したところで、いよいよ可視化のフェーズです。

そこでRstudioの出番です。

RStudio-Logo-Blue-Gradient

CSVの内容をグラフにするだけなので、難しい内容ではありません。

やっていること
  • CSVの読み込み
  • 差分のデータ必要な項目は、差分を抽出する
  • データのグラフを作成する(折れ線グラフ) 



詳しい値は、見せられませんが以下のようなグラフが出来ました。
 
InnoDB_Semaphore

  •  InnoDB Transactions Active/Locked
InnoDB_Transactions

InnoDB_Table_in_Use

InnoDB_transaction


上のグラフは、順に負荷を上げていった時の図です。
これで、MySQL的な処理の限界が簡単に分かるようになりました。

「あー、分間XXXX件くらいの処理で性能が落ちるね~」 などなど言えます。
あとは、色々なパターンを試してみて各パターンの傾向を見て試行錯誤するだけです。

まとめ

やっていることは、難しくありません。

Cactiの取得する間隔を短くすれば、簡単にできます。
 
パターンごとの比較が出来たり、Cacti用のサービスを負荷テストのために作る必要がないことが
違いかなと思います。

今回これを実装したことによって、いつでも簡単に可視化できるようになりました。
 
気になる時間などにシェルスクリプトを実行しておけば、
あとは出力したファイルを可視化するだけです。
手軽さという点で、個人的には重宝しています。

最後に RStudioは、非常に使いやすくて凄いので皆さんも使ってみてください。