2016-11-15 35 views
8

我正在使用rest-client將POST發送到非常慢的Web服務。我將timeout設置爲600秒,並且我確認它已被傳遞到Net :: HTTP的@read_timeout@open_timeout在AWS Linux上增加RestClient/Net :: HTTP中的連接(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' 

它看起來像代碼拋出錯誤的行是

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

它好像底層connect(2)系統調用有大約兩分鐘超時,而超時參數p因爲Net :: HTTP只能縮短,而不能延長它。有沒有辦法修改套接字參數來設置更長的超時時間?

修改爲添加:這似乎只是我們的AWS Linux服務器上的一個問題 - 在我的MacOS開發機器上,十分鐘的超時工作。我假設MacOS/BSD上默認的connect()超時時間較長,但我並不知道。

回答

4

首先,您可以增加tcp_syn_retries配置更新/proc/sys/net/ipv4/tcp_syn_retries文件。參考here

如果不起作用,我認爲您需要激活SO_KEEPALIVETCP_USER_TIMEOUT選項。但可能在rest-client中沒有該接口。

所以,也許你需要自己製作一個叉子或創建SocketSocket::Option

Mike Perham在他的blog中寫道。

1

也許你是從套接字開始。插座需要一段時間才能再次使用,如果您在短時間內連接很多連接,這可能是問題所在。

檢查ulimit -n檢查打開的文件描述符的最大數量。記住一個套接字是一個文件,你需要改變它來允許打開更多的套接字。要更改打開文件的最大數量,請執行sudo ulimit -n 1000000

欲瞭解更多信息,請查閱this