ようへいの日々精進XP

よかろうもん

td-agent のメモリバッファとファイルバッファでどんな違いが発生するか観察してみた

はじめに

先日、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 にアップ!

とりあえず ForwarderCollector だけはアップした。( 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 にバッファリングが発生するので修正した)

メモリバッファ

f:id:inokara:20131103101512p:plain

ファイルバッファ

f:id:inokara:20131103101525p:plain

当たり前と言ったら当たり前なのかもしれないけど、メモリバッファのホストは Cache 量の減少が見られた。おそらくバッファとしてメモリが利用されていることによる減少と予想される。

ということは、メモリが何らかの理由で枯渇してしまうとスワップアウトが発生してしまいホストの性能劣化に繋がる可能性がある。もしかすると、この事がメモリバッファよりファイルバッファをオススメしている所以かもしれない。

バッファリング時の CPU や Load Average への負荷は変わらず

メモリバッファ

以下は CPU 使用率。

f:id:inokara:20131103102143p:plain

以下は Load Average

f:id:inokara:20131103102150p:plain

ファイルバッファ

以下は CPU 使用率。

f:id:inokara:20131103102245p:plain

以下は Load Average

f:id:inokara:20131103102253p:plain

CPULoad 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 プラグインのバッファについては以下の記事が参考になった。

(追記)通常運用時のサーバーリソースの使われ方はメモリバッファもファイルバッファも差異は無い

CPULoad Average 以外にも通常運用時に関してはメモリの使われ方もほぼ同じ。

メモリバッファ

f:id:inokara:20131105010619p:plain

ファイルバッファ

f:id:inokara:20131105010626p:plain


最後に

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