【发布时间】:2017-03-28 18:36:23
【问题描述】:
我正在使用rest-client 发布到一个非常慢的网络服务。我将 timeout 设置为 600 秒,并且我已经确认它正在传递给 Net::HTTP 的 @read_timeout 和 @open_timeout。
但是,大约两分钟后,我收到一个低级超时错误,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) 系统调用有大约两分钟的超时时间,而传递给 Net::HTTP 的超时参数只能缩短它,而不是延长它。有没有办法修改socket参数设置更长的超时时间?
编辑添加:这似乎只是我们的 AWS Linux 服务器上的问题——在我的 MacOS 开发机器上,十分钟的超时有效。我假设默认的 connect() 超时在 MacOS/BSD 上更长,但我真的不知道。
【问题讨论】:
标签: ruby sockets amazon-ec2 net-http