2016-11-15 8 views
8

非常に遅いWebサービスにPOSTするのにrest-clientを使用しています。私はtimeoutを600秒に設定しており、Net :: HTTPの@read_timeout@open_timeoutに渡されていることを確認しました。AWS LinuxでRestClient/Net :: HTTPのconnect(2)タイムアウトを増やす

はしかし、約2分後に、私は低レベルのタイムアウトエラー、Errno::ETIMEDOUT: Connection timed out - connect(2)を得る:

バックトレースの関連部分が

Operation timed out - connect(2) for [myhost] port [myport] 
/Users/dmoles/.rvm/rubies/ruby-2.2.5/lib/ruby/2.2.0/net/http.rb:879:in `initialize' 
/Users/dmoles/.rvm/rubies/ruby-2.2.5/lib/ruby/2.2.0/net/http.rb:879:in `open' 
/Users/dmoles/.rvm/rubies/ruby-2.2.5/lib/ruby/2.2.0/net/http.rb:879:in `block in connect' 
/Users/dmoles/.rvm/rubies/ruby-2.2.5/lib/ruby/2.2.0/timeout.rb:88:in `block in timeout' 
/Users/dmoles/.rvm/rubies/ruby-2.2.5/lib/ruby/2.2.0/timeout.rb:98:in `call' 
/Users/dmoles/.rvm/rubies/ruby-2.2.5/lib/ruby/2.2.0/timeout.rb:98:in `timeout' 
/Users/dmoles/.rvm/rubies/ruby-2.2.5/lib/ruby/2.2.0/net/http.rb:878:in `connect' 
/Users/dmoles/.rvm/rubies/ruby-2.2.5/lib/ruby/2.2.0/net/http.rb:863:in `do_start' 
/Users/dmoles/.rvm/rubies/ruby-2.2.5/lib/ruby/2.2.0/net/http.rb:852:in `start' 
/Users/dmoles/.rvm/gems/ruby-2.2.5/gems/rest-client-2.0.0/lib/restclient/request.rb:766:in `transmit' 
/Users/dmoles/.rvm/gems/ruby-2.2.5/gems/rest-client-2.0.0/lib/restclient/request.rb:215:in `execute' 
/Users/dmoles/.rvm/gems/ruby-2.2.5/gems/rest-client-2.0.0/lib/restclient/request.rb:52:in `execute' 

ではエラーを投げるコードの行のように見えます基礎となるconnect(2)システムコールが約2分のタイムアウト、およびタイムアウトパラメータpを持っているかのように思え

TCPSocket.open(conn_address, conn_port, @local_host, @local_port) 

ですNet :: HTTPは、それを短くするだけで長くすることはできません。より長いタイムアウトを設定するためにソケットパラメータを変更する方法はありますか?

私のMacOS開発マシンでは、これはAWS Linuxサーバー上で問題が発生しているようですが、10分のタイムアウトが有効です。私はMacOS/BSDでデフォルトのconnect()タイムアウトが長いと仮定していますが、実際にはわかりません。

答えて

4

まず、/proc/sys/net/ipv4/tcp_syn_retriesファイルを更新すると、tcp_syn_retriesの設定を増やすことができます。参照番号here

動作しない場合は、SO_KEEPALIVEまたはTCP_USER_TIMEOUTのオプションを有効にする必要があります。しかしおそらく、そのためのインターフェイスはrest-clientにありません。

だから、自分でフォークを作成するかSocketSocket::Optionを作成する必要があります。

マイクパーハムについては、彼のblogに書いてあります。

1

多分あなたはソケットから外れています。ソケットはもう一度利用できるようになるまでに少し時間が必要です。短時間で多くの接続を開いている場合、これが問題になる可能性があります。

開いているファイル記述子の最大数を確認するには、ulimit -nを確認してください。ソケットはファイルであることを忘れないでください。ソケットを開くためには、ソケットを変更する必要があります。開いているファイルの最大数を変更するにはsudo ulimit -n 1000000を実行します。

詳細については、thisを参照してください。

関連する問題