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や、GUIRedisLive があります。

これらのツールはRedisのMONITORコマンドを使ってデータを収集していますが、redis-traffic-statsはMONITORコマンドではなく、pcapデータをデータソースとして使っています。

pcapデータを使う利点は以下の2つです。

  • 性能劣化がない
  • 転送量の統計値がとれる
    • 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は有益だと思います。