在AWS Linux上增加RestClient / Net :: HTTP中的connect(2)超时

时间:2016-11-15 00:54:38

标签: ruby sockets amazon-ec2 net-http

我使用rest-client来发布一个非常慢的网络服务。我将timeout设置为600秒,并且我已确认它已传递给Net :: HTTP&#39} @read_timeout和{{1} }。

但是,大约两分钟后,我收到一个低级超时错误@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) 系统调用的超时时间约为2分钟,而传递给Net :: HTTP的超时参数只能缩短它,而不能延长它。有没有办法修改套接字参数以设置更长的超时?

编辑添加:这似乎只是我们的AWS Linux服务器上的一个问题 - 在我的MacOS开发机器上,十分钟超时工作。我认为MacOS / BSD上的默认connect(2)超时时间更长,但我真的不知道。

2 个答案:

答案 0 :(得分:4)

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

如果不起作用,我认为您需要激活SO_KEEPALIVETCP_USER_TIMEOUT选项。但可能在rest-client中没有接口。

所以也许您需要自己做一个分叉或创建SocketSocket::Option

Mike Perham在他的blog中写到了这一点。

答案 1 :(得分:1)

也许你是从插座开始的。套接字需要一些时间再次可用,如果您在短时间内打开多个连接,这可能是问题所在。

检查ulimit -n以检查打开的文件描述符的最大数量。请记住,套接字是一个文件,您需要更改它以允许打开更多套接字。要更改已打开文件的最大数量,请执行sudo ulimit -n 1000000

有关详情,请查看this