Postgresql

Django:CONN_MAX_AGE 保持連接,但不會在 PostgreSQL 中重用它們

  • October 10, 2014

我有一個 django 設置,在 Ubuntu 14.04 LTS 上使用 Django 1.6.7 和 Postgres 9.3。

在任何給定時間,該站點都會同時獲得大約 250 個與 PostgreSQL 數據庫的連接,這是一個 2.5GHz 的四核 Xeon E5-2670,具有 16GB 的記憶體。該特定機器全天的平均負載約為 20 到 30。

有時我會收到關於數據庫連接超時的電子郵件,我認為啟用某種連接池將有助於緩解此問題,並稍微降低數據庫的負載。

由於我們使用的是 Django 1.6,因此我們確實可以使用內置池。但是,當我將 CONN_MAX_AGE 設置為 10 秒或 60 秒時,同時連接的數量幾乎立即跳到允許的最大設置(大約是我們通常看到的兩倍),並且連接開始被拒絕。

因此,無論出於何種原因,連接都在持續存在,但它們沒有被重用。

這可能是什麼原因?

PS。我們還將 gunicorn 與 –worker-class=eventlet 一起使用。也許這就是我們痛苦的根源?

做了一些更多的實驗,我發現我們問題的原因確實是 gunicorn 的 eventlet 工人階級。每個微執行緒都有自己的持久連接,根本沒有辦法重用它們中的任何一個。

禁用 eventlet 使我們的網路伺服器上的負載上升(但幅度不大),但 postgres 負載現在下降到平均 3。從 30。

引用自:https://serverfault.com/questions/635100