はじめに
先日、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 以外にも通常運用時に関してはメモリの使われ方もほぼ同じ。
メモリバッファ

ファイルバッファ

最後に
- 実際に手を動かしてみて良かった
- せっかく構築した環境なので、引き続き監視していきたい