たごもりすメモ

コードとかその他の話とか。

Fluentd w/ Ruby 2.0.0-p0 のメモリ使用量 (追記: w/ msgpack v0.5.4)

いくつかFluentdのベンチマークをとらないとなー、そういえばRuby 2.0.0-p0も出ましたね、ということでベンチマーク取ろうと思ってあれこれ作業してたらなんか変なのを見付けたのでとりあえず記録。
なおベンチマークの結果については、いろいろ取りかたを考え直す必要があるのでまたこんど。

概要

Fluentd の動作環境が Ruby 2.0.0-p0 with jemalloc なケースで Ruby 1.9.3-p392 に較べて大幅に大幅にメモリを食う上、負荷を停止した時にも何かよくわからない挙動を示す。
jemalloc を使わないケースだと 1.9.3 とほとんど変わらないと思われる挙動で jemalloc の必要性が無くなったとかいうわけではない。

詳細

ベンチマークは あるサーバ(4core HT, 16GB RAM)に立てた Fluentd に対し、別のサーバ(同一サブネット、同一スイッチ下)からメッセージを大量に継続的に送り、それを送り返させる、という形で行った。また送り返す他に fluent-plugin-flowcounter により処理したメッセージのカウントも行っていた。

ソフトウェア構成は基本的に以下の通り。

  • CentOS 6.4 x86_64
  • fluentd 0.10.32
  • msgpack 0.4.7
  • jemalloc (gem) 0.1.9
  • Ruby
    • 1.9.3-p392
    • 2.0.0-p0

Ruby 1.9.3-p392 と Ruby 2.0.0-p0 を比較してベンチマークを走らせてみたときのネットワークトラフィックが以下の通り。
23時過ぎから2時過ぎまでが 1.9.3-p392 のfluentdプロセスへの負荷で、2時過ぎから5時過ぎまでが 2.0.0-p0 のfluentdプロセスへの負荷。ベンチマークなので、それぞれで段階的に負荷を高くしていったと思いねえ。両方に同じだけの負荷をかけている。

で、この時間帯のリソースモニタ(CloudForecast)の CPU usage / Load average / Memory usage のグラフがこちら。

CPUとLoadはまあいいでしょ。
問題なのがメモリ。1.9.3-p392 が動いてる間はほとんど動きがないんだが、2.0.0-p0 が働きはじめた瞬間の2時過ぎからメモリ使用率が暴れはじめてる。
更におかしいことに、負荷を停止した5時過ぎからプロセスが謎の膨張をはじめ、約1時間半後におさまってる。このときの ruby 2.0.0-p0 (fluentd) のプロセスのRSSたるや実に7.6GB。うーん、なんだこれ。

jemallocを疑う

ruby 2.0.0 ではGCに変更があったのは知っているので、そこが jemalloc とはうまく動かないようになってるのかなー。ということでjemallocを外してみたらこんなんなった。


だめそう。ていうかこれは 1.9.3 without jemalloc のときの結果といっしょですね。以下のエントリ参照。

続 #fluentd の性能・リソースに関する最近のいくつかの傾向の話 - tagomorisのメモ置き場

ということでjemalloc様のお世話にならなくて済むわけではないようだ。

MessagePackを疑う

MessagePackの新しいバージョンを使えば良くなるかも!と開発者が言うので、Fluentdの依存関係をゴニョゴニョしながら入れて ruby 2.0.0-p0 上で起動するようにしてみた。*1

  • fluentd 0.10.32
  • msgpack 0.5.3
  • ruby 2.0.0-p0

結果: 動きませんでした

https://gist.github.com/tagomoris/5167730

うーん。これはちょっと継続して調査。

追記(3/16): msgpack v0.5.4

@frsyuki が動かない原因を修正した msgpack v0.5.4 をさくっと上げてくれたので以下のふたつで再度試したら、なんとメモリ使用量がまったく増えなくなりましたよ。スゴイ!

  1. fluentd 0.10.32 + jemalloc + msgpack 0.5.4 + ruby 2.0.0-p0
  2. fluentd 0.10.32 + msgpack 0.5.4 + ruby 2.0.0-p0




メモリ使用量がぜんぜん上がらなくなった。スバラシイ!


この状況についてなにか知見をお持ちのかたはいらっしゃいませんでしょうか。

bugs.ruby-lang.org に登録すると良いというアドバイスもいただきましたが正直この状況だとなあ。rubyプロセスのメモリまわりの状態について、これこれこういう情報をとった上で bug 登録するといいよ! という話をいただけますと幸いです。

どうしますかねー。msgpack 0.4 -> msgpack 0.5 への内部実装の変更ってだいぶ大きいはずだから依存をいっきに上げるのも怖い気がしますが、自分としては上げてほしいなあ。
とりあえずこのベンチ的なのを3日くらい動かして、それで安定してたら fluentd の依存を msgpack 0.5.4 以上にしちゃうとかどうですかね。だめ?

*1:Fluentd の依存は msgpack ~> 0.4.4 なのであれこれ無理矢理変更しない限り 0.5.x は現状のfluentdといっしょには入らない