详解瀚高数据库PDR性能诊断报告 pdr功能介绍通常国产数据库运维是一个难点,特别是DBA人员对数据库进行性能分析时,使用一些工具等手段会大大降低分析难度。瀚高数据库(以下简称HGDB)提供性能监控与诊断工具pdr,实现了周期性的收集、处理、持久化和维护性能统计数据,主要用于数据库性能问题的诊断与解决,可以用来作为一段时期内数据库性能调整的参考。另外,pdr可以生成简单明了、信息丰富和分类清晰的HTML格式性能诊断报告,让DBA人员阅读起来非常方便。pdr实现原理HGDB的Postmaster负责fork出postgres进程,用于相应用户的查询请求,同时还fork出若干辅助进程,用于支持HGDB的运行。pdr也是在postmaster启动时,注册的一个后台工作者进程。后台工作者进程hgPdr会使用SPI接口,对HGDB内核进行直接访问,实现统计信息的采集和存储。采集数据的过程类似于PgStat,不同之处在于,hg_pdr不会反馈采集信息给HGDB。pdr启动后,首先初始化SPI接口,用于统计信息的采集和保存。所有信息保存在一个_pg_pdr模式中。_pg_pdr模式一共有四个表,分别保存等待事件信息、SQL执行信息、Database基本信息以及Table基本信息。 默认情况下,每隔一个小时,pdr会采集一次信息,将这些信息存入hg_pdr_ 模式的四个表里。每一条信息都带有一个快照id,用以识别采集的数据属于哪 个时间段。这些数据,Database基本信息和Table基本信息,来自于HGDB自带的PgStat进程,pdr直接从共享内存中将这部分数据读取出来,并存入_pg_pdr_的表中。SQL执行信息来自pg_stat_statements插件,这部分信息也是保存在共享内存中的,可以通过相关函数直接读出。等待事件目前使用了pg_wait_sampling插件,对pg_stat_activity视图进行高频采样,将等待事件进行保存。_pg_pdr_中保存的统计信息,默认保留7天,超过7天的信息会被清理,以节约存储空间。HGDB还提供一个pdr_report工具,用于生成性能分析报告。pdr_report工具会连接HGDB,将用户指定的时间段内的数据库信息取出,再结合报告模板,生成一份HTML格式的报告。当使用pdr_report工具时,用户需要指定生成的数据库名,快照id的起止范围,生成报告的文件名。pdr_report工具会根据这些信息,从数据库中把用户指定的信息读取出来,填写到pdr_report.html模板中,最终生成pdr报告。 shared_preload_libraries='worker_pg_pdr,pg_stat_statements,pg_wait_sampling' 模板文件存放在share目录下,模板文件的样式可以进行修改,不会影响到报告的生成。使用pdr1、启用pdrHGDB初始化完成后,实际上已经包含了pdr功能,我们只需要通过配置postgresql.conf来启用: ps-ef|greppostgres 完成修改后,重启数据库,pdr功能启用成功。让我们查看一下后台进程情况: pg_pdr.naptime=60 #快照的产生间隔,单位为分钟,默认为60分钟产生一次 快照。naptime=0时,代表不启用PDR功能。 pg_pdr.naplife=7#快照的保存时间,单位为天,默认保存最近7天的快照。超过naplife的快照,会自动删除。 pg_pdr.napdb='highgo'#用于保存PDR快照数据表的数据库,默认设置为highgo 数据库。 2、配置pdr通过修改postgresql.conf中pdr相关参数,可以对pdr进行配置。 3、使用pdr初次安装和使用pdr时,采集的第一个快照id是0,用户可以用于生成性能分析报告的快照id是从1开始的。每采集一次快照,snap_id加1。生成快照的时机有两种。(1)自动快照:在数据库启动1分钟后自动产生一次快照,然后根据配置文件中的pg_pdr.naptime自动产生后续快照,无需操作。(2)手动快照:在psql中输入selectpg_pdr_new_snap()即可立即产生一次快照。psql返回t,表示生成快照成功。psql返回f,表示生成快照 。 失败4、生成报 告使用pdr_report命令,可以生成性能分析报告。pdr生成的快照存储在napdb配置的数据库中,快照包含整个数据集簇中所有数据库的性能信息。按照提示,依次输入数据库用户名、用户密码、快照存储数据库名、报告目标数据库名、开始快照id、结束快照id、报告文件名后即可生成报告。 性能分析报告为html网页格式,可在浏览器中打开和使用。5、阅读pdr报告(1)基本信息部分,包括数据库、硬件环境、报告生成时间等基础信息。 (2)负载概要,主要显示数据库的主要负载情况。 此外在摘要部分我们还看到前台事件等待top10的情况。 (3) 等待状态首先是HGDB的三种锁spinlock,lwlock和lock的等待情况。 LWLock是一种基于spinlock机制实现的轻量级的锁,有互斥、共享、WAITUNTILFREE三种锁模式; Lock是和Oracleenqueue类似的普通锁,用于操作HGDB中的数据对象的。从Lock锁的等待 情况中可以分析HGDB的锁的争用情况,从而用于优化HGDB配置与应用程 序。BufferPinwait 状态可以用于辅助分析热块争用与缓冲池的效率,该锁是保护内存结构用的(和Oraclelatch类似),采用硬件和操作系统提供的testandset原子操作来实现。接下来是client、extension、IPC三个等待状态。客户端等待状态可以用于分析客户端或者应用的性能与负载情况,extension等待可以用于分析数据文件的扩展情况。IPCWait可以用于分析数据库中的进程间通讯是否正常。 然后是用于分 析数据库中的超时以及IO等待统计。 (4)实例统计信 息(5)SQL 统计,统计了耗时SQL以及5类topSQL:CPU占用、IO占用、缓存命中、物理读和执行次数。 接下来的信息显示了topsql语句的完整的文本内容。 (6)IO统计信息,分别按照功能、缓冲区、对象进行统计。 (7)Segment统计,分别按照逻辑读、物理读、全表扫描进行统计。 pdr总结HGDB的pdr功能主要作用是收集数据库和操作系统相关信息,为 HGDB在运行过程中产生的性能问题提供诊断信息。