Увеличить время ожидания подключения(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
.
для получения дополнительной информации, проверить этой.