前回の話から、メモリについては西海岸方面の協力を得てあれこれ試していた。
#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以下にインストールするためのもの