New Relic MySQL PluginでAmazon RDS for MySQLの性能を監視

ひとつ前の記事で、CactiプラグインによるAmazon RDSの性能監視について書きましたが、ここではNew Relicプラグインによる性能監視についてまとめます。

isdNew Relicについて

New Relicは、SaaS型の性能監視サービスです。

・New Relic
https://newrelic.com/

少し古いですが、このブログでもNew Relicを紹介しました。

・性能監視サービスNew Relicについて
https://inaba-serverdesign.jp/blog/20130912/newrelic.html

New Relicは、サーバーにエージェントをインストールすることで自動的に監視データをNew Relicのサーバーに収集するので、簡単な設定で性能監視情報を可視化することができます。
Datadogや、はてなのMackerelと同様のサービスです。

isdNew Relic MySQL Pluginについて

New Relic MySQL Pluginは、DBサーバーに接続してSHOW STATUS, SHOW INNODB STATUS等のコマンドを発行してMySQLシステム情報を収集してNew Relic上にグラフ表示します。
Percona MySQL Monitoring Template for Cactiと同様のツールで、グラフ化する監視項目はこちらのほうが少ないですが、グラフはきれいで見やすいです。
監視データの保存期間(=参照期間)は、フリープランでは24時間、AWSパートナー向けフリープランでは72時間です。

なお、New Relic MySQL Pluginは、閾値を設定してそれを超えるとアラート通知するような機能はありません。

isdNew Relic MySQL Pluginのインストール

監視対象のRDS for MySQLにアクセス可能なEC2インスタンスに、New Relic MySQL Pluginをインストールします。
New Relic MySQL Pluginのインストール手順は、以下の記事がとても詳しく参考になります。

・New RelicでMySQLを詳細に監視する
https://qiita.com/kou/items/0370dde20b74f23709c1

この手順どおりでインストールできるはずですが、いくつか補足します。

New Relicのアカウント作成

AWSを利用している場合のNew Relicアカウント作成は、New Relicのトップページ
https://newrelic.com/

ではなく、以下のAWSパートナー向けページからSign Upすると、フリープランでも監視データの保存期間が72時間となるのでお得です。
https://newrelic.com/partner/aws

ただし、(たぶん)Sing Up時に登録したアドレスに届くメールから「Verify」しないと、監視データの保存期間が通常の24時間となってしまいます。

※「AWS利用」の判断をどのように行っているかは、僕の知る限り非公表なので、よくわかりません。

New Relic Platform Installer(npi)のインストール先指定

参考サイトの手順で、npiのインストール先については、
「デフォルトでは$HOMEにインストールされますが、PREFIXを指定することで任意のディレクトリにインストールすることができます。」
とありますが、具体的には、環境変数としてPREFIXをセットすればよいです。

例えば、/usr/local/newrelic-npi にインストールするのであれば、次のようにします。

 $ export PREFIX=/usr/local/newrelic-npi
 $ LICENSE_KEY=<YOUR_KEY_HERE> bash -c "$(curl -sSL https://download.newrelic.com/npi/release/install-npi-linux-redhat-x64.sh)"

設定ファイルplugin.json

New Relic MySQL Pluginの対話型インストール中に設定するplugin.jsonでは、hostとして、監視対象DBの接続先(=Amazon RDSであれば、RDS Endpoint)を指定します。

また、metricsはデフォルトで、statusとnewrelicが登録されていますが、innodb_statusを追加すると、History List LengthとInnoDB Checkpoint Ageのグラフが表示されるようになるのでおすすめです。

「innodb_mutexを追記するとプラグインのメモリ使用量が増える」とのことで、僕は追記したことはありません。
mutexの情報が必要なときのみ追記するとよいと思います。

(参考)
・newrelic_mysql_java_plugin/CATEGORIES.TXT
https://github.com/newrelic-platform/newrelic_mysql_java_plugin/blob/master/CATEGORIES.TX

{
  "agents": [
    {
      "name"    : "<監視画面上の表示名>",  // 監視画面上の表示名
      "host"    : "<RDS Endpoint>",   // 監視対象のサーバ名
      "metrics" : "status,newrelic,innodb_status",  // 監視対象メトリクス
      "user"    : "USER_NAME_HERE",   // 監視用のデータベース接続ユーザ名
      "passwd"  : "USER_PASSWD_HERE"  // 監視用ユーザのパスワード
    }
  ]
}

デーモン化

New Relic MySQL Pluginの対話型インストールの最後で、

Do you want to set this plugin as a background process? (y/n):

で、「y(プラグインをバックグラウンドプロセスとして設定する)」とすると、起動スクリプトが /etc/init.d/newrelic_plugin_com.newrelic.plugins.mysql.instance として設置されます。

 $ ls -l /etc/init.d/newrelic_plugin_com.newrelic.plugins
.mysql.instance
-rwxr-xr-x 1 root root 1942 Apr 15  2016 /etc/init.d/newrelic_plugin_com.newrelic.plugins.mysql.instance

また、自動起動設定も行われます。

 $ chkconfig --list newrelic_plugin_com.newrelic.plugins.mysql.instance
newrelic_plugin_com.newrelic.plugins.mysql.instance     0:off   1:off   2:off  3:off    4:off   5:off   6:off

ですので、少なくともRedHat系のサーバーでは、インストーラーの最後で「y」とすれば、起動スクリプトの設置や自動起動設定は不要です。

※古いバージョンでは、これらの自動設定が行われなかったのかもしれません。

なお、New Relic MySQL PluginはJava VMとして常駐し、メモリを80MB~100MB程度使用します。

isdNew Relic MySQL Pluginのグラフ表示項目

とあるWebサービスのグラフを示します。

Overview

  • SQL Volume: SQLクエリ数
  • Key Utilization
    • InnoDB Buffer Pool Hit Ratio: InnoDBバッファプールのヒット率
    • Connection Utilization: コネクション数と内訳
    • Tmp Tables Written To Disk: テンポラリテーブルのディスクへの書き込み発生率
    • Query Cache Memory in Use: クエリキャッシュメモリの使用量
    • Query Cache Hit Utilization: クエリキャッシュのヒット率


 

※クエリキャッシュを無効としています。

SQL Volumeでは、クエリ数と、全クエリのうち更新系が占める割合がわかります。
Tmp Tables Written To Diskが大きければ、クエリの改善を検討するほか、tmp_table_sizeとmax_heap_table_sizeパラメータを増やすと性能が改善されるかもしれません。
Query Cache Memory in UseとQuery Cache Hit Utilizationは、クエリキャッシュの有効/無効やクエリキャッシュサイズ(query_cache_size)の判断材料となるでしょう。

  • Database Connections: コネクション数
  • Network Traffic: ネットワークトラフィック


 

Query Analysis

  • SQL Commands: SQLコマンド数と内訳
  • Internal Temporary Tables: テンポラリテーブルの作成数と内訳
  • Slow Queries: スロークエリの発生数
  • Query Cache Usage: クエリキャッシュの利用数と内訳


 

Slow Queriesは、スロークエリログを有効(slow_query_log=ON)にする必要があります。

  • Select Query Types: Selectのクエリタイプ内訳
  • Table Locks: テーブルロック数
  • Sort Query Types: ソートクエリタイプ


 

Select Query TypesやSort Query Typesで、Scan(フルスキャン)に比べてRangeの割合が低いようであれば、インデックスの利用効率がよくないといえるでしょう。

InnoDB Metrics

  • Buffer Pool Page Operations: バッファプールの処理数と内訳
  • InnoDB Row Operations: 処理行数
  • Buffer Pool Pages Breakdown: バッファプールのページ割り当て量と内訳
  • InnoDB Log Writes: Redoログの書き込み量


 

クエリ数にもよりますが、InnoDB Row Operationsが多いと、検索の範囲を絞れていない=インデックスの利用効率がよくない可能性があります。
Buffer Pool Pages Breakdownで空きが少ないようであれば、innodb_buffer_pool_sizeパラメータを増やす必要があるでしょう。

  • File Syncs: fsyncの発生数
  • InnoDB Checkpoint Age: ディスクにフラッシュされていないデータサイズ
  • History List Length: ロールバックセグメントでまだパージされていないヒストリ数
  • InnoDB Internal Thread Queries: InnoDB内部クエリのステータス?


 

  • InnoDB Mutexes: Mutex(相互排他ロック)の情報

※プラグインの設定で、innodb_mutexを設定していないため、グラフはありません。

Replication

  • Replication Lag
  • Master Binary Log writes
  • Slave Relay Log Volume
  • Slave I/O Thread Lag
  • Slave Errors

※リードレプリカは使用していないため、レプリケーションのグラフはありません。

各項目の意味やグラフの見方、この結果を利用したチューニングについては、Infinite Loop技術ブログの以下の記事もとても参考になります。
Percona MySQL Monitoring Template for Cactiを利用した記事ですが、グラフ項目はわりと似ています。

・これだけ見れば大丈夫!ーMySQLパフォーマンス監視のツボ(クエリ編)
http://www.infiniteloop.co.jp/blog/2012/03/mysql-tuning-cacti-query/

・これだけ見れば大丈夫!ーMySQLパフォーマンス監視のツボ(システム編)
https://www.infiniteloop.co.jp/blog/2013/08/mysql-tuning-cacti-system/

isdまとめ

Amazon RDS for MySQLを監視するための、New Relic MySQL Pluginのインストールとグラフの表示項目についてまとめました。
システムの性能を改善するには、まずは監視ツール等を利用して、どの項目に特徴があるのか、1日のうちどの時間帯やどのタイミングで値が増減するのかなど、現状の把握・分析が必要となります。

サーバーにZabbixやCactiといった監視ツールをインストールするのは少し手間がかかりますが、New RelicやMackerel等のクラウド監視サービスやプラグインを使うとエージェントのインストールだけで手っ取り早くさまざまな情報を可視化できます。

より長いスパンで監視データを確認したい場合は、やはりZabbixやCactiといった監視ツールとMySQL監視プラグインを利用するとよいでしょう。

なお、RDS for AuroraでもNew Relic MySQL Pluginを試してみましたが、InnoDB Log Writesなど一部の項目は表示されませんが、ほとんどの項目は問題なく表示されました。

(関連記事)
・CactiでAmazon RDS for MySQLの性能監視
https://inaba-serverdesign.jp/blog/20160415/cacti_rds_mysql_plugin.html

・性能監視サービスNew Relicについて
https://inaba-serverdesign.jp/blog/20130912/newrelic.html

 

Follow me!