そーだいなるらくがき帳

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

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

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

qiita.com

soudai.hatenablog.com

それでは6日目は mackerel-plugin-memcached です。

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

memcachedはシンプルで且つ強力な分散型メモリキャッシュシステムです。 そんな高負荷を捌くために色んなサービスで使われているmemcached専用のpluginです。

github.com

インストールと設定手順

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

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

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

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

-- /usr/bin はPATHが通っているので省略出来ます
# mackerel-plugin-memcached
memcached.cachesize.limit_maxbytes      67108864        1512365266
memcached.cachesize.bytes       226     1512365266
memcached.items.curr_items      3       1512365266
memcached.items.new_items       0       1512365266
memcached.cmd.cmd_get   0       1512365266
memcached.cmd.cmd_set   0       1512365266
memcached.cmd.cmd_flush 0       1512365266
memcached.cmd.cmd_touch 0       1512365266
memcached.evictions.evictions   0       1512365266
memcached.evictions.nonzero_evictions   0       1512365266
memcached.evictions.reclaimed   0       1512365266
memcached.rusage.rusage_user    0       1512365266
memcached.rusage.rusage_system  0       1512365266
memcached.bytes.bytes_read      570     1512365266
memcached.bytes.bytes_written   39450   1512365266
memcached.connections.curr_connections  10      1512365266
memcached.hitmiss.get_hits      0       1512365266
memcached.hitmiss.get_misses    0       1512365266
memcached.hitmiss.delete_hits   0       1512365266
memcached.hitmiss.delete_misses 0       1512365266
memcached.hitmiss.incr_hits     0       1512365266
memcached.hitmiss.incr_misses   0       1512365266
memcached.hitmiss.cas_hits      0       1512365266
memcached.hitmiss.cas_misses    0       1512365266
memcached.hitmiss.touch_hits    0       1512365266
memcached.hitmiss.touch_misses  0       1512365266
memcached.unfetched.expired_unfetched   0       1512365266
memcached.unfetched.evicted_unfetched   0       1512365266

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

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

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

見れるメトリック

statsで見れる情報についてはmemcachedの公式ドキュメントに纏まっています。 詳細は下記の公式ドキュメントの Statistics にあります。

memcached/protocol.txt at master · memcached/memcached · GitHub

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

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

memcached Connections

メトリック名(ラベル) プラグインの出力名 diff 説明
Connections memcached.connections.curr_connections オープンな接続数

その名の通り、現在の接続数です。 接続数を監視するのはどのミドルウェアでも定跡ですね。

memcached Command

メトリック名(ラベル) プラグインの出力名 diff 説明
Get memcached.cmd.cmd_get 1分間あたりのgetを実行した回数
Set memcached.cmd.cmd_set 1分間あたりのsetを実行した回数
Flush memcached.cmd.cmd_flush 1分間あたりのflushを実行した回数
Touch memcached.cmd.cmd_touch 1分間あたりのtouchを実行した回数

こちらは実行された回数です。 元となる cmd_xxx は総回数ですがプラグイン側で1分あたりの差分値を計算しています。 勿論、getset は負荷の指標に効いてきますが flushtouch も重要な値です。 自分の意図した動作をしているかどうかを定期的に観測しましょう。

memcached Hits/Misses

メトリック名(ラベル) プラグインの出力名 diff 説明
Get Hits memcached.hitmiss.get_hits 1分間あたりの GETコマンドの成功回数
Get Misses memcached.hitmiss.get_misses 1分間あたりのGETコマンドが失敗回数
Delete Hits memcached.hitmiss.delete_hits 1分間あたりのDELETEコマンドが成功回数
Delete Misses memcached.hitmiss.delete_misses 1分間あたりのDELETEコマンドが失敗回数
Incr Hits memcached.hitmiss.incr_hits 1分間あたりのINCRコマンドがキーに成功回数
Incr Misses memcached.hitmiss.incr_misses 1分間あたりのINCRコマンドが失敗回数
Cas Hits memcached.hitmiss.cas_hits 1分間あたりのDECRコマンドがキーに成功回数
Cas Misses memcached.hitmiss.cas_misses 1分間あたりのDECRコマンドが失敗回数
Touch Hits memcached.hitmiss.touch_hits 1分間あたりのTOUCHコマンドがキーに成功回数
Touch Misses memcached.hitmiss.touch_misses 1分間あたりのTOUCHコマンドが失敗回数

こちらは実行したコマンドの成否の回数です。 Missが多くなればおかしいな?とわかります。 Command は総数なので成否関係なく合計数ですが急に増えた場合などは Hits/Misses を確認してみるのもいいでしょう。

memcached Evictions

メトリック名(ラベル) プラグインの出力名 diff 説明
Evictions memcached.evictions.evictions 1分間あたりのexpireしてないのに消された数。但しexpire設定されてないもの(無期限のもの)含む
Nonzero Evictions memcached.evictions.nonzero_evictions 1分間あたりのexpire設定されてるのに、expireより前に消された数
Reclaimed memcached.evictions.reclaimed 1分間あたりのexpireしたもので実際に消された数

ここではmemcached内のitemがどのように変化しているかを見ることができます。これによって削除されたアイテムがどのようなアイテムなのかが分かります。 またreclaimednonzero_eviction が見れるのようなったのはわりと最近なので古いプラグインをお使いの方は表示されていないかもしれません。 是非この機会にアップデートしてみてください。

mackerel-agent-plugins などをアップデートしました ほか - Mackerel ブログ #mackerelio

memcached Unfetched

メトリック名(ラベル) プラグインの出力名 diff 説明
Expired unfetched memcached.unfetched.expired_unfetched 1分間あたりの期限切れになる前に設定されてから全くタッチされずにLRUにより排除されたの数
Evicted unfetched memcached.unfetched.evicted_unfetched 1分間あたりの設定されてから全くタッチされずにLRUにより排除された数

小難しい説明になっておりますが get/incr/append/etc されてないitemがLeast Recently Used(LRU:最近最も使われていないデータを最初に捨てる)によってキャッシュから追い出されている回数の可視化です。 本来の Setはされているけど利用しないitemは当然無駄ですので効率よくmemcachedを使えているかの指標になります。

memcached Resouce Usage

メトリック名(ラベル) プラグインの出力名 diff 説明
User memcached.rusage.rusage_user 1分間あたりのプロセスがユーザモードで動作した時間(マイクロ秒)
System memcached.rusage.rusage_system 1分間あたりのプロセスがカーネルモードで動作した時間(マイクロ秒)

memcachedrusage_userrusage_system は一般的なCPUリソースの見方と同じです。 つまりユーザーランドで計算しているところとシステムコール呼び出されてカーネルが時間を使っているところでそれぞれどれくらいCPU時間を取っているかがわかります。 つまりそのため一般的にプロセス上で計算したりするところががユーザーランド、メモリの確保とかネットワーク処理はカーネル側ですからmemcachedのCPUが高くなったときにこちらを見てみるとどちらに負荷が掛かっているか切り分けできるようになります。

memcached Traffics

メトリック名(ラベル) プラグインの出力名 diff 説明
Read memcached.bytes.bytes_read 1分間あたりのネットワークから受信したバイト数
Write memcached.bytes.bytes_written 1分間あたりのネットワークへ送信したバイト数

こちらはmemcachedトラフィックの可視化です。 名前もわかりやすくRead/Writeになっています。

memcached Cache Size

メトリック名(ラベル) プラグインの出力名 diff 説明
Total memcached.cachesize.limit_maxbytes memcacheの最大メモリ量(バイト)
Used memcached.cachesize.bytes 現在の使用中のメモリ量(バイト)

memcachedといえばインメモリな分散型キャッシュシステムですからメモリの状態を知ることは大切です。 例えば UsedTotal に近い値の時、memcachedはメモリを確保するためにLRUで不要なデータを開放していきます。 そこで Evictions を見ましょう。 この値が増えていればメモリ不足です。 スケールアップまたは使い方の見直しを検討する必要があります。

memcached Items

メトリック名(ラベル) プラグインの出力名 diff 説明
Current Items memcached.items.curr_items 現在のアイテム数
New Items memcached.items.new_items 1分間に追加されたアイテム数

こちらはmemcachedのアイテムを可視化しています。 New Itemsプラグイン側で total_items を元に1分間の差分値を計算しています。 このように今の総アイテム数と増減を知ることでmemcachedの振る舞いを予測できます。 例えば先程のように Evictions が増えるようなメモリ不足状態の場合に New Items が更に右肩上がりに増えている場合は単純にスケールアップしても問題の先送りにしかならないかもしれません。 このように複数の値と併せてmemcachedの振る舞いを予測していきましょう。

6日目は広く使われているmemcachedプラグインについての説明でした。 明日はCheckプラグインの主役と言えるでしょう。 check-logです。 引き続き、Mackerel プラグインアドベントカレンダーをお楽しみに!

7日目 check-log