はじめに
先日、DevOps 向け Fluentd 勉強会 at IPROS で聞いた話の中で Ouptput プラグインのバッファの関して下記の点について気になったので調べたくてウズウズ。
- Output プラグインのメモリバッファとファイルバッファの性能はほとんど差異は無い
- デフォルトはメモリバッファだがファイルバッファがオススメ
また、fluent-logger を使ってサーバーの負荷が激しく上がってしまった件について質問させて頂いたがよくよく考えるとこのバッファについて全く考慮しないままの利用だったので、この件でも解決への糸口になるのではということでメモリバッファとファイルバッファで何が違うのかを調べてみた。
構成
検証環境
以下のような検証環境を用意した。
役割 | バッファタイプ / Output / アプリケーション | OS | td-agent バージョン | スペック | 備考 |
---|---|---|---|---|---|
Forwarder | メモリ | Debian 6.0.7 | 1.1.17-1 | 1vcpu/512MB Memory | forward プラグインで Collector へ転送 |
Forwarder | ファイル | Debian 6.0.7 | 1.1.17-1 | 1vcpu/512MB Memory | forward プラグインで Collector へ転送 |
Collector | mongodb | Debian 6.0.7 | 1.1.17-1 | 2vcpu/2048MB Memory | mongodb を利用 |
Monitoring | Cacti | Ubuntu 13.04 |
各環境の td-agent についてメモ
検証環境の構築については長くなるので cookbook
化して github にアップ!
とりあえず Forwarder と Collector だけはアップした。( Debian 6 と 7 だったら動くかも)
以下、td-agent
の設定(td-agent.conf
)内容について抜粋。
forwarder(メモリバッファ)
<source> type tail format apache path /var/log/nginx/localhost.access.log tag nginx.accesslog pos_file /tmp/fluentd.pos </source> <match nginx.**> type forward buffer_type memory <server> host xxx.xxx.xxx.xxx port 24224 </server> flush_interval 60s </match>
forwarder(ファイルバッファ)
<source> type tail format apache path /var/log/nginx/localhost.access.log tag nginx.accesslog pos_file /tmp/fluentd.pos </source> <match nginx.**> type forward buffer_type file buffer_path /tmp/fluentd/buffer <server> host xxx.xxx.xxx.xxx port 24224 </server> flush_interval 60s </match>
collector
# Input <source> type forward port 24224 </source> # Output <match nginx.**> type mongo database nginx collection accesslog # buffer_chunk_limit 128m # "To avoid problems, set a smaller number to the buffer_chunk_limit" というメッセージが出力されたので設定した </match>
気づいた点
Cacti
のグラフや td-agent
の眺めて以下のような点に気付いた。
- バッファリング時のメモリの使われ方に違いがあった
- バッファリング時の CPU や Load Average への負荷は変わらず
buffer_chunk_limit
について- (追記)通常運用時のサーバーリソースの使われ方はメモリバッファもファイルバッファも差異は無い!
以下はそれぞれについて少し突っ込んで書いてみる。
バッファリング時のメモリの使われ方に違いが...
Collector の fluentd
を止めて Forwarder 側にバッファリングするような状況を作ってみて Cacti
のグラフを見比べてみると以下のような違いが出た。(注:Collector 側の MongoDB
を止めたらと書いていたが、この構成だと MongoDB
を止めると Collector の fluentd
にバッファリングが発生するので修正した)
メモリバッファ
ファイルバッファ
当たり前と言ったら当たり前なのかもしれないけど、メモリバッファのホストは Cache
量の減少が見られた。おそらくバッファとしてメモリが利用されていることによる減少と予想される。
ということは、メモリが何らかの理由で枯渇してしまうとスワップアウトが発生してしまいホストの性能劣化に繋がる可能性がある。もしかすると、この事がメモリバッファよりファイルバッファをオススメしている所以かもしれない。
バッファリング時の CPU や Load Average への負荷は変わらず
メモリバッファ
以下は CPU
使用率。
以下は Load Average
。
ファイルバッファ
以下は CPU
使用率。
以下は Load Average
。
CPU
や Load Average
に関しては殆ど差異は無いように見える。ということで、メモリの枯渇を気にしながらメモリバッファを利用する理由はあまり無いのかもしれない...
buffer_chunk_limit について
たまたま Collector 側の td-agent ログを眺めていたところ下記のようなログが吐かれていた。
2013-11-03 09:12:53 +0900 [warn]: Size of the emitted data exceeds buffer_chunk_limit. 2013-11-03 09:12:53 +0900 [warn]: This may occur problems in the output plugins ``at this server.`` 2013-11-03 09:12:53 +0900 [warn]: To avoid problems, set a smaller number to the buffer_chunk_limit 2013-11-03 09:12:53 +0900 [warn]: in the forward output ``at the log forwarding server.``
大量のログが Collector に集まった際に buffer_chunk_limit
のキャパシティを超えてしまうことで出力されるログっぽい。buffer_chunk_limit
のデフォルト値は 8MB とのこと。その他 Output プラグインのバッファについては以下の記事が参考になった。
- #fluentd fluentdで集約する際にwarnが多発した件
- FluentdでバッファつきOutputPluginを使うときのデフォルト値
- Fluentd out_forward における最適化パラメータいくつかの話(http://d.hatena.ne.jp/tagomoris/20120731/1343707793)
(追記)通常運用時のサーバーリソースの使われ方はメモリバッファもファイルバッファも差異は無い
CPU
と Load Average
以外にも通常運用時に関してはメモリの使われ方もほぼ同じ。
メモリバッファ
ファイルバッファ
最後に
- 実際に手を動かしてみて良かった
- せっかく構築した環境なので、引き続き監視していきたい