この記事は Mackerel プラグインアドベントカレンダー(全部CRE) の6日目です。
それでは6日目は mackerel-plugin-memcached
です。
ここではmemcachedの細かい説明は割愛します。
memcachedはシンプルで且つ強力な分散型メモリキャッシュシステムです。 そんな高負荷を捌くために色んなサービスで使われているmemcached専用のpluginです。
インストールと設定手順
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分あたりの差分値を計算しています。
勿論、get
や set
は負荷の指標に効いてきますが flush
や touch
も重要な値です。
自分の意図した動作をしているかどうかを定期的に観測しましょう。
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がどのように変化しているかを見ることができます。これによって削除されたアイテムがどのようなアイテムなのかが分かります。
またreclaimed
と nonzero_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分間あたりのプロセスがカーネルモードで動作した時間(マイクロ秒) |
memcachedの rusage_user
と rusage_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といえばインメモリな分散型キャッシュシステムですからメモリの状態を知ることは大切です。
例えば Used
が Total
に近い値の時、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 プラグインアドベントカレンダーをお楽しみに!