Fluentd が終了しないことがある - その2

まとめました。01/31: 再発したので追記しました。
1
そのっつ (Naotoshi Seo) @sonots

fluentd がちゃんと死なない問題いい加減ちゃんと調べようと思って、https://t.co/oClScvtrVy ここでブロックしていることがわかったのだが、さてさてどう直したものか #今ココ

2014-01-29 18:12:02
そのっつ (Naotoshi Seo) @sonots

# FIXME @thread.join blocks without this line で一体なにがあったのかがわからないから、どう直したらいいのか不明だ #fluentd

2014-01-29 18:16:11
SKS rep @repeatedly

@sonots そこは @frsyuki に聴いてくだしあ.in / out_forwardのコアは初期からほとんど変わってないので,その辺のアドホックな問題は大抵frsyuki案件

2014-01-29 18:16:52
Sadayuki Furuhashi @frsyuki

@sonots それはイベント駆動IOライブラリではループを正しく止めるのが難しいという良くある問題で、そこではlistenしているソケットにconnectして中断させる方法をとっています。 @repeatedly

2014-01-30 06:40:19
Sadayuki Furuhashi @frsyuki

@sonots 良くある解決策は、a)pipeを事前に食わせておいて終了時に1バイト書き込んで中断させる方法 b)イベントループは1秒ごとに自動的に中断して終了フラグを読み出すようにしておく方法です。 @repeatedly

2014-01-30 06:41:29
Sadayuki Furuhashi @frsyuki

@sonots それぞれ一長一短があり、a)ではファイルディスクリプタ数が無駄に増える、b)では止まるまでに時間がかかる。特にFluentdの場合イベント駆動IOループを使うプラグインの数(actorのインスタンス数)が多くなるので問題が大きめです。 @repeatedly

2014-01-30 06:42:54
Sadayuki Furuhashi @frsyuki

@sonots しかしそこが問題だったとなると困りますね…Coolioを使っていると既存のAPI的にb)はできないので、a)でひとまず直せるでしょうか? @repeatedly

2014-01-30 06:46:11
Sadayuki Furuhashi @frsyuki

@sonots 根本的な解決策としては、1)Coolio::Loop#run_onceがtimeout引数を取れるようにしb)を実装する、2) timeout間隔を0.5秒ぐらいにしておく、というのでどうでしょう?>@repeatedly

2014-01-30 06:48:44
Sadayuki Furuhashi @frsyuki

@sonots Loop#runは、while true; run_once; break if stopped? に置き換える必要があります。蛇足ですがActorを入れたい理由の一つのは、その問題をプラグインがいちいち考えるべきでは無いからです。@repeatedly

2014-01-30 06:50:08
そのっつ (Naotoshi Seo) @sonots

fluentd が死なない問題また起こったけど、今度は out_yohoushi というか httpclient の TCPSocket.new の行で固まってる。まえは in_forward の TCPSocket.new https://t.co/G8Y1ex4SrE

2014-01-31 15:59:54
Sadayuki Furuhashi @frsyuki

@sonots なるほど。これですね:https://t.co/TAjoiBUAov sigdump便利ですね

2014-01-31 16:00:01
そのっつ (Naotoshi Seo) @sonots

とりあえず今は timeout(5) { TCPSocket.new .... } とかやっちゃえばいいのかな

2014-01-31 16:02:18
Sadayuki Furuhashi @frsyuki

@sonots それは微妙なんで、SocketUtil.create_tcp_socket(host, port, options={}) みたいなのを実装して、そこのチケットにある Errno::EINPROGRESS を使う方法を実装できないですかね?

2014-01-31 16:03:34
Sadayuki Furuhashi @frsyuki

@sonots SocketUtil自体が微妙という話があるので、ゆくゆくはActorを入れる感じで。

2014-01-31 16:04:21
そのっつ (Naotoshi Seo) @sonots

くっそ、timeout 実装した SocketUtil#create_tcp_socket でも結局固まった > https://t.co/UiSV5hm3aV

2014-02-04 12:29:30
Sadayuki Furuhashi @frsyuki

@sonots pack_sockaddr_inは名前解決ぽいですねぇ。タイムアウトつきの名前解決はこの辺りにあるかも:http://t.co/0KF8YyrY0M

2014-02-04 12:32:50
komamitsu @komamitsu_tw

@frsyuki @sonots in_forwardのheartbeatでも名前解決で固まってた事例ありませんでしたっけ(再現率極小)?straceの結果からするとUDPのreceiveで固まっていたような記憶がありますが、@repeatedly先生が詳しくしっているかも。

2014-02-04 12:43:26
Sadayuki Furuhashi @frsyuki

@komamitsu_tw @sonots @repeatedly UDPのreceiveでは名前解決しないようにオプションがセットしてあったような。これ:https://t.co/3qzxDPRx0W

2014-02-04 12:44:23