redis-trafic-stats
-
Redisのクエリーアナライザー "redis-traffic-stats" を書きました
http://d.hatena.ne.jp/hirose31/20140227/1393470729 -
redis-traffic-stats
https://github.com/hirose31/redis-traffic-stats
keyやcommandごとの発行数、データの転送量合計がわかる。
redis-fainaに比べて転送量がわかるのがポイント。
monitorによる劣化もないので普段のデータを気軽に集めておくのにとてもよい。
基本
redisへ接続するclient上で実行する。 -pオプションで指定するportは宛先である(default:6379)。
# tcpdumpを直接行ったあと分析
## 30秒間
./redis-traffic-stats -t 30 -p 6379
## 1000パケット
./redis-traffic-stats -c 1000 -p 6379
# 別途実行したtcpdumpのpcapファイルを分析
redis-traffic-stats -r output.pcap -p 6379
pcapファイルの分析時も想定するport番号の指定は必須。
※(追記)redis上でできないと勝手に思ってましたけど普通に出来ました。
エラー
## Summary
* Duration:
* 2038-01-19 12:14:08 - 1970-01-01 09:00:00 (1s)
* Total Traffic:
* 0 bytes (0.00 bytes/sec)
* Total Requests:
* 0 requests (Avg 0.00 req/sec, Peak 0.00 req/sec)
直接・ファイル読み込みいずれの場合でも、このように分析データが空表示される場合、tcpdumpのオプションか分析したいポート番号の指定が間違っている(ストリーム中にredisのパケットがない)。
tcpdump
細かい分析にはtcpdumpを直接取得した後分析した方が便利です。
- X分ごとに分析
- 複数のredisをport番号で使い分けている場合
後者の場合は、複数port宛のデータを含む1つのpcapファイルをportごとに複数回分析すればよい。データの取得は1度で済む。
# 基本
tcpdump -s 65535 tcp port 6379 -w redis.pcap -i eth0
## 1000パケット
tcpdump -s 65535 tcp port 6379 -w redis.pcap -i eth0 -c 1000
# portrangeオプション
tcpdump -s 65535 tcp portrange 6379-6380 -w redis.pcap -i eth0 -c 1000
# 想定ホスト同士の通信に絞る等
tcpdump -s 65535 "tcp port 6379 and (src and dst net 192.168.0.0/16)" -w redis.pcap -i eth0 -c 1000
一定時間ごとにdump/指定回数rotateする(-G/-W)
# 60秒 * 5回 rotateし、%Y%m%d-%H%M形式で保存。
tcpdump -s 65535 tcp port 6379 -w redis.pcap -i eth0 -G 60 -W 5 -w redis_%Y%m%d-%H%M.pcap
rotate後のファイル保存先がtmpでない場合、書き込み権限が問題になることがある。777またはtcpdumpユーザーを書き込み可能にするか、-Zオプションでrootを指定する。
# 書き込み時のユーザーをrootにする(権限を降格しない)
tcpdump -Z root -s 65535 tcp port 6379 -w redis.pcap -i eth0 -G 60 -W 5 -w redis_%Y%m%d-%H%M.pcap
postrotate コマンド実行(-z)
本来圧縮するためのオプションだが、redis-traffic-statsを含むスクリプトに引き渡したりも出来る。
# 圧縮
tcpdump -s 65535 tcp 6379 -i bond0 -G 60 -W 5 -w redis_%Y%m%d-%H%M.pcap -z gzip
# 指定コマンドへ引き渡し
tcpdump -Z root -s 65535 tcp 6379 -i bond0 -G 60 -W 5 -w redis_%Y%m%d-%H%M.pcap -z /usr/local/bin/redis-analyse.sh
コマンドが実行されるユーザーも-Zのオプションが引き継がれる。
分割したdumpファイルの再結合(mergecap)
rotateで分割して保存しておいたpcapファイルを結合してから改めて分析してもいい。
# install
yum install wireshark
# 結合
mergecap -F modlibpcap -w output.pcap in_cap1.pcap in_cap2.pcap in_cap3.pcap...
※redis-traffic-statsで分析したい場合、output formatにmodlibpcapを指定すること
tcpdump + redis-traffic-stats
運用時のメモ
- tcpdumpでrotateする場合、条件に該当するpacketが発生していないとrotateのタイミングが想定通りにならないことがある。
- 複数のclient host上から取得したpcapデータをすべてmergecapして分析することも可能。
- redis-traffic-statsのslowコマンド実行時間はpcapからの値なので、アプリがauth->set->get->quitなどを一つのセッションで行う場合合計値が表示される。
- 実際に問題のあるクエリを解析する場面ではmonitorログでkeyと突き合わせる等の確認が必要。同じ時間帯でredis-traffic-stats/monitorそれぞれデータを取得し、redis-fainaと適宜使い分ければよい
参考リンク
-
tcpdump コマンドの使いかたをまとめてみた
http://blog.livedoor.jp/sonots/archives/18239717.html -
tcpdumpについて知らない可能性のあるトップ10
http://uni-id.nri.co.jp/ncsirt/2010/0609.html