そーだいなるらくがき帳

そーだいが自由気侭に更新します。

Redisの監視 ~ mackerel-plugin-redisを読み解く

この記事は Mackerel プラグインアドベントカレンダー(全部CRE) の5日目です。

qiita.com

soudai.hatenablog.com

それでは5日目は mackerel-plugin-redis です。

ここではRedisの細かい説明は割愛します。

Redisは高速な動作が強みのインメモリデータベースです。 KVSの選択肢として最近は使うのが当たり前になってきたRedis専用のpluginです。

github.com

インストールと設定手順

RedisのプラグインはRedisコマンドである INFO の結果を可視化してくれるプラグインです。

プラグインプラグイン集として提供しているパッケージの mackerel-agent-plugins に含まれています。 インストール先は /usr/bin/mackerel-plugin-redis です。

次にMackerelのプラグインはコマンドですので実行する事ができます。

※/usr/bin はPATHが通っているので省略出来ます

-- /usr/bin はPATHが通っているので省略出来ます
# mackerel-plugin-redis
redis.keys.keys 0.000000        1512270527
redis.keys.expires      0.000000        1512270527
redis.keys.expired      0.000000        1512270527
redis.keyspace.keyspace_hits    0.000000        1512270527
redis.keyspace.keyspace_misses  0.000000        1512270527
redis.memory.used_memory        819400.000000   1512270527
redis.memory.used_memory_rss    2859008.000000  1512270527
redis.memory.used_memory_peak   820424.000000   1512270527
redis.memory.used_memory_lua    37888.000000    1512270527
redis.capacity.percentage_of_memory     0.000000        1512270527
redis.capacity.percentage_of_clients    0.010000        1512270527
redis.queries.total_commands_processed  90.000000       1512270527
redis.connections.total_connections_received    30.000000       1512270527
redis.connections.rejected_connections  0.000000        1512270527
redis.clients.connected_clients 1.000000        1512270527
redis.clients.blocked_clients   0.000000        1512270527
redis.clients.connected_slaves  0.000000        1512270527

設定ファイルであるmackerel-agent.confは標準では /etc/mackerel-agent/mackerel-agent.conf にインストールされます。 こちらに下記のとおり追記しましょう。

[plugin.metrics.redis]
command = "mackerel-plugin-redis"

以上を行った上でmackerel-agentを再起動してください。

見れるメトリック

INFOで見れる情報についてはRedisの公式ドキュメントに纏まっています。

INFO – Redis

ですがもう少し具体的に見ていきましょう。

各グラフ定義ごとに説明します。 また表に出てくるdiffとはプラグイン上で差分値計算をするかどうかです。 となっている項目はプラグインで前回の実行時の値と差分値計算して出力しています。

Redis Queries

メトリック名(ラベル) プラグインの出力名 diff 説明
Queries redis.queries.total_commands_processed 1分間あたりのサーバーによって処理されたコマンドの実行数

こちらは名の通りRedisで実行されたクエリ(コマンド)の数です。 total_commands_processed 自体は起動してからの総数なのでプラグイン側で差分値を計算して1分当たりの値にしています。 これによりRedisへのクエリの発行状態がわかるのでどの時間にピークが来ているかなども一目瞭然です。 こちらは監視するというよりは日常的に見てRedisの状況を確認するための値です。

Redis Connections

メトリック名(ラベル) プラグインの出力名 diff 説明
Connections redis.connections.total_connections_received 1分間あたりのサーバーが受け入れた接続数
Rejected Connections redis.connections.rejected_connections 1分間あたりmaxclients制限のために拒否された接続数

アクセス数が増えれば当然クエリも多くなりますし、負荷も増えます。 Redisの負荷が高いときはQueriesと併せて比べて、接続数が多いのか、1接続あたりの実行クエリ数が多いのか判断しましょう。 後述の Redis Capacity があるのでこちらは監視するというよりは日常的に見てRedisの状況を確認するための値です。

Redis Clients

メトリック名(ラベル) プラグインの出力名 diff 説明
Connected Clients redis.clients.connected_clients クライアント接続の数(スレーブからの接続を除く)
Blocked Clients redis.clients.blocked_clients ブロッキングコールで保留中のクライアントの数(BLPOP、BRPOP、BRPOPLPUSH)
Connected Slaves redis.clients.connected_slaves 接続されているスレーブの数

その名の通り、今の接続状況です。 Redis Connectionsは総数なのでその中身を詳しく分類した形になります。

Redis Keys

メトリック名(ラベル) プラグインの出力名 diff 説明
keys redis.keys.keys 登録されているkey数
expires redis.keys.expires 有効期限が設定されているkey数
expired redis.keys.expired 有効期限になり、失効したkey数

こちらはRedisに登録されているKeyの状態と数を可視化しています。 Redisのいいところの1つKeyに有効期限を決めれることです。 私はセッションストレージとしてRedisを選ぶ事が多く、その場合に expiresexpired が可視化されるのは嬉しいですね。

Redis Keyspace

メトリック名(ラベル) プラグインの出力名 diff 説明
Keyspace Hits redis.keyspace.keyspace_hits 1分間あたりのKeyに対する検索の成功回数
Keyspace Missed redis.keyspace.keyspace_misses 1分間あたりのKeyに対する検索の失敗回数

こちらは検索の成否を可視化してくれています。 Keyspace Missed が多いとおかしいぞ、というのが一目瞭然です。 特にKeyに有効期限を付けている場合などは特に気にして振り返るようにしましょう。

Redis Memory

メトリック名(ラベル) プラグインの出力名 diff 説明
Used Memory redis.memory.used_memory 1分間あたりのRedisによって割り当てられた総メモリ利用量(バイト単位)
Used Memory RSS redis.memory.used_memory_rss 1分間あたりのOSから見たときのRedisによって割り当てられたメモリ利用量(バイト単位)
Used Memory Peak redis.memory.used_memory_peak Redisが消費する最大メモリ利用量(バイト単位)
Used Memory Lua engine redis.memory.used_memory_lua Luaのエンジンが使用するメモリ利用量(バイト単位)

Redisはインメモリデータベースですからメモリを如何に使っているかはとても大切です。 Redisが消費するメモリの内訳や状況を知っておくことでRedisの振る舞いを予測していくことができます。

Redis Capacity

メトリック名(ラベル) プラグインの出力名 diff 説明
Percentage of memory redis.capacity.percentage_of_memory メモリ利用量 / 最大メモリ利用量の割合
Percentage of clients redis.capacity.percentage_of_clients 接続数 / 最大接続数の割合

以下の式で計算されています。

Percentage of memory = 100.0 * used_memory / maxmemory
Percentage of clients = 100.0 * connected_clients / maxclients

最大メモリ利用量である maxmemory はデフォルトは0(制限なし)となっています。 例えばRedisをWebサーバと同居させていて、ある程度制限したい場合などはmaxmemoryを指定すると思いますし、その場合に Percentage of memory は重要な指標になります。 またRedisがどんどん肥大化するような状態の場合にRedisがMemoryを全て使い切らないようにlimitを書ける場合もありえますし、その場合も同じく重要な指標になります。

Percentage of clientsは最大接続数に対する現在の利用率ですが最大接続数を超えると底から先はコネクションエラーになるので監視するようにしましょう。 まずは8割程度を閾値に設定するのがよいと思います。 ちなみにmaxclientsのデフォルトは10000です。

5日目はインメモリデータベースのRedisのプラグインについての説明でした。 明日はインメモリと言えばこちら、memcachedです。 引き続き、Mackerel プラグインアドベントカレンダーをお楽しみに!

6日目 mackerel-plugin-memcached