性能洞察

性能洞察(Performance Insights)是一项专注于用户数据库实例性能调优、负载监控和关联分析的重要工具。它能够帮助您直观地评估数据库负载、识别资源等待的源头及相关SQL查询语句,从而实现精准的性能优化。

功能简介

性能洞察能够帮助您快速、方便且直接地识别数据库实例的负载,以及导致性能问题的SQL语句。主要包含以下功能:

  • 关键性能指标趋势图:内存/CPU使用率、会话连接、TPSIOPS的变化趋势图。

  • 平均活跃会话(AAS,Average Active Sessions):实时追踪实例负载,清晰展示负载来源。

  • 多维负载信息:从SQL、用户(User)、数据库(Databases)、等待事件(Waits)、客户端主机(Hosts)、应用(Applications)和会话类别(Session Type)等维度展示实例负载信息。

适用范围

RDS PostgreSQL满足以下要求:

  • 数据库大版本:RDS PostgreSQL 13及以上。

  • 产品系列:高可用系列、集群系列。

  • 内核小版本:20240530及以上。

操作步骤

步骤一:开启性能洞察

  1. 访问RDS实例列表,在上方选择地域,然后单击目标实例ID。

  2. 在左侧导航栏中,选择监控与报警。在性能洞察页签。

  3. 单击开启性能洞察按钮,在弹出的对话框中单击确定开启功能。

    image

    说明

    如果您不再使用性能洞察功能,可以单击性能洞察页面的关闭性能洞察,关闭此功能。

  4. 开启后,等待片刻,性能洞察页面将开始展示数据。

步骤二:使用性能洞察进行分析

成功开启功能后,您可以在性能洞察页面内进行全面的性能分析。

重要

目前性能洞察处于免费公测期,数据保留7天。正式版支持按需延长数据保留时长,收费将提前通知。

查看性能概览(默认视图)

进入性能洞察页面后,您可以选择时间范围,单击查看,分析以下核心信息:

  • 关键性能指标趋势图:快速了解实例的CPU/内存、连接数、TPSIOPS等核心指标在选定时间段内的变化趋势。

  • 平均活跃会话(AAS):这是性能诊断的核心图表。通过它,您可以直观地看到实例的总负载(AAS值)以及负载的构成(按等待事件、SQL等维度)。AAS图中的高峰通常对应性能瓶颈点。

  • 多维负载信息:在AAS图表下方,您可以从SQL用户(User)、数据库(Databases)、等待事件(Waits)等多个维度下钻分析,快速定位是哪些SQL、用户或等待事件造成了高负载。

image

故障诊断案例:慢SQL突增导致的锁争用问题

故障现象

监控显示从某时刻开始,慢SQL数量急剧上升,应用响应时间显著恶化。

诊断分析

步骤1:性能指标趋势分析

检查关键性能指标趋势图,发现00:34时刻活跃会话数从正常的十几个大幅上升至1100+,超过PostgreSQL实例的合理并发处理能力。

image

步骤2:等待事件分析

通过平均活跃会话(AAS)图表的等待事件分布,识别出主要瓶颈集中在:

  • Lock/transactionid:事务ID锁等待,通常由长事务或死锁引起。

  • Lock/tuple:行级锁等待,表明存在严重的并发写入冲突。

活跃会话数超过16CPU的理论处理上限,确认系统处于严重的锁争用状态。

image

步骤3:SQL语句分析

Top SQL排行显示,前两个查询分别有220119个会话在等待锁资源释放,这些SQL成为整个锁等待链的关键节点。

image

步骤4:来源追溯

结合Top HostsTop Databases数据,锁定问题源头:

  • 异常客户端:140.205.XXX.XXX

  • 目标数据库:perf_test

image

根因分析

故障类型:锁争用雪崩

技术原理

  • 触发原因:客户端对perf_test数据库发起高并发DML操作,可能涉及热点行更新或大事务处理

  • 失控机制:PostgreSQL的锁管理机制中,当多个事务竞争相同资源时,后续事务将进入等待队列。由于缺乏连接数限制和锁等待超时控制,新连接持续涌入,形成锁等待的恶性循环。

解决方案

即时措施

  1. 限制异常客户端IP的连接数

    ALTER ROLE target_user CONNECTION LIMIT 10;   -- target_user:数据库用户名
  2. 终止长时间等待的会话

    -- 先查看要终止的会话详情
    SELECT 
        pid,                                    -- 进程ID(会话标识)
        usename,                                -- 数据库用户名
        state,                                  -- 会话状态(active/idle等)
        wait_event,                             -- 等待事件具体类型
        now() - query_start AS query_duration,  -- 当前查询已执行时长
        left(query, 50) AS query_preview        -- SQL语句预览(前50字符)
    FROM pg_stat_activity 
    WHERE datname = 'perf_test'                 -- 限定数据库名称
      AND client_addr = '140.205.XXX.XXX'       -- 限定客户端IP地址
      AND state = 'active'                      -- 仅查询活跃状态的会话
      AND wait_event_type = 'Lock'              -- 仅查询正在等待锁的会话
      AND pid <> pg_backend_pid()               -- 排除当前执行此查询的会话(避免自杀)
      AND now() - query_start > interval '5 minutes';  -- 查询执行时长超过5分钟
      
    -- 确认无误后再执行终止
    SELECT pg_terminate_backend(pid) 
    FROM pg_stat_activity 
    WHERE datname = 'perf_test'
      AND client_addr = '140.205.XXX.XXX'
      AND state = 'active' 
      AND wait_event_type = 'Lock'
      AND pid <> pg_backend_pid()
      AND now() - query_start > interval '5 minutes';
    
    -- 确认目标会话是否已清理
    SELECT pid, usename, state, query 
    FROM pg_stat_activity 
    WHERE datname = 'perf_test'
      AND client_addr = '140.205.XXX.XXX';    

长期优化

  1. 连接池配置:部署PgBouncer等连接池,控制最大并发连接数。

  2. 超时参数调优

    -- 设置锁等待超时
    ALTER DATABASE perf_test SET lock_timeout = '30s';
    -- 设置语句执行超时
    ALTER DATABASE perf_test SET statement_timeout = '60s';
  3. 应用层优化

    • 减小事务粒度,避免长事务。

    • 使用乐观锁或分布式锁机制处理热点数据。

    • 实施读写分离,将只读查询分流至从库。

  4. 监控告警:配置活跃连接数和锁等待时间的监控阈值,实现故障预警。

通过这种系统性的诊断方法,可以快速定位PostgreSQL性能问题的根本原因,并制定针对性的解决方案。