fluentdのちょっとしたチューニングの代理の報告
はじめに
色々、テストをしてみてる結果をまとめてみた。
検証は、自分がやっている訳ではないので、検証結果からのまとめ。
あと、公開出来ない部分もあったるするので、若干、整理しきれてないけど
その辺は、また、修正出来るかな。
以下の感じで繋がっている。
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/秒)流れている