共用方式為


針對適用於 PostgreSQL 的 Azure 資料庫中的高 CPU 使用率進行疑難排解

本文描述如何識別高 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_autovacuumlast_autoanalyze 資料行會提供上次自動清理或分析資料表的日期和時間。 如果資料表未定期清理,請採取步驟來調整自動資料清理。

如需關於自動資料清理疑難排解和微調的詳細資訊,請參閱自動資料清理疑難排解

短期解決方案是針對觀察到緩慢查詢的資料表位置,執行手動資料清理分析:

VACUUM ANALYZE <table>;