たごもりすメモ

コードとかその他の話とか。

続 #fluentd の性能・リソースに関する最近のいくつかの傾向の話

前回の話から、メモリについては西海岸方面の協力を得てあれこれ試していた。

#fluentd の性能・リソースに関する最近のいくつかの傾向の話 - tagomorisのメモ置き場

最終的には ruby 1.9.3-p125 + jemalloc + fluentd v0.10.16 でメモリ使用量が安定した。
jemallocについてはこのあたりを読むといいんじゃないでしょうか(自分で説明するのはめんどくさいw)

jemallocとかLD_PRELOADについて調べてみた - As a Futurist...

結果、ピーク時間帯になっても used 6GB に行かないくらい。ワーイヤッタヨー。

ということでjemallocは社内用rpm*1を用意し fluentd 起動用のshファイル(supervisordからこれを指定して起動している)を以下のようにした。LD_PRELOADを加えただけ。

#!/bin/bash
export HOME=/home/username
source $HOME/.bashrc
export LD_PRELOAD=/usr/local/lib/libjemalloc.so
exec fluentd -c $HOME/path/to/etc/run/deliver.portnum.conf
つまるところ何が問題だったのか

glibc mallocによるメモリの割当てとfluentdにハイレートでデータを流したときのオブジェクトの確保・開放のパターンが相性が悪い、ということだと思う。メモリ空間が断片化しやすく、OSにも返されないし再利用もされない、という状況が累積してOS全体のメモリ使用量を圧迫していた。
なおそれ以前から継続的にメモリ使用量が増えていく問題(これはデータが全く流れないfluentdでも起きていた)は ruby 1.9.3-p125 にすることで改善していたので、GCの改良も最終的な問題の解決には寄与しているはず。

ということで、高スループットでfluentdを運用する場合には ruby 1.9.3 + jemalloc はオススメです。td-agentにもjemalloc同梱される方向らしい。

*1:/usr/local以下にインストールするためのもの