So-net無料ブログ作成

http.getで無限待ち [Ruby]

以前の記事とほぼ同内容なんだけど,またはまってしまった.覚えられるまで何度でも書く.

24時間稼働させているrubyのプログラムが全く出力を吐かなくなった.process自体は落ちずに生き残っているらしい.straceで確認するとppollで止まっている.
% strace -p 5968
Process 5968 attached
ppoll([{fd=8, events=POLLIN}], 1, NULL, NULL, 
ppollの第2引数がNULLになっているのが良くない.これはTimeout時間をしているものでNULLならばTimeoutなしの無限待ちになる.

RubyのHTTPのget,postでdefaultでTimeoutが設定されていないのが大本.以下のように明示的に指定する.
  url = URI.parse URL
  http = Net::HTTP.new(url.host,url.port)
  http.use_ssl = true if (443==url.port)
  http.open_timeout = 300
  http.read_timeout = 300
  http.ssl_timeout  = 300
  http.verify_mode = OpenSSL::SSL::VERIFY_PEER
  http.verify_depth = 5
  resp = http.get(url.path)


にほんブログ村 自転車ブログ ブルベへ
にほんブログ村
nice!(1)  コメント(0) 

Bot 無限wait? (2) [Ruby]

先日の,Trading Botが無限waitに入ってしまう話の続き.

Net::HTTPが怪しいということで調べてみたところ,Net::HTTPで5つあるタイムアウトのうち3つがdefaultでnilになっていることがわかった. (ruby 2.1.5p273を使っています).
p http.continue_timeout     # => nil
p http.keep_alive_timeout   # => 2
p http.open_timeout         # => nil
p http.read_timeout         # => 60
p http.ssl_timeout          # => nil
ちなみに,ruby 2.3.0ではopen_timeoutのdefault値は60に変更になっているようです.

ひとまず,nilになっているところに値をセットして様子を見てみることにします.
タグ:Ruby Bitcoin
にほんブログ村 自転車ブログ ブルベへ
にほんブログ村

Bot 無限ループ? [Ruby]

運用しているTrading Botの動作がときどき変になります.

Processとしては無事に生きているようですが,定期的に出力するはずのログをまったく出力しなくなります.無限ループ,あるいは無限待ちに陥っているように思いますが,どこで止まっているのか見当がつきません.

今日もそういう状態になっていたので調べてみました.
% strace -p 812
Process 812 attached
ppoll([{fd=7, events=POLLIN}], 1, NULL, NULL, 8
うーん,ファイルアクセスで無限ポーリングに陥っているのでしょうか?

調べると,似たような議論を見つけました.(Resolvedに至ったのは10/4です.最近です!)

Timeout時間を指定せずにppollを呼び出しているのがいけないようです.私はMongoDBは使っておらず,直にSocketを使ってはいないのでnet/httpあたりが怪しそうです.

タグ:Ruby Bitcoin
にほんブログ村 自転車ブログ ブルベへ
にほんブログ村