たごもりすメモ

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

#fluentd の性能・リソースに関する最近のいくつかの傾向の話

いくつかそれぞれ違う内容のことについて書きます。また複数の変更をほぼ同時期にやったケースもあり「お前それ分けてやれよ」と言いたくものがあるかもしれません。いや分かってはいるんだけど、そうそう変更ばっかりもしてられないからまとめてやりたいじゃんよ。

前提ですが、今回出てくるサーバはすべて、fluentdのみを8プロセスずつ起動している物理サーバです。fluentd meetupのときに「deliverサーバ」として紹介したやつ。各Webサーバからログを受け、アーカイブサーバにscribeプロトコルで送ると同時にロードバランスしてログ変換サーバに forward で送る配送サーバ。out_forwardのインスタンスが57あります。

ruby 1.9.2 -> 1.9.3 にした

前々から全くトラフィックの流れていないスタンバイ用のサーバでもメモリの使用量が徐々に上がっていって定期的な再起動が必要、という症状に見舞われて悲しい思いをしていたのだが、ruby 1.9.3(-p125) にバージョンを上げてみたところ、これがぴたりと収まった。

バージョン変更は "Week 11" の真ん中のあたり。メモリ使用量がずっと増えてたグラフだった(再起動したところでいったん減って、また増えていた)のが、それ以降まったく増えなくなっていることがわかる。また load average も上がったり下がったりを繰り返していてGCかなーと思っていたのだが、それが目に見えて緩和された。グラフは省略するが、CPU使用率もメモリと同様に上がっていく症状を見せていたのが、メモリと同じように低いままとなった。

いっぽう、そこそこトラフィックの出ている(ピーク inbound 60Mbpsくらい)ほうのサーバ*1でもメモリ使用量が増えていく症状は出ていたのだが、こっちも改善した、のかな? というように見える。load(やCPU使用率)については目立った変化はなかった。うーん。


ものすごく適当に言うと ruby 1.9.3-p125 にしたらメモリまわりが改善されたのかな、と言える、かもしれない。少なくともこのあたりのサーバについて、定期的に再起動しないといけなかった事情は改善された。

scribeline -> fluent-agent-lite にした

deliverサーバのうち特にトラフィックの多いものは別サーバに隔離してるんだけど、こいつがCPUでいっぱいいっぱいになって詰まってた。だいたいピークで inbound 70Mbps くらい、35k msg/sec のところ。
で、これを解消するために fluent-agent-lite を書いたので、scribeline で転送していたログを全部止めて fluent-agent-lite で転送するようにしてみた。そのついでに ruby 1.9.3-p125 に上げた。ら、だいぶ面倒なことになった……。

まず良かった方から。CPU使用率が劇的に下がった。60%くらい使ってた時間帯のCPU使用率が20%を下回るように。これに伴い、完全に頭打ちになっていた時間帯のトラフィックが実に素直な曲線を描くようになり、ボトルネックが見事に解消された。loadも激減。



これに伴い、fluentdクラスタ全体による秒間処理メッセージ数の最大値が 67k msg/sec を記録いたしました。

ここまではいいんだけど、メモリ使用状況がひどいことになった。このサーバも他の2台と同様に長期にわたってメモリ使用量が徐々に増える、という症状に見舞われていたんだけど、fluent-agent-lite による接続に切り替えたのと同時に ruby 1.9.3-p125 にしたら、どっちが根本原因なものか、1日でメモリを使い尽くすようになってしまった。

正直言ってけっこう困ってる。日に1度の再起動をcrontabに入れるかどうか考え中。いやだなあ。他のサーバのログ転送も fluent-agent-lite にこれから変更するので、そこで他のサーバにも違いが出てくるかどうか注視するつもり。結果が出たら追記します。

(追記) やっぱり in_scribe から in_forward に変えたのが直接の契機らしい

全サーバのログ転送を fluent-agent-lite にした、つまりfluentdがログを受け取る source を in_scribe から in_forward にした。ら、案の定CPU使用率は半分以下になったがメモリ使用率が爆上げ。(in_forwardの設定は元々してあってデータを流しはじめただけなので、今回は fluentd は再起動していない。)

困ったなー。とりあえず日に一度 fluentd を再起動するつもり。

*1:このサーバについては、まだ後述の fluent-agent-lite での転送には切り替えていない