Share via


適用於 PostgreSQL 的 Azure 資料庫 中的高記憶體使用率 - 彈性伺服器

適用於:適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器

本文介紹可能導致 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器記憶體使用率較高的常見案例和根本原因。

在本文章中,您將了解:

  • 關於疑難解答指南,以找出並取得減輕根本原因的建議。
  • 識別高記憶體使用率的工具。
  • 高記憶體和補救動作的原因。

疑難排解指南

使用 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器入口網站上可用的功能疑難解答指南,即可找到降低高記憶體案例可能的根本原因和建議。 如何設定疑難解答指南以使用它們,請遵循 設定疑難解答指南

識別高記憶體使用率的工具

請考慮下列工具來識別高記憶體使用率。

Azure 計量

使用 Azure 計量來監視用於明確日期和時間範圍的記憶體百分比。
針對主動式監視,請在計量上設定警示。 如需逐步指引,請參閱 Azure 計量

查詢存放區

查詢存放區 會自動擷取查詢及其運行時間統計數據的歷程記錄,並保留它們以供檢閱。

查詢存放區 可以將等候事件資訊與查詢運行時間統計數據相互關聯。 使用 查詢存放區 來識別在感興趣的期間具有高記憶體耗用量的查詢。

如需設定和使用 查詢存放區 的詳細資訊,請檢閱 查詢存放區

原因和補救動作

請考慮下列原因,並補救解決高記憶體使用率的動作。

伺服器參數

下列伺服器參數會影響記憶體耗用量,而且應該檢閱:

Work_Mem

參數 work_mem 會指定內部排序作業和哈希表在寫入暫存磁碟檔案之前要使用的記憶體數量。 它並非以每個查詢為基礎,而是根據排序和哈希作業的數目來設定。

如果工作負載有許多具有簡單聯結和最少排序作業的短期執行查詢,建議您保持較低的 work_mem。 如果有一些具有複雜聯結和排序的作用中查詢,建議您為work_mem設定較高的值。

很難得到正確的價值 work_mem 。 如果您注意到記憶體使用率高或記憶體不足問題,請考慮減少 work_mem

更安全的 work_mem 設定為 work_mem = Total RAM / Max_Connections / 16

預設值 work_mem = 4 MB。 您可以在多個層級上設定work_mem值,包括透過 Azure 入口網站 中的參數頁面在伺服器層級設定值。

良好的策略是在尖峰期間監視記憶體耗用量。

如果磁碟排序在這段期間發生且記憶體不足,請逐漸增加 work_mem ,直到您能夠達到可用記憶體與已使用記憶體之間的良好平衡,如果記憶體使用量看起來很高,請減少 work_mem

Maintenance_Work_Mem

maintenance_work_mem 適用於維護工作,例如清理、新增索引或外鍵。 此案例中的記憶體使用量是每個會話。

例如,假設有三個自動數據清理背景工作角色正在執行。

如果 maintenance_work_mem 設定為 1 GB,則合併的所有工作階段都會使用 3 GB 的記憶體。

maintenance_work_mem 值與多個執行中的會話一起用於清理/索引建立/新增外鍵可能會導致高記憶體使用率。 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器中伺服器參數允許的最大值為 maintenance_work_mem 2 GB。

共用緩衝區

參數 shared_buffers 會決定伺服器用於快取數據的內存量。 共用緩衝區的目標是要減少磁碟 I/O。

共用緩衝區的合理設定是 RAM 的 25%。 不建議針對最常見的工作負載設定大於 40% 的 RAM 值。

最大連線

適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器資料庫上的所有新連線和閑置連線最多會耗用 2 MB 的記憶體。 監視連線的其中一種方式是使用下列查詢:

select count(*) from pg_stat_activity;

當資料庫連線數目很高時,記憶體耗用量也會增加。

在有許多資料庫連線的情況下,請考慮使用 PgBouncer 之類的連接共用器。

如需 PgBouncer 的詳細資訊,請檢閱:

連線 集區

最佳做法

適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器提供 PgBouncer 作為內建連線共用解決方案。 如需詳細資訊,請參閱 PgBouncer

說明分析

從 查詢存放區 識別高記憶體耗用查詢之後,請使用 EXPLAIN 和 EXPLAIN ANALYZE 進一步調查並微調它們。

如需EXPLAIN命令的詳細資訊,請檢閱說明計劃