針對適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器中的高 CPU 使用率進行疑難排解
適用於: 適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器
本文說明如何識別高 CPU 使用率的根本原因。 它也提供可能的補救動作,以在使用 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器時控制CPU使用率。
在本文中,您可了解:
- 關於疑難解答指南,以找出並取得減輕根本原因的建議。
- 關於識別高 CPU 使用率的工具,例如 Azure 計量、查詢存放區和pg_stat_statements。
- 如何識別根本原因,例如長時間執行的查詢和連線總數。
- 如何使用 EXPLAIN ANALYZE、連線共用和清理數據表來解決高 CPU 使用率。
疑難排解指南
使用疑難解答指南,您可以找出高 CPU 案例的可能根本原因,並可閱讀建議來減輕發現的問題。
若要瞭解如何設定和使用疑難解答指南,請遵循 設定疑難解答指南。
識別高 CPU 使用率的工具
請考慮使用下列工具清單來識別高CPU使用率。
Azure 計量
Azure 計量是檢查特定期間 CPU 使用率的良好起點。 計量會提供 CPU 使用率偏高期間所使用資源的相關信息。 比較寫入 IOP、讀取 IOP、讀取輸送量位元組/秒和寫入輸送量位元組/秒與 CPU 百分比的圖表,以找出工作負載造成高 CPU 的時間。
針對主動式監視,您可以設定計量的警示。 如需逐步指引,請參閱 Azure 計量。
查詢存放區
查詢存放區會自動擷取查詢和運行時間統計數據的歷程記錄,並保留它們以供檢閱。 它會依時間分割數據,讓您可以查看時態使用模式。 所有使用者、資料庫和查詢的數據會儲存在 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器實例中名為 azure_sys
的資料庫。
查詢存放區可以將等候事件資訊與查詢運行時間統計數據相互關聯。 使用查詢存放區來識別在感興趣的期間具有高 CPU 耗用量的查詢。
如需詳細資訊,請參閱 查詢存放區。
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 state
ORDER BY state ASC;
解決高CPU使用率
使用 EXPLAIN ANALYZE,請考慮使用內建的 PgBouncer 連線共用器,並終止長時間執行的交易來解決高 CPU 使用率。
使用 EXPLAIN ANALYZE
一旦您知道耗用更多CPU的查詢,請使用 EXPLAIN ANALYZE 進一步調查和微調它們。
如需EXPLAIN ANALYZE 命令的詳細資訊,請檢閱其檔。
PgBouncer,內建聯機共用器
在有許多短期連線,或許多聯機在大部分時間內保持閑置的情況下,請考慮使用 PgBouncer 之類的連線共用器。
如需 PgBouncer 的詳細資訊,請參閱使用 PostgreSQL 的連線共用器和連線處理最佳做法
適用於 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>;