计算
弹性云服务器 ECS
Flexus云服务
裸金属服务器 BMS
弹性伸缩 AS
镜像服务 IMS
专属主机 DeH
函数工作流 FunctionGraph
云手机服务器 CPH
Huawei Cloud EulerOS
网络
虚拟私有云 VPC
弹性公网IP EIP
虚拟专用网络 VPN
弹性负载均衡 ELB
NAT网关 NAT
云专线 DC
VPC终端节点 VPCEP
云连接 CC
企业路由器 ER
企业交换机 ESW
全球加速 GA
安全与合规
安全技术与应用
Web应用防火墙 WAF
企业主机安全 HSS
云防火墙 CFW
安全云脑 SecMaster
DDoS防护 AAD
数据加密服务 DEW
数据库安全服务 DBSS
云堡垒机 CBH
数据安全中心 DSC
云证书管理服务 CCM
边缘安全 EdgeSec
态势感知 SA
威胁检测服务 MTD
CDN与智能边缘
内容分发网络 CDN
CloudPond云服务
智能边缘云 IEC
迁移
主机迁移服务 SMS
对象存储迁移服务 OMS
云数据迁移 CDM
迁移中心 MGC
大数据
MapReduce服务 MRS
数据湖探索 DLI
表格存储服务 CloudTable
云搜索服务 CSS
数据接入服务 DIS
数据仓库服务 GaussDB(DWS)
数据治理中心 DataArts Studio
数据可视化 DLV
数据湖工厂 DLF
湖仓构建 LakeFormation
企业应用
云桌面 Workspace
应用与数据集成平台 ROMA Connect
云解析服务 DNS
专属云
专属计算集群 DCC
IoT物联网
IoT物联网
设备接入 IoTDA
智能边缘平台 IEF
用户服务
账号中心
费用中心
成本中心
资源中心
企业管理
工单管理
国际站常见问题
ICP备案
我的凭证
支持计划
客户运营能力
合作伙伴支持计划
专业服务
区块链
区块链服务 BCS
Web3节点引擎服务 NES
解决方案
SAP
高性能计算 HPC
视频
视频直播 Live
视频点播 VOD
媒体处理 MPC
实时音视频 SparkRTC
数字内容生产线 MetaStudio
存储
对象存储服务 OBS
云硬盘 EVS
云备份 CBR
存储容灾服务 SDRS
高性能弹性文件服务 SFS Turbo
弹性文件服务 SFS
云硬盘备份 VBS
云服务器备份 CSBS
数据快递服务 DES
专属分布式存储服务 DSS
容器
云容器引擎 CCE
容器镜像服务 SWR
应用服务网格 ASM
华为云UCS
云容器实例 CCI
管理与监管
云监控服务 CES
统一身份认证服务 IAM
资源编排服务 RFS
云审计服务 CTS
标签管理服务 TMS
云日志服务 LTS
配置审计 Config
资源访问管理 RAM
消息通知服务 SMN
应用运维管理 AOM
应用性能管理 APM
组织 Organizations
优化顾问 OA
IAM 身份中心
云运维中心 COC
资源治理中心 RGC
应用身份管理服务 OneAccess
数据库
云数据库 RDS
文档数据库服务 DDS
数据管理服务 DAS
数据复制服务 DRS
云数据库 GeminiDB
云数据库 GaussDB
分布式数据库中间件 DDM
数据库和应用迁移 UGO
云数据库 TaurusDB
人工智能
人脸识别服务 FRS
图引擎服务 GES
图像识别 Image
内容审核 Moderation
文字识别 OCR
AI开发平台ModelArts
图像搜索 ImageSearch
对话机器人服务 CBS
华为HiLens
视频智能分析服务 VIAS
语音交互服务 SIS
应用中间件
分布式缓存服务 DCS
API网关 APIG
微服务引擎 CSE
分布式消息服务Kafka版
分布式消息服务RabbitMQ版
分布式消息服务RocketMQ版
多活高可用服务 MAS
事件网格 EG
企业协同
华为云会议 Meeting
云通信
消息&短信 MSGSMS
云生态
合作伙伴中心
云商店
开发者工具
SDK开发指南
API签名指南
Terraform
华为云命令行工具服务 KooCLI
其他
产品价格详情
系统权限
管理控制台
客户关联华为云合作伙伴须知
消息中心
公共问题
开发与运维
应用管理与运维平台 ServiceStage
软件开发生产线 CodeArts
需求管理 CodeArts Req
部署 CodeArts Deploy
性能测试 CodeArts PerfTest
编译构建 CodeArts Build
流水线 CodeArts Pipeline
制品仓库 CodeArts Artifact
测试计划 CodeArts TestPlan
代码检查 CodeArts Check
代码托管 CodeArts Repo
云应用引擎 CAE
开天aPaaS
云消息服务 KooMessage
云手机服务 KooPhone
云空间服务 KooDrive

内存使用率高问题定位及处理方法

更新时间:2025-02-12 GMT+08:00

内存使用率说明

PostgreSQL数据库中内存使用率主要是由共享内存和本地内存组成。

  • 共享内存:主要用于数据的缓冲区、wal日志的缓冲区等,以便提高读写性能。除此之外也包含一些全局信息,如进程、锁信息等。

    shared_buffers参数的值决定初始申请共享内存的大小,RDS for PostgreSQL设置该参数开始值为系统物理内存的25%,该参数合理设置区间为25%~40%,如超过物理内存的 40%,就会发现缓冲的效果并不明显,这是因为PostgreSQL是运行在文件系统之上的,若文件系统也有缓存,将导致双缓存过多,造成负面影响。

  • 本地内存:后台服务会申请一些本地内存,以便暂存一些不需要全局存储的数据,一般分为以下几类:
    • temp_buffers:设置每个会话用于访问临时表的本地缓冲区的最大块数量。
    • work_mem:内部排序聚合操作和hash表在使用临时磁盘文件时使用的内存缓冲区。注意:每个排序操作都会消耗一个work_mem内存,并不是一个SQL消耗一个。
    • maintenance_work_mem:维护操作使用的最大内存数。

指标异常说明(影响)

生产数据库的内存要有一定的冗余,正常使用应保持在70%以下,若内存使用率长期高于阈值,建议考虑扩大内存规格。当内存使用率超过阈值并产生告警时,可能会产生以下问题。

  • 系统会频繁地进行内存交换,数据会在内存与磁盘之前大量交换,会消耗大量CPU,使数据库性能下降,影响数据的读取和写入速度等。
  • 严重时可能会发生OOM,若发生OOM,数据库服务进程会发生重启,数据库会断开现有连接,且新连接无法接入。此时HA会重新拉起数据库,期间数据库会回放从上一次checkpoint到发OOM时之间产生的wal日志内容,以保证事务一致性。

问题排查思路

PostgreSQL数据库中引起内存增长的原因一般是:连接/活跃连接数、慢SQL、TPS、长连接等增加。当内存利用率突增或不符合预期,可以按照以下思路进行排查:

图1 排查思路

排查方法

  • 连接/活跃连接数
    • 通过管理控制台中的监控平台中内存使用率,连接数使用率,数据库连接数和活跃连接数监控项进行查看,查看目标时间段相关监控指标,观察指标是否同时增降。
    • 执行以下SQL,查看当前数据库最大连接数。
      show max_connections;
    • 执行以下SQL,查看当前数据库活跃连接数。
      select count(1) from pg_stat_activity where state <> 'idle';
    • 执行以下SQL,查看当前数据库空闲连接数。
      select count(1) from pg_stat_activity where state = 'idle';
  • 慢SQL
    • 通过管理控制台中的监控平台中内存使用率,已执行1s的SQL数,已执行3s的SQL数和已执行5s的SQL数监控项进行查看,查看目标时间段相关监控指标,观察指标是否同时增降。
    • 执行以下SQL,查看当前正在运行时长前三慢SQL(RDS for PostgreSQL 10及以上版本),检查返回的query字段中sql是否使用join、order等语法。

      select (extract(epoch from now() - query_start)) query_time, datname, usename, client_addr, wait_event, state, query from pg_stat_activity where state not like 'idle%' and query_start is not null and backend_type = 'client backend' and pid <> pg_backend_pid() order by 1 desc limit 3;

    • 通过查询pg_stat_statements视图,获取统计信息并查询最耗共享内存的SQL,详见4
  • TPS

    通过管理控制台中的监控平台中内存使用率,TPS监控项进行查看,查看目标时间段相关监控指标,观察指标是否同时增降。

  • 长连接
    • 执行以下SQL,查看正在运行时长前三的长连接(RDS for PostgreSQL 10及以上版本),其中返回的“conn_time”字段为连接存活时长,“query”字段为该进程执行的SQL。
      select (extract(epoch from now()-backend_start)) conn_time, datname, pid, usename, client_addr, wait_event_type, wait_event, state, query from pg_stat_activity where backend_type = 'client backend' order by conn_time desc nulls last limit 3;
    • 长连接会在数据库中会保持一个持久的连接状态,这个连接状态会维持一些缓存信息,如查询结果、事务信息、锁信息等等。如果长连接数量和连接时间较大,缓存的信息也会相应增多,从而占用更多的内存。需要进一步排查时,可通过上一条SQL返回的“query”字段查询pg_stat_statements视图,查看该SQL的共享内存消耗情况。
      select userid::regrole, dbid, shared_blks_hit, shared_blks_dirtied from pg_stat_statements where query =  'query';

解决方法

  • 连接/活跃连接数

    若连接数或空闲连接数过多,可执行如下SQL释放当前数据库的所有空闲连接,使用连接池或配置客户端连接超时参数及时释放空闲的连接。若活跃连接数过多,可减少业务并发量,或扩大内存规格。您也可以kill不需要的会话,降低实例内存消耗,详见紧急Kill会话

    说明:

    kill会话操作可能会导致业务断连,建议业务有重连机制,请谨慎操作。

    select pg_terminate_backend(pid) from pg_stat_activity where state = 'idle';
  • 慢SQL被大量执行

    定位到导致内存消耗增加的SQL,对SQL进行优化,或扩大内存规格。

  • TPS事务数过高

    降低事务数,或扩大内存规格。

  • 长连接数量多/连接存活时长久

    避免长连接,长连接的缓存可能较大,导致内存不足,建议定期释放长连接。

常见问题

Q:使用pg_dump时导出数据时,为什么内存使用率会升高,如何避免出现该问题?

A:使用pg_dump导出数据时,有一个进程会访问目标库中所有的表、索引等对象来获取结构数据,如果访问的表、索引等对象过大,可能会导致 relcache(关系表缓存)、catcache(系统目录表缓存)过大,且无法释放,从而导致存使用率升高,严重时会发生OOM。

建议执行pg_dump任务时:

  1. 不要执行DDL操作。
  2. 监控好慢SQL的指标,出现锁冲突时直接kill掉对应冲突的进程。
  3. 低峰期执行pg_dump任务。
  4. 将shared_buffers、work_mem参数继续降低到当前的1/2或1/4甚至更多,任务结束后回退修改的参数。
  5. 扩大内存规格。

我们使用cookie来确保您的高速浏览体验。继续浏览本站,即表示您同意我们使用cookie。 详情

文档反馈

文档反馈

意见反馈

0/500

标记内容

同时提交标记内容