我正在使用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()
超时时间较长,但我并不知道。