2016-06-18 3 views
3

현재 sidekiq 4.1.2을 실행 중입니다. 나는 수 많은 일자리를 동시에 수행 할 수 없었습니다. 최근에 내가 Sidekq의 문제 해결 WIKI에 설명 된 문제에 부딪 쳤던 것처럼 보였습니다. 전화 번호는 Too many connections to MongoDB입니다. 분명히 mongoid 3은 근로자를 제대로 연결 해제하지 않습니다. 그러나 mongoid 5.1.3을 사용하고 있습니다. 몇 가지 다른 작업이 실행되는 동안 작업이, 쿼리로 데이터베이스에 접속을 시도Sidekiq, mongoid 연결 시간 초과, 아마도 너무 많은 연결을 dequeueing 실패

내 문제의 표면 : ​​하나의 작업이 실패

Timeout::Error: Timed out attempting to dequeue connection after 30 sec. 
/home/me/applications/myapp/shared/bundle/ruby/2.2.0/gems/mongo-2.2.5/lib/mongo/server/connection_pool/queue.rb:190:in `wait_for_next!' 
/home/me/applications/myapp/shared/bundle/ruby/2.2.0/gems/mongo-2.2.5/lib/mongo/server/connection_pool/queue.rb:176:in `block in dequeue_connection' 
/home/me/applications/myapp/shared/bundle/ruby/2.2.0/gems/mongo-2.2.5/lib/mongo/server/connection_pool/queue.rb:190:in `wait_for_next!' 
/home/me/applications/myapp/shared/bundle/ruby/2.2.0/gems/mongo-2.2.5/lib/mongo/server/connection_pool/queue.rb:176:in `block in dequeue_connection' 
/home/me/applications/myapp/shared/bundle/ruby/2.2.0/gems/mongo-2.2.5/lib/mongo/server/connection_pool/queue.rb:172:in `loop' 
/home/me/applications/myapp/shared/bundle/ruby/2.2.0/gems/mongo-2.2.5/lib/mongo/server/connection_pool/queue.rb:172:in `dequeue_connection' 
/home/me/applications/myapp/shared/bundle/ruby/2.2.0/gems/mongo-2.2.5/lib/mongo/server/connection_pool/queue.rb:62:in `block in dequeue' 
/home/me/applications/myapp/shared/bundle/ruby/2.2.0/gems/mongo-2.2.5/lib/mongo/server/connection_pool/queue.rb:61:in `synchronize' 
/home/me/applications/myapp/shared/bundle/ruby/2.2.0/gems/mongo-2.2.5/lib/mongo/server/connection_pool/queue.rb:61:in `dequeue' 
/home/me/applications/myapp/shared/bundle/ruby/2.2.0/gems/mongo-2.2.5/lib/mongo/server/connection_pool.rb:51:in `checkout' 
/home/me/applications/myapp/shared/bundle/ruby/2.2.0/gems/mongo-2.2.5/lib/mongo/server/connection_pool.rb:107:in `with_connection' 
/home/me/applications/myapp/shared/bundle/ruby/2.2.0/gems/mongo-2.2.5/lib/mongo/server/context.rb:63:in `with_connection' 
/home/me/applications/myapp/shared/bundle/ruby/2.2.0/gems/mongo-2.2.5/lib/mongo/operation/executable.rb:34:in `execute' 
/home/me/applications/myapp/shared/bundle/ruby/2.2.0/gems/mongo-2.2.5/lib/mongo/collection/view/iterable.rb:80:in `send_initial_query' 
/home/me/applications/myapp/shared/bundle/ruby/2.2.0/gems/mongo-2.2.5/lib/mongo/collection/view/iterable.rb:41:in `block in each' 
/home/me/applications/myapp/shared/bundle/ruby/2.2.0/gems/mongo-2.2.5/lib/mongo/retryable.rb:51:in `call' 
/home/me/applications/myapp/shared/bundle/ruby/2.2.0/gems/mongo-2.2.5/lib/mongo/retryable.rb:51:in `read_with_retry' 
/home/me/applications/myapp/shared/bundle/ruby/2.2.0/gems/mongo-2.2.5/lib/mongo/collection/view/iterable.rb:39:in `each' 
/home/me/applications/myapp/shared/bundle/ruby/2.2.0/gems/mongoid-5.1.3/lib/mongoid/query_cache.rb:207:in `each' 
/home/me/applications/myapp/shared/bundle/ruby/2.2.0/gems/mongoid-5.1.3/lib/mongoid/contextual/mongo.rb:121:in `each' 
/home/me/applications/myapp/shared/bundle/ruby/2.2.0/gems/mongoid-5.1.3/lib/mongoid/contextual/mongo.rb:295:in `map' 
/home/me/applications/myapp/shared/bundle/ruby/2.2.0/gems/mongoid-5.1.3/lib/mongoid/contextual/mongo.rb:295:in `map' 
/home/me/applications/myapp/shared/bundle/ruby/2.2.0/gems/mongoid-5.1.3/lib/mongoid/contextual.rb:20:in `map' 
/home/me/applications/myapp/releases/20160618143407/app/jobs/myjob.rb:8:in `block in perform' 

후, 다른 작업은 곧 실패합니다. 이 작업은 몇 개의 수작업이 성공적으로 완료된 후 가장 자주 발생합니다. 이는 작업이 데이터베이스와의 연결이 끊어지지 않았 음을 나타낼 수 있습니다. top에서 나는 몽고로드 CPU가 너무 많다는 것을 알 수 없습니다.

동시에이 문제가 발생하기 시작하여 sidetiq 0.7.0 활성화 된 되풀이 작업이 올바르게 예약되지 않은 것으로 나타났습니다. 하나의 작업은 대기열에 넣기를 중단하고 다른 작업은 다시 시작한 후에 한 번만 대기합니다.

내 Sidekiq 웹 인터페이스에 따르면 기본값이이고 25 개의 스레드가있는 1 개의 대기열이 있습니다. 맥스. 12-15 명이 동시에 바쁠 때.

이 문제를 해결하는 방법에 대한 아이디어가 있으십니까?

+0

kiqstand를 사용해 보셨습니까? https://github.com/mongoid/kiqstand –

+0

아니요,하지만 Mongoid 3에만 해당됩니다. README에 따르면 최신 버전에는 필요하지 않습니다. – ChristofferJoergensen

답변

4

기본 최대 풀 큐 크기는 5. 예를 들어, 최대 max_pool_size을 부딪 치는됩니다 25 귀하의 DB에 더 많은 연결을 활성화합니다.

production: 
    clients: 
    default: 
     options: 
     max_pool_size: 25 
0

변경 mongoid.yml 생산 설정에 wait_queue_timeout 속성을 추가 :

production: 
    clients: 
    default: 
    uri: mongodb://aaaaa.com:27017/mongo 
    options: 
     connect_timeout: 30 
     wait_queue_timeout: 30