読者です 読者をやめる 読者になる 読者になる

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

インフラ MySQL
こんにちは、大曲です。

前回に 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は、非常に使いやすくて凄いので皆さんも使ってみてください。