読者です 読者をやめる 読者になる 読者になる

fluentdのちょっとしたチューニングの代理の報告

fluentd Hadoop

はじめに

色々、テストをしてみてる結果をまとめてみた。
検証は、自分がやっている訳ではないので、検証結果からのまとめ。

あと、公開出来ない部分もあったるするので、若干、整理しきれてないけど
その辺は、また、修正出来るかな。

以下の感じで繋がっている。

td-agent --> td-agent 
                        out_webhdfs ---> HDFS
                        ZeroMQ_pub  ---> Subscriber

ここまでのチューニングで、上記の2つのPluginが、ボトルネックになるという事がわかった。

ZeroMQ_pubは、Aggregatorに仕込んであり、情報が見たい時に、自由に件数などを見れる様にしているらしい。

ということで、以下、チューニング。

チューニング

zmq_pubについて

zmq_pubは単一スレッドで動いている。その場合、fluentdがflushできるのは1秒間に1チャンクのみ。
従って、デフォルトのbuffer_chunk_limit 8mで、1KBのメッセージを送った場合、8MB/1KB=8000msg/secが限界となる.
実際には、flush_interval 1sによりチャンク一杯にならずに送られるケースもあるので、限界はこれより小さくなる.

そこで、スループットを上げるためにチャンクのサイズを24Mまで増やし、以下の設定とした。

    <store>
        type zmq_pub
        pubkey ${tag}
        bindaddr tcp://*:5556
        buffer_chunk_limit 24m
        flush_interval 1s
    </store>
HDFSへの格納について

HDFS格納用fluentdでは、以下のような送信エラーが多発しており、これがスループットを落としたり、キューにデータが溜まる原因となっていた。

 [warn]: fluent/output.rb:337:rescue in try_flush: temporarily failed to flush the buffer. next_retry=xxx error_class="WebHDFS::IOError" error="{\"RemoteException\":......

http://blog.father.gedow.net/2012/07/13/fluentd-webhdfs-writing-problem/
を参考に、以下の変更を行った。

time sliceを1日→1時間に変更. flush_intervalを削除
num_threadsを10→1(デフォルト)へ

これにより、設定は以下のようになる。

<match {p2,msr}.**>
        type forest
        subtype webhdfs
        <template>

                namenode data.local:50070


                standby_namenode data.local:50070

                path /log/private2/${tag}/%Y%m%d/${tag}.%Y%m%d-%H.${hostname}.24224.log
                output_data_type ltsv
                output_include_tag true
                output_include_time true
        username user
        </template>
</match>

テストケースと結果

以下のケースを実施した。

並列度12で単一fluentdに送信
並列度16で2プロセスのfluentdに送信
並列度24で3プロセスのfluentdに送信
いずれのケースも、aggregator, HDFS格納用fluentdともにキュー溢れは発生していない

後半の3つの山が今回のテスト時のもの

メッセージ送信量(メッセージ/分)


ケース1は最大60万msg/分(10000msg/秒)出ている
ケース2, 3では各プロセス40万msg/分(6500msg/秒)で、プロセスを増やすことでスケールしている
最大で、3プロセス使うことで110万msg/分(18300msg/秒)流れている

aggregatorプロセスCPU使用率



ケース1の様子より、単一プロセスでは10000msg/秒でfluentdのCPUがほぼ100%となっている
ケース2の負荷であれば、各プロセスともCPU使用率は50〜60%程度

OSのリソース状況

AggregatorのCPU使用率は、それぞれ150%, 170%, 230%くらい
Forwarderは130%, 150%, 200%
CPU使用率80%を限界とすると、Aggregatorは50000msg/秒、Forwarderは29000msg/秒を処理することができそう

結論

この環境での話です。

  • zmq_pub, out_webhdfsのチューニングを行うことで、全体のスループットを向上した
  • 18300msg/secまでであれば、HDFS格納まで含めて流すことができる
  • fluentdは1プロセスあたり6000msg/sec程度であればCPUに余裕を以って流すことができる。