Azure Database for PostgreSQL 灵活服务器中的内存利用率过高

适用于: Azure Database for PostgreSQL 灵活服务器

本文介绍可能导致 Azure Database for PostgreSQL 灵活服务器中内存使用率过高的常见情况和根本原因。

本文内容:

  • 关于故障排除指南(用于确定根本原因并获取缓解它们的建议)。
  • 用于识别高内存利用率的工具。
  • 高内存的原因以及补救操作。

疑难解答指南

使用 Azure Database for PostgreSQL 灵活服务器门户上提供的功能故障排除指南,可以找到可能的根本原因和缓解高内存情况的建议。 有关如何设置故障排除指南以使用它们的信息,请遵循设置故障排除指南

用于识别高内存利用率的工具

请考虑使用以下工具来识别高内存利用率。

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 值以及用于清空/索引创建/添加外键的多个正在运行的会话可能会导致内存使用率过高。 Azure Database for PostgreSQL 灵活服务器中 maintenance_work_mem 服务器参数的最大允许值为 2 GB。

共享缓冲区

shared_buffers 参数确定服务器专用于缓存数据的内存量。 共享缓冲区的目的是减少磁盘 I/O。

共享缓冲区的合理设置是 RAM 为 25%。 对于最常见的工作负荷,不建议设置大于 40% 的 RAM 值。

最大连接数

Azure Database for PostgreSQL 灵活服务器数据库上的所有新连接和空闲连接最多占用 2 MB 内存。 监视连接的一种方法是使用以下查询:

select count(*) from pg_stat_activity;

当数据库的连接数较高时,内存消耗也会增加。

如果存在许多数据库连接,请考虑使用连接池器(如 PgBouncer)。

有关 PgBouncer 的更多详细信息,请查看:

连接池器

最佳做法

Azure Database for PostgreSQL 灵活服务器将 PgBouncer 作为内置连接池解决方案予以提供。 有关详细信息,请参阅 PgBouncer

Explain Analyze

从查询存储识别高内存消耗查询后,请使用 EXPLAIN 和 EXPLAIN ANALYZE 进一步对其进行调查和优化。

有关 EXPLAIN 命令的详细信息,请查看 Explain 计划