Hatena::ブログ(Diary)

(ひ)メモ このページをアンテナに追加 RSSフィード

2014-02-27 (Thu)

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は有益だと思います。

2014-02-24 (Mon)

2014-01-27 (Mon)

Perlでインストールされているモジュールを全部リストアップする

@ さんのこれ、

をベースにちょっと弄ってモジュールをリストアップするスクリプトを書いて使ってたんですが、core モジュールがリストアップされてなかったので、もろもろ対応したのを上げましたのでどうぞみなさまお使いくださいませ。

出力フォーマットは、バージョン固定な cpanfile と Perl のハッシュの2つです。

Carton使ってないけど、同じモジュール、同じバージョンのモジュールを一式、新環境にもりっとまるっと入れたい!とかってときに便利かと思います。

蛇足

perlとcore moduleのバージョンは、Module::CoreList に含まれる corelist コマンドで知ることができます。

### Perl 5.16.1に含まれるCarpモジュールのバージョンを調べる
$ corelist -v 5.16.1 Carp
Carp 1.26

### Perlに含まれるCarpモジュールのバージョンを、Perlのバージョンごとにリストアップする
$ corelist -a Carp
...
  v5.8.3     1.01
  v5.8.4     1.02
  v5.8.5     1.03
...

便利なので、最新のModule::CoreListを自分の環境に入れておくといいと思います。

あと、インストールされているPerlモジュールのバージョンやパスを知るには、このようなシェル関数を使うと便利です。

$ pmver Carp
1.26
/home/hirose31/perlbrew/perls/perl-5.16.3/lib/5.16.3/Carp.pm
 
$ pmver -cd Carp
1.26
/home/hirose31/perlbrew/perls/perl-5.16.3/lib/5.16.3/Carp.pm
$ pwd
/home/hirose31/perlbrew/perls/perl-5.16.3/lib/5.16.3

追記

pmtoolsという便利ツール詰め合わせがあるそうです!!

2003 | 11 | 12 |
2004 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 10 | 11 | 12 |
2005 | 01 | 02 | 03 | 05 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 12 |
2012 | 01 | 02 | 03 | 06 | 08 | 10 | 11 | 12 |
2013 | 01 | 02 | 03 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2014 | 01 | 02 | 03 | 04 |