Armadilloフォーラム

fluentdの長期間実行時にプロセスが終了する

sisoshima

2015年11月16日 17時03分

前回はお世話になりました。sisoshimaです。

fluentdを長期間実行させていると、fluentdのプロセスが終了する現象が発生しています。
/var/log/messageやfluentd 自身のログを見ても原因となるものが見つからない状況です。

解決方法や似た事例などご存知の方はどうかよろしくお願いします。

コメント

at_yuma.arakawa

2015年11月16日 18時54分

> /var/log/messageやfluentd 自身のログを見ても原因となるものが見つからない状況です。
/etc/config/fluentd.conf のデフォルト設定では、fluentdの内部イベントや、全てのパターンにマッチしなかった場合のログは捨てられています。

例えば、以下のように修正すると、fluentdの内部イベントと、全てのパターンにマッチしなかった場合のログを
コンソールへ出力するように変更できますので、新たに情報が得られるかお試しいただけますでしょうか。

■ /etc/config/fluentd.conf の100〜110行目あたり
・修正前

## match fluent's internal events
#<match fluent.**>
#  @type null
#</match>
 
## match not matched logs and write to file
#<match **>
#  @type file
#  path /var/log/fluent/else
#  compress gz
#</match>

・修正後

## match fluent's internal events
<match fluent.**>
  @type stdout
  @id stdout_output
</match>
 
## match not matched logs and write to file
<match **>
  @type stdout
  @id stdout_output
</match>

sisoshima

2015年11月19日 12時18分

ご返信ありがとうございます。

早速 fluent.confに設定をしてみましたが、止まった時点のログには特に怪しいがありませんでした。
引き続き確認してみたいと思います。

/var/log/messageにfluentdが止まったであろう時刻に、OOMが動作していることに気が付きました。
ログにはfluentdのプロセスをkillしているようでして、pidから子プロセスだと見受けられました。
そこで、下記2点の質問があるのですが。

・子プロセスをkillした時に親プロセスが終了することがありえるのでしょうか?
・また、子プロセスではなく親プロセスのほうがkillされることがあるのでしょうか?(この場合は、子プロセスは残るはずだと思うのですが?)

申し訳ありませんが、よろしくお願いします。

at_yuma.arakawa

2015年11月19日 13時51分

> ・子プロセスをkillした時に親プロセスが終了することがありえるのでしょうか?
ありえないと思われます。

子プロセス終了時に親プロセスへ送信されるSIGCHLDシグナルのハンドラで
「親プロセス自身が終了する」よう設定されていた場合、そのようなことが起こりえますが、
fluentdのソースコードでSIGCHLDシグナルのハンドラは設定していません。

SIGCHLDシグナルのデフォルト動作はシグナルの無視なので、
「子プロセス終了時に親プロセスであるfluentdが終了する」ことはないです。

> ・また、子プロセスではなく親プロセスのほうがkillされることがあるのでしょうか?
ログで「OOMによりfluentdが生成した子プロセスが終了させられた」と出ているのであれば、
親プロセスがkillされることはないです。

> (この場合は、子プロセスは残るはずだと思うのですが?)
そのとおりです。
子プロセスが終了する前に親プロセスが終了した場合、
その子プロセスはinitの子プロセスになります。

at_yuma.arakawa

2015年11月20日 10時19分

> ありえないと思われます。
>
> 子プロセス終了時に親プロセスへ送信されるSIGCHLDシグナルのハンドラで
> 「親プロセス自身が終了する」よう設定されていた場合、そのようなことが起こりえますが、
> fluentdのソースコードでSIGCHLDシグナルのハンドラは設定していません。
「ありえない」は誤りで、私の現在の認識としては「ありえないとは言い切れない」が正確でした。すみません。

私が確認した要因は、SIGCHLDシグナルをきっかけとした場合のみです。
「子プロセスをkillした時に親プロセスが終了する」要因としては、
「親プロセス側で子プロセスのPIDを監視し続けている」なども考えられるため、
「ありえない」とは言い切れませんでした。

確認方法として、まずは試しにfluentdの子プロセスをkillしてみると良いかと思います。

また、OOMにおちいるならば、メモリ枯渇を解決すべきかと思います。
以下のスレッドの質問は解決済みでしょうか。
- [Armadillo-IoT] fluentdを実行時のメモリ不足について
https://armadillo.atmark-techno.com/forum/armadillo/1514

sisoshima

2015年11月20日 22時06分

> 確認方法として、まずは試しにfluentdの子プロセスをkillしてみると良いかと思います。
killコマンドでは親プロセスまで終了するようなことは発生しませんでした。
ただし、子プロセスを終了した後、子プロセスが再度発生しているので、
「親プロセス側で子プロセスのPIDを監視し続けている」ようなことは行っているように思えます。

> また、OOMにおちいるならば、メモリ枯渇を解決すべきかと思います。
> 以下のスレッドの質問は解決済みでしょうか。
> - [Armadillo-IoT] fluentdを実行時のメモリ不足について
> https://armadillo.atmark-techno.com/forum/armadillo/1514

メモリ枯渇問題は色々と手をつくしているのですが、
現状としてはfluentd起動時の最低限のメモリ使用量でもかなりきつい状態です。
fluentbitに乗り換えも視野に入れている状況です。

at_yashi

2015年11月25日 14時34分

> メモリ枯渇問題は色々と手をつくしているのですが、
> 現状としてはfluentd起動時の最低限のメモリ使用量でもかなりきつい状態です。

OOMの時で、どれくらい fluentd の中でバッファーしています?

Armadillo-IoT では、ファイルシステムをメモリに置いているので、不要なファイルを
捨てると使えるメモリが増えます。

Distでは dist/romfs にファイルが置かれてから、romfs.img を作成するので、
ここの中で不要なファイルを捨ててみると良いかもしれません。たとえば
Java を使っていないならはずすとか。romfsのなかで、大きなファイルを
リストアップするには

find romfs -type f -printf "%s %p\n" | sort -n

とやると良いです。

軽量 fluent ではどこかに中継用の fluentd がいるのであれば、fluent-bit や mruby の
fluent が使えるのですが、ありますか?

fluent-bit は、fluentd と tresuredata の out plugin しかないようです。

$ ls plugins/out* -d -1
plugins/out_fluentd
plugins/out_null
plugins/out_stdout
plugins/out_td
$ git describe --tags
v0.3-37-g13d4beb

y.nakamura

2015年11月21日 7時57分

中村です。

話の前後を読んでいませんし、おそらく問題解決のための材料には
ならないと思うのですが、この部分、気になったので書かせてもらいます。

> ・子プロセスをkillした時に親プロセスが終了することがありえるのでしょうか?
に対して、
> > ありえないと思われます。
...
> 「ありえない」は誤りで、私の現在の認識としては「ありえないとは言い切れない」が正確でした。すみません。

子をkillした親が子と一緒に死ぬことはありえます。

実は、atmark-distに入っているpppdがこの問題を抱えています。
pppoeを使う設定のとき、pppdをkillすると、killした自分(親)も死にます。
親側で回避する方法と、子側のpppdで回避する方法がありますが、
話題が横にそれてしまいますので、具体的な話は、またの機会に。
(これには、プロセスグループが関係してます)

--
なかむら