Redisのクエリーアナライザー "redis-traffic-stats" を書きました
redis-traffic-stats という Redis のクエリーアナライザーを作りました。
redis-traffic-statsはtcpdump -wで書き出したpcapデータを解析して、以下のような統計を表示します。
- 総ネットワークトラフィック量と平均byte/sec
- 総リクエスト数と平均とピークのreq/sec
- コマンド毎のリクエスト数、総リクエスト数に占める割合、req/secを、リクエスト数が多い順に上位10コマンドを表示
- コマンド毎の総転送バイト数、byte/secを、総転送バイト数が多い順に上位10コマンドを表示
- コマンド別に、キー毎の総転送バイト数、byte/sec、リクエスト数、リクエスト数の割合、req/secを、総転送バイト数が多い順に上位10キーを表示
- 時間のかかったリクエストのワースト20
解析結果はそのままでも読めますが、GitHub Flavored Markdownなので、gistとかにコピペすると整形したのが見られます。
サンプルはこちら→ https://gist.github.com/hirose31/9207096
類似ツールとの比較
類似のRedisのクエリアナライザーには、Instagramが作った redis-faniaや、GUIのRedisLive があります。
これらのツールはRedisのMONITORコマンドを使ってデータを収集していますが、redis-traffic-statsはMONITORコマンドではなく、pcapデータをデータソースとして使っています。
pcapデータを使う利点は以下の2つです。
- 性能劣化がない
- http://redis.io/commands/monitor によれば、MONITORコマンド実行中は50%程度、性能劣化するようです
- 転送量の統計値がとれる
- MONITORコマンドではレスポンスを知ることができないので、転送量がとれません
さっそく、使ってみる
詳しくは https://github.com/hirose31/redis-traffic-stats を参照ください。ここではざっくり書きます。
redis-traffic-statsはPerlで書かれていて、CPANからインストールできます。
cpanm App::redis_traffic_stats
でインストールしてください。必ずしも、Redisが動いているサーバーにredis-traffic-statsを入れる必要はないです。
redis-traffic-statsが使っているNet::Pcapがlibpcap.soを要求するので、rpmだとlibpcap-develを予めインストールしておく必要があります。
redis-server が動いているマシンで、pcapデータを採取します。
tcpdump -s 65535 tcp port 6379 -w redis.pcap -i eth0 (しばらくしたら ^C で終了する)
- -iのデバイス名は、bond0などに適宜書き換えてください。
- -c 10000と指定して、10000パケット採取したら終了するようにしてもよいでしょう。
データが採取できたら、redis-traffic-statsをインストールしたマシンにpcapデータファイルを持ってきて解析します。
redis-traffic-stats -r redis.pcap
redis-traffic-statsに-rを指定しなければ、redis-traffic-statsがtcpdumpを実行してpcapデータを採取し、それを元に解析することもできます。
おわりに
運用するにあたり、例えば CloudForecastのRedisのグラフ のような、定常的なリソースモニタリングはもちろん必要ですが、突発的に謎い感じでRedisのトラフィックが跳ねてる最中に、どんなコマンドのどんなキーがトラフィックを食っているか確認するのにこのredis-traffic-statsは有益だと思います。