Увеличить время ожидания подключения(2) в RestClient / Net:: HTTP в AWS Linux

я использую остальное-клиенте для публикации в очень медленной веб-службе. Я ставлю timeout до 600 секунд, и я подтвердил, что он передается в Net::HTTP @read_timeout и @open_timeout.

однако примерно через две минуты я получаю ошибку тайм-аута низкого уровня,Errno::ETIMEDOUT: Connection timed out - connect(2):

соответствующая часть backtrace является

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, могут только сократить это, а не удлинить его. Есть ли способ, чтобы изменить параметры сокета, чтобы установить более длительный тайм-аут?

редактировать, чтобы добавить: это только кажется проблемой на наших серверах AWS Linux -- на моей машине разработки MacOS работает десятиминутный тайм-аут. Я предполагаю, что по умолчанию connect() тайм-аут больше на MacOS/ BSD, но я действительно не знать.

2 ответов


прежде всего, вы можете просто увеличить tcp_syn_retries настройки обновления . Ссылка здесь.

если if не работает, я думаю, вам нужно будет активировать SO_KEEPALIVE или TCP_USER_TIMEOUT параметры. Но, вероятно, для этого нет интерфейса в rest-client.

поэтому, возможно, вам нужно будет сделать вилку или создать Socket и Socket::Option самостоятельно.

Майк город perham писал об этом в его блог.


может быть, вы получаете из розеток. Сокеты нужно некоторое время, прежде чем снова будут доступны, если вы открываете для многих соединений в течение короткого периода времени, это может быть проблемой.

Регистрация ulimit -n чтобы проверить максимальное количество открытых файловых дескрипторов. Помните, что сокет-это файл, вам нужно изменить его, чтобы открыть больше сокетов. Чтобы изменить максимальное количество открытых файлов sudo ulimit -n 1000000.

для получения дополнительной информации, проверить этой.