Fluentdに負荷をかけたいなと思いまして・・。
前回作ったapache-loggenを使っても良いのですが、あれだと一度diskに出力する事になるし、Rubyなので複数コアがあるホストだと何プロセスも起動するのは嫌だなーと。
というわけで、今回はマルチプロセスで直接Fluentdにmsgpack形式のデータを投げるものを作ってみました。
in_forwardで受け付ける形式は何個かあるみたいですが、今回は以下の形式のものを。
[ tag, [time, rec], [time, rec], [time, rec], ... ]
rec = { ... }
実際の実行画面のキャプチャです。
なんか、ほとんどマスクしちゃってますね(´・ω・)
parallelでforkするので複数コアを活用します。情報はUNIXSocketで親プロセスへ集めて表示はCursesを使っています。それぞれの子プロセスの情報とそれぞれを集計した情報を出力しています。
灰色でマスクしているところには設定が表示されています。上記の画面では、毎秒10リクエスト、1リクエストで50レコード、つまり毎秒500レコード。それを4プロセスで送りつけているので、毎秒2000レコードの負荷をかけているものになります。全開でまわせば、L社の初期の流量くらいは出せると思います。
使い方はこんな感じ。
$ ruby load.rb --help Usage: load [options] --host 負荷をかけるFluentdのホスト名。 デフォルトはlocalhost。 --port 負荷をかけるFluentdのポート番号。デフォルトは24224。 --rate=RATE 1秒間に送信するリクエスト数。デフォルトは制限無し。 --num=NUM 1回のリクエストで送信するレコード数。デフォルトは1。 いわゆるArrayの要素数。 --thnum=THNUM 負荷をかけるプロセスの数。デフォルトは1。 --mode=MODE ログの形式を指定する。これは会社依存のオプションなので詳細は無し。 --fixed-time ダミーログの時間を元ファイルの時間のまま送る場合に指定する。 指定しなければ現在の時間に直して送信される。 (これも会社依存のオプション)
ログを生成する部分は apache-loggen を使って、apacheのログではなく アプリの実際のログを元に生成しています。なので、このままでは公開はできないのですが、ここを除去すれば問題ないので気が向いたらやろうかなと・・。
気が向いたら・・。