針對適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器中的高 CPU 使用率進行疑難排解
適用於: 適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器
本文說明如何快速識別高 CPU 使用率的根本原因,以及使用 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器時,控制 CPU 使用率的可能補救動作。
在本文中,您將了解:
- 關於疑難解答指南,以找出並取得減輕根本原因的建議。
- 關於識別高 CPU 使用率的工具,例如 Azure 計量、查詢存放區 和pg_stat_statements。
- 如何識別根本原因,例如長時間執行的查詢和連線總數。
- 如何使用說明分析、連線共用和清理數據表來解決高CPU使用率。
疑難排解指南
使用 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器入口網站上可用的功能疑難解答指南,即可找到降低高 CPU 案例可能的根本原因和建議。 如何設定疑難解答指南以使用它們,請遵循 設定疑難解答指南。
識別高 CPU 使用率的工具
請考慮這些工具來識別高CPU使用率。
Azure 計量
Azure 計量是檢查明確日期和時間 CPU 使用率的良好起點。 計量會提供 CPU 使用率偏高之持續時間的相關信息。 比較寫入 IOP、讀取 IOP、讀取輸送量和寫入輸送量與 CPU 使用率的圖表,以找出工作負載造成高 CPU 的時間。 針對主動式監視,您可以設定計量的警示。 如需逐步指引,請參閱 Azure 計量。
查詢存放區
查詢存放區 會自動擷取查詢和運行時間統計數據的歷程記錄,並保留它們以供檢閱。 它會依時間切分資料,以便您查看時態性使用模式。 所有使用者、資料庫和查詢的資料都會儲存在適用於 PostgreSQL 的 Azure 資料庫彈性伺服器執行個體中名為 azure_sys 的資料庫。 如需逐步指導方針,請參閱查詢存放區。
pg_stat_statements
pg_stat_statements延伸模組可協助識別在伺服器上耗用時間的查詢。
平均或平均運行時間
針對 Postgres 13 版和更新版本,請使用下列語句,依平均或平均運行時間檢視前五個 SQL 語句:
SELECT userid::regrole, dbid, query, mean_exec_time
FROM pg_stat_statements
ORDER BY mean_exec_time
DESC LIMIT 5;
總運行時間
執行下列語句,依總運行時間檢視前五個 SQL 語句。
針對 Postgres 13 版和更新版本,請使用下列語句,依總運行時間檢視前五個 SQL 語句:
SELECT userid::regrole, dbid, query
FROM pg_stat_statements
ORDER BY total_exec_time
DESC LIMIT 5;
識別根本原因
如果 CPU 耗用量層級通常很高,則可能是根本原因:
長時間執行的交易
長時間執行的交易可能會耗用可能導致高CPU使用率的CPU資源。
下列查詢可協助識別長時間執行的連線:
SELECT pid, usename, datname, query, now() - xact_start as duration
FROM pg_stat_activity
WHERE pid <> pg_backend_pid() and state IN ('idle in transaction', 'active')
ORDER BY duration DESC;
依狀態的連線總數和連線數目
資料庫的大量連線也是另一個可能導致CPU和記憶體使用率增加的問題。
下列查詢會依狀態提供連線數目的相關信息:
SELECT state, count(*)
FROM pg_stat_activity
WHERE pid <> pg_backend_pid()
GROUP BY 1 ORDER BY 1;
解決高CPU使用率
使用 Explain Analyze、PG Bouncer、連線共用和終止長時間執行的交易來解決高 CPU 使用率。
使用說明分析
一旦您知道長時間執行的查詢,請使用 EXPLAIN 進一步調查查詢並調整查詢。
如需EXPLAIN命令的詳細資訊,請檢閱說明計劃。
PGBouncer 和聯機共用
在有許多閑置連線或大量連線的情況下,會耗用 CPU 考慮使用 PgBouncer 之類的連線共用器。
如需 PgBouncer 的詳細資訊,請檢閱:
適用於 PostgreSQL 的 Azure 資料庫彈性伺服器會將 PgBouncer 提供為內建連線共用解決方案。 如需詳細資訊,請參閱 PgBouncer
終止長時間執行的交易
您可以考慮終止長時間執行的交易作為選項。
若要終止會話的 PID,您必須使用下列查詢來偵測 PID:
SELECT pid, usename, datname, query, now() - xact_start as duration
FROM pg_stat_activity
WHERE pid <> pg_backend_pid() and state IN ('idle in transaction', 'active')
ORDER BY duration DESC;
您也可以依其他屬性進行篩選,例如 usename
(用戶名稱)、 datname
(資料庫名稱)等。
擁有工作階段的 PID 之後,您可以使用下列查詢終止:
SELECT pg_terminate_backend(pid);
監視真空和數據表統計數據
讓數據表統計數據保持在最新狀態有助於改善查詢效能。 監視是否正在執行一般自動清理。
下列查詢有助於識別需要清理的數據表:
select schemaname,relname,n_dead_tup,n_live_tup,last_vacuum,last_analyze,last_autovacuum,last_autoanalyze
from pg_stat_all_tables where n_live_tup > 0;
last_autovacuum
和 last_autoanalyze
資料行會提供上次自動清理或分析數據表的日期和時間。 如果數據表未定期清理,請採取步驟來調整自動數據清理。 如需自動數據清理疑難解答和微調的詳細資訊,請參閱 自動數據清理疑難解答。
短期解決方案是對看到緩慢查詢的數據表執行手動真空分析:
vacuum analyze <table_name>;