Tôi đang gặp sự cố với nhân viên Sidekiq.Làm cách nào để gỡ lỗi việc sử dụng hồ bơi kết nối Rails?
ActiveRecord::ConnectionTimeoutError: could not obtain a database connection within 5.000 seconds (waited 5.000 seconds)
Tôi đang làm theo các đề xuất về việc sử dụng ActiveRecord::ConnectionTimeoutError
và hồ bơi kết nối phù hợp lớn.
Tôi muốn tìm hiểu xem tôi có đang cạn kiệt hồ bơi kết nối hay không. Tôi đang đăng nhập size
và connections.length
từ ActiveRecord::Base.connection_pool
, nhưng chúng giữ nguyên kích thước = 100 kết nối.length = 5. Điều này cho thấy đây không phải là vấn đề về rò rỉ tài nguyên.
Máy chủ MySQL của tôi được định cấu hình để cho phép tối đa 400 kết nối đồng thời.
việc của tôi đã kết thúc như thế này:
class MyJob < ActiveJob::Base
queue_as :default
rescue_from StandardError do |exception|
# clear connections on exception. Not sure if this is a good idea or not.
ActiveRecord::Base.clear_active_connections!
end
def perform()
logger.info "size"
logger.info ActiveRecord::Base.connection_pool.instance_eval { @size }
logger.info "connections"
logger.info ActiveRecord::Base.connection_pool.instance_eval { @connections }.length
# Ensure connections come from connection pool.
ActiveRecord::Base.connection_pool.with_connection do |conn|
# do stuff
end
end
end
Đây có phải là cách đúng đắn để chẩn đoán những gì đang gây ra điều này, cho dù đó là nạn đói tài nguyên hoặc rò rỉ? Có những kỹ thuật nào khác mà tôi có thể sử dụng để giải thích tại sao điều này xảy ra không?
Kích thước của nhóm kết nối được xác định trong 'database.yml' của bạn là gì? Bạn sử dụng bao nhiêu chủ đề công nhân sidekiq? – BoraMa
Bể bơi được định nghĩa là 100, như được hiển thị trong connection_pool.size, 25 công nhân. – Joe