2014-07-07 3 views
3

시간 초과 문제가 있습니다. sidekiq를 여러 스레드로 실행하고 있습니다. 각각은 일부 http 작업을 수행합니다. 때로는 작업자가 시간 제한을 두지 않고 Net HTTP 호출에 걸려들 때가 있습니다. 그런 다음 모든 스레드가 유휴 상태가되어 더 이상 아무것도하지 않습니다.글로벌 Ruby HTTP 시간 초과

  • 는 HTTP read_timeout은 루비 기본 open_timeoutnil로 설정되는 반면, 60로 설정 될 것으로 보인다. 이것이 문제가 될 수 있습니까?
  • 그렇다면 http 클래스의 모든 인스턴스에 대해 시간 초과의 기본값을 설정할 수 있습니까? 원숭이가 패치 해 줘?

스택 트레이스 :

2014-07-07T07:59:22Z 26495 TID-otmt0zt9s INFO: /home/deployer/.rbenv/versions/2.1.2/lib/ruby/2.1.0/net/http.rb:879:in `initialize' 
/home/deployer/.rbenv/versions/2.1.2/lib/ruby/2.1.0/net/http.rb:879:in `open' 
/home/deployer/.rbenv/versions/2.1.2/lib/ruby/2.1.0/net/http.rb:879:in `block in connect' 
/home/deployer/.rbenv/versions/2.1.2/lib/ruby/2.1.0/timeout.rb:76:in `timeout' 
/home/deployer/.rbenv/versions/2.1.2/lib/ruby/2.1.0/net/http.rb:878:in `connect' 
/home/deployer/.rbenv/versions/2.1.2/lib/ruby/2.1.0/net/http.rb:863:in `do_start' 
/home/deployer/.rbenv/versions/2.1.2/lib/ruby/2.1.0/net/http.rb:852:in `start' 
/home/deployer/.rbenv/versions/2.1.2/lib/ruby/2.1.0/net/http.rb:1369:in `request' 
/home/deployer/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/rack-mini-profiler-0.9.1/lib/patches/net_patches.rb:7:in `block in request_with_mini_profiler' 
/home/deployer/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/rack-mini-profiler-0.9.1/lib/mini_profiler/profiling_methods.rb:40:in `step' 
/home/deployer/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/rack-mini-profiler-0.9.1/lib/patches/net_patches.rb:6:in `request_with_mini_profiler' 
/home/deployer/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/rest-client-1.6.7/lib/restclient/net_http_ext.rb:51:in `request' 
/home/deployer/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/faraday-0.9.0/lib/faraday/adapter/net_http.rb:80:in `perform_request' 
/home/deployer/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/faraday-0.9.0/lib/faraday/adapter/net_http.rb:39:in `call' 
/home/deployer/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/faraday-0.9.0/lib/faraday/request/url_encoded.rb:15:in `call' 
/home/deployer/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/signet-0.5.0/lib/signet/oauth_2/client.rb:875:in `fetch_access_token' 
/home/deployer/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/signet-0.5.0/lib/signet/oauth_2/client.rb:898:in `fetch_access_token!' 
/home/deployer/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/signet-0.5.0/lib/signet/oauth_2/client.rb:913:in `refresh!' 
/home/deployer/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/google-ads-common-0.9.5/lib/ads_common/auth/oauth2_handler.rb:91:in `refresh_token!' 
/home/deployer/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/google-ads-common-0.9.5/lib/ads_common/auth/oauth2_handler.rb:83:in `get_token' 
/home/deployer/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/google-ads-common-0.9.5/lib/ads_common/auth/oauth2_handler.rb:75:in `auth_string' 
/home/deployer/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/google-ads-common-0.9.5/lib/ads_common/savon_headers/oauth_header_handler.rb:45:in `generate_headers' 
/home/deployer/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/google-ads-common-0.9.5/lib/ads_common/savon_headers/base_header_handler.rb:75:in `prepare_request' 
/home/deployer/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/google-ads-common-0.9.5/lib/ads_common/savon_service.rb:103:in `block in execute_soap_request' 
/home/deployer/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/savon-1.2.0/lib/savon/client.rb:129:in `yield_objects' 
/home/deployer/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/savon-1.2.0/lib/savon/client.rb:122:in `process' 
/home/deployer/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/savon-1.2.0/lib/savon/client.rb:84:in `block in request' 
/home/deployer/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/savon-1.2.0/lib/savon/soap/request_builder.rb:56:in `call' 
/home/deployer/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/savon-1.2.0/lib/savon/soap/request_builder.rb:56:in `request' 
/home/deployer/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/savon-1.2.0/lib/savon/client.rb:86:in `request' 
/home/deployer/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/google-ads-common-0.9.5/lib/ads_common/savon_service.rb:101:in `execute_soap_request' 
/home/deployer/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/google-ads-common-0.9.5/lib/ads_common/savon_service.rb:80:in `execute_action' 
/home/deployer/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/google-adwords-api-0.11.1/lib/adwords_api/v201402/campaign_service.rb:25:in `mutate' 
/home/deployer/apps/robot/lib/adwords_helper.rb:1355:in `toggle_campaign' 
/home/deployer/apps/robot/app/models/adwords_campaign.rb:262:in `adwords_toggle' 
/home/deployer/apps/robot/app/workers/update_campaign_status.rb:13:in `perform' 
/home/deployer/apps/robot/app/workers/recurring/refresh_campaign_status.rb:12:in `block in perform' 

편집 :

I 원숭이는 HTTP 라이브러리를 패치. 문제가 다시 발생하는지 확실하지 않습니다. 그렇다면 여기에 게시 할 것입니다.

module Net 
    class HTTP < Protocol 
    alias_method :old_initialize, :initialize 

    def initialize(address, port = nil, open_timeout: 60) 
     old_initialize(address, port) 
     self.open_timeout = open_timeout 
    end 
    end 
end 
+0

질문을 닫으면 스스로 대답하는 것이 옳지 않습니까? – zuba

+0

질문에서 대답을 빠져 나와 대답으로 이동 한 다음 체크 표시를 해 주실 수 있습니까? 이것은 같은 문제를 겪고있는 다른 사람들에게 도움이 될 것입니다. (문제 자체가 아닌 경우 질문에 답이 있다는 것을 쉽게 알 수 있습니다). –

답변

1

업데이트에 게시 할 때 문제가있는 기본 시간 초과 값은 Net::HTTP입니다. Ruby 2.1.0의 경우 open_timeout의 기본값은 nil입니다. read_timeout은 기본적으로 60 초로 기본 설정됩니다.

Ruby 2.3부터 기본값은 open_timeouthas changed from nil to 60s입니다. Ruby 2.3은 처음에이 질문을한지 1 년 6 개월 만에 발표 될 예정 이었지만,이 문제를 경험하고있는 여러분이나 다른 분들에게 추천하는 방법은 Ruby 2.3 이상으로 업그레이드하는 것입니다. (가능한 경우 핵심 라이브러리를 monkeypatch하지 마십시오)