跳至內容

如何解決 Amazon RDS for PostgreSQL 或 Aurora PostgreSQL 相容版中,由 LWLock:pg_stat_statements 等待事件所導致的問題?

1 分的閱讀內容
0

我想解決 Amazon Relational Database Service (Amazon RDS) for PostgreSQL 或 Amazon Aurora PostgreSQL 相容版本中,由 LWLock:pg_stat_statements 等待事件導致的效能問題。

解決方法

pg_stat_statements 模組會追蹤 SQL 陳述式的統計資料。對於與 PostgreSQL 11 或更新版本相容的 PostgreSQL 資料庫執行個體,預設會載入pg_stat_statements 函式庫。如需詳細資訊,請參閱 PostgreSQL 網站上的 pg_stat_statements

當追蹤的唯一陳述式數超過 pg_stat_statements.max 值時,PostgreSQL 將從共用記憶體的雜湊表中,釋放執行頻率最低的查詢統計資料。釋放這些統計資訊可以為新的項目騰出空間。

在釋放期間,PostgreSQL 會對雜湊表使用 LWLock,以防止並行存取。這可能會封鎖並行後端程序,並且您可能會在 Performance Insights 中看到等待事件 LWLock:pg_stat_statements

**注意:**如果雜湊表頻繁分配項目,則工作負載的整體效能可能會下降。

增加 pg_stat_statements.max 模組

若要減少 LWLock:pg_stat_statements 等待事件,請增加參數群組中的 pg_stat_statements.max 值。如需詳細資訊,請參閱 PostgreSQL 網站上的 pg_stat_statements.max

**注意:**當您增加 pg_stat_statements.max 的值時,雜湊表會消耗額外的共用記憶體來儲存更多的 SQL 陳述式資訊。

對於 Amazon RDS for PostgreSQL,您可以修改資料庫參數群組中的 pg_stat_statements.max

對於 Aurora PostgreSQL 相容版,您可以修改資料庫叢集參數群組資料庫參數群組中的值。

修改參數群組中的 pg_stat_statements.max 後,重新啟動資料庫執行個體以套用變更。在重新啟動期間,您可能會遇到短暫的中斷。如需詳細資訊,請參閱重新啟動資料庫執行個體:基本步驟重新啟動 Aurora 叢集內的資料庫執行個體

您無法修改預設資料庫參數群組或預設資料庫叢集參數群組中的參數。若要修改預設群組中的參數,請建立自訂資料庫參數群組或自訂資料庫叢集參數群組。然後,將其與您的資料庫執行個體或資料庫叢集建立關聯。

**注意:**您可以將較長的查詢文字儲存在獨立的磁碟檔案中。如果因為查詢過長或 pg_stat_statements.max 的值較高導致檔案變得過大,則所有查詢文字都可能會遭到捨棄。然後,pg_stat_statements.query 欄位可能會變成空白。如需詳細資訊,請參閱 PostgreSQL 網站上的 pg_stat_statements——追蹤 SQL 規劃和執行的統計資料

減少 pg_stat_statements 項目

最佳做法是使用 PostgreSQL 版本 17 來減少 pg_stat_statements 項目。例如,當您使用 PostgreSQL 版本 17 或更新版本時,您可以將常數 SAVEPOINT 名稱替換為預留位置。例如,在較早版本的 PostgreSQL 中,您可以將 SAVEPOINT sp1SAVEPOINT sp2 儲存為兩個不同的 pg_stat_statements 項目。但是,在 PostgreSQL 版本 17 及更新版本中,這兩個陳述式會儲存為一個項目,例如 SAVEPOINT $1。如需詳細資訊,請參閱 PostgreSQL 網站上的 pg_stat_statements

如果您無法升級至 PostgreSQL 版本 17 或更新版本,請確認您的應用程式、物件關聯對應工具 (ORM) 和資料庫驅動程式是否會自動發出 SQL (例如 SAVEPOINT) 命令。這些自動發出的 SAVEPOINT 命令可能會增加 pg_stat_statements 項目的數量。

檢查發生了多少次釋放操作

PostgreSQL 版本 14 及更新版本

若要檢查發生釋放的總數,請查看 pg_stat_statements_info 檢視的 dealloc 欄位。您可以利用這些資訊來適當調整 pg_stat_statements.max。如需詳細資訊,請參閱 PostgreSQL 網站上的 pg_stat_statements_info 檢視。

若要檢查特定時間內的釋放次數,請定期選取 pg_stat_statements_info 檢視,然後計算與 pg_stat_statements_info.dealloc 之間的差異。

當您選取 pg_stat_statements_info 檢視時,您可能會收到 "ERROR: relation 'pg_stat_statements_info' does not exist" 錯誤訊息。當 pg_stat_statements 只載入到記憶體中,但未安裝到資料庫上時,就會發生此錯誤。若要解決此錯誤,請在應用程式連線的資料庫中安裝 pg_stat_statements 擴充功能。連線到資料庫,然後執行下列 SQL 陳述式,將 pg_stat_statements 安裝到資料庫中:

CREATE EXTENSION pg_stat_statements;

如需詳細資訊,請參閱 PostgreSQL 網站上的 CREATE EXTENSION