簡體   English   中英

Rails 4數據庫連接池錯誤

[英]Rails 4 database connection pool error

我有NGINX和Puma托管的Rails應用程序。 每10個小時左右,該應用將無法使用。 每當用戶嘗試連接時,都會顯示以下錯誤消息:

Error during failsafe response: could not obtain a database connection within 5.000 seconds (waited 5.000 seconds)

這將繼續,直到重新啟動該應用程序為止。

我已經讀到這是因為數據庫連接池已滿,所以必須在rails應用程序中創建正在完成的線程,這些線程不會關閉它們與數據庫的連接。 據我所知,在應用程序代碼中只有一個地方使用了線程:一個塊使用了Ruby Timeout模塊,但這不能訪問數據庫。

按照本指南https://devcenter.heroku.com/articles/concurrency-and-database-connections (我實際上不是在使用Heroku),我已使用以下配置文件將數據庫連接池的大小設置為5:

#config/initializers/database_connection.rb
Rails.application.config.after_initialize do
  ActiveRecord::Base.connection_pool.disconnect!

  ActiveSupport.on_load(:active_record) do
    config = ActiveRecord::Base.configurations[Rails.env] ||
                Rails.application.config.database_configuration[Rails.env]
    config['reaping_frequency'] = ENV['DB_REAP_FREQ'] || 10 # seconds
    config['pool']              = ENV['MAX_THREADS'] || 5 
    ActiveRecord::Base.establish_connection(config)
  end

結束

該站點使用Rails 4.0.0托管。 我已經讀到,這實際上可能是Rails 4.0.0的問題,並且在更高版本中已修復,但不確定。 使用Postgres在Heroku上的ConnectionTimeoutError

  1. 有什么方法可以監視連接池中活動數據庫連接的數量? 這將使調試更加容易。
  2. 在Rails應用程序代碼中使用超時模塊是否可能導致此問題?
  3. 這可能是Rails 4.0.0的問題,而不是我的應用程序的問題嗎?

Rails應用程序正在生產環境中運行。 如果需要,我可以提供有關Puma NGINX配置的更多信息。

故障安全響應試圖分配數據庫連接的事實可能是冒煙的人。 它可以幫助您描述故障安全響應中發生的情況。 可能是在原始請求觸發異常時觸發了故障安全響應。 在ConnectionManager調用clear_active_connections之后,將調用調用故障安全響應的rails show_exception例程! 對於當前請求(失敗失敗),這意味着在故障安全響應失敗后,rails不會自動釋放數據庫連接。 這意味着故障安全響應處理程序負責清理自己的數據庫連接。 我不確定故障安全響應處理程序嘗試連接到數據庫是否是一種好習慣,但是如果這是所需的行為,那么您可能必須調用clear_active_connections! 明確地在故障安全處理程序的末尾(在確保塊中)。

我一直在研究自己的應用程序中的類似問題,並發現這對連接的工作方式很有幫助https : //bibwild.wordpress.com/2014/07/17/activerecord-concurrency-in-rails4-avoid -leaked-connections / 雖然此處引用的代碼可能需要一些調整,但是其中有一個很好的概述,說明如何在創建隱式數據庫連接時進行檢測。

我認為這不是Rails 4.0.0的問題。

因此,如ruby超時模塊文檔中所述,它產生了一個新線程。 我認為有可能產生長時間運行的線程,使數據庫連接保持活動狀態。 要檢查正在運行的線程,可以使用Thread.list方法。 還要記住,您的池大小必須> =大於puma線程乘以puma工人。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM