2.5.6 PgStat统计数据收集进程

PgStat辅助进程是PostgreSQL数据库系统的统计信息收集器,它专门负责收集数据库系统运行中的统计信息,如在一个表和索引上进行了多少次插入与更新操作、磁盘块的数量和元组的数量、每个表上最近一次执行清理和分析操作的时间,以及统计每个用户自定义函数调用执行的时间等。由于统计数据收集给查询处理增加了一些负荷,所以可以把系统配置为收集信息,也可以配置为不收集信息。系统表pg_statistic中存储了PgStat收集的各类统计信息,另外在数据库集簇的目录下有与统计信息收集器相关的文件:global子文件夹下的pgstat.stat文件用于保存当前全局的统计信息;pg_stat_tmp文件则是PgStat进程和各个后台进程进行交互的临时文件所在地。

PgStat辅助进程收集的统计信息主要用于查询优化时的代价估算。在PostgreSQL的查询优化过程中,查询请求的不同执行方案是通过建立不同的路径(Path)来表达的。在生成了许多符合条件的路径之后,从中选择出代价最小的路径转化为一个计划,这个计划将被传递给执行器执行。因此优化器的核心工作就是建立许许多多的路径,然后从中找出最优的路径。造成同一个查询请求有不同路径的主要原因是:表不同的访问方式(如顺序访问(Sequential Access)、索引访问(Index Access),PostgreSQL中还有可能使用TID直接访问元组);表间不同的连接方式(嵌套循环连接(Nest-loop join)、归并连接(Merge Join)、Hash连接(Hash Join));表间不同的连接顺序(左连接(Left-join)、右连接(Right-join)、布希连接(Bushy-join))。而评价路径优劣的依据是用系统表pg_statistic中的系统统计信息估计出的不同路径的代价。

在PostgreSQL数据库系统配置文件postgresql.conf中与PgStat相关的配置选项有:

track_activities:表示是否对会话中当前执行的命令开启统计信息收集功能,该参数只对超级用户和会话所有者可见,默认值为on(开启)。

track_counts:表示是否对数据库活动开启统计信息收集功能,由于在AutoVacuum自动清理进程中选择清理的数据库时,需要数据库的统计信息,因此该参数默认值为on。

track_function:表示是否开启函数的调用次数和调用耗时统计。

track_activity_query_size:设置用于跟踪每一个活动会话的当前执行命令的字节数,默认值为1024,只能在数据库启动后设置。

统计信息功能设置为启动状态时,在Postmaster进程启动数据库过程完成后,将通过pgstat_init函数对PgStat辅助进程进行初始化操作,创建用于和后台进程之间通信的UDP端口。在PgStat辅助进程中调用select函数(或者poll)来监听UDP端口上的数据变化,当后台进程通过UDP端口向统计收集进程发送统计消息时将触发监听过程,PgStat进程根据消息类型进入相应的处理接口。

在PgStat辅助进程中定义了可以处理的消息类型,不同的消息类型在PgStat进程中定义了对应的描述结构(数据结构2.8)。

数据结构2.8 StatMsgType

    typedef enum StatMsgType  
    {  
    PGSTAT_MTYPE_DUMMY,            //空信息  
    PGSTAT_MTYPE_INQUIRY,//通知收集器写统计文件消息  
    PGSTAT_MTYPE_TABSTAT,//发送表和缓冲访问统计消息  
    PGSTAT_MTYPE_TABPURGE,//发送无效表的消息  
    PGSTAT_MTYPE_DROPDB,//发送删除的数据库信息消息  
    PGSTAT_MTYPE_RESETCOUNTER,//通知收集器重置技术器消息  
    PGSTAT_MTYPE_AUTOVAC_START,//发送一个数据库即将被清理的消息  
    PGSTAT_MTYPE_VACUUM,//发送VACUUM或者VACUUM ANALYZE执行完消息  
    PGSTAT_MTYPE_ANALYZE,//发送ANALYZE执行完消息  
    PGSTAT_MTYPE_BGWRITER,//bgwriter通知更新统计信息消息  
    PGSTAT_MTYPE_FUNCSTAT,//发送函数使用统计信息消息  
    PGSTAT_MTYPE_FUNCPURGE//发送无效函数的消息  
    }StatMsgType;

对于不同类型的消息,有对应的数据结构表示。这里以删除数据库消息(数据结构2.9)为例说明。

数据结构2.9 PgStat_MsgDropdb

    typedef struct PgStat_MsgDropdb  
    {  
    PgStat_MsgHdr  m_hdr;            //消息头部信息,记录消息的类型和长度  
    Oidm_databaseid;//要删除的数据库的OID  
    }PgStat_MsgDropdb;

其中,m_databaseid是要删除的数据库的OID,而m_hdr则是一个消息头(数据结构2.10)。m_hdr中记录了当前消息的类型以及整个消息的长度。

PgStat进程被初始化之后,将进入pgstat_start函数。在pgstat_start中,首先会检查PgStat进程的初始化函数pgstat_init是否成功创建UDP Socket端口,如果创建失败,则退出PgStat进程;否则创建PgStat进程。最后进入PgStat进程

数据结构2.10 PgStat_MsgHdr

    typedef struct PgStat_MsgHdr  
    {  
    StatMsgType m_type;        //消息类型  
    int          m_size;//消息长度  
    }PgStat_MsgHdr;

的PgstatCollectorMain函数。其处理流程如图2-14所示。

(点击查看大图)图2-14 PgstatCollectorMain处理流程

下面对几个重要步骤加以说明:

1)在初始化阶段,会读取默认位置(数据集簇中的global子目录下)的统计信息文件pgstat.stat。从统计文件中读取数据库、表、函数的统计信息,构建数据库统计信息的Hash表。若读取失败或是第一次启动,则各种统计信息计数器被设置为0。

2)如果最近更新统计文件时间小于最近申请读统计文件的时间,需要将统计信息临时文件中最新的统计信息写入pgstat.stat文件中,并设置最近更新统计文件时间和最近申请读统计文件时间为当前系统时间;最近申请读统计文件的时间由PGSTAT_MTYPE_INQUIRY消息设置。

3)在PgStat辅助进程的工作循环中,将在创建的UDP Socket端口上使用select(或者poll)进行监听。当端口上有可读数据时(即有其他后台进程发送了统计消息),则从端口中读取消息,对正确的消息(即消息中包含的消息类型是正确的)根据消息中的消息头包含的消息类型进入相应的消息处理分支,而错误的消息直接忽略掉。

4)如果UDP Socket端口监听超时,将检查Postmaster状态,若Postmaster失效或者PgStat接收到退出消息,则退出PgStat进程。在退出前要将数据库、表、函数的统计信息写入pgstat.stat文件,并删除pg_stat_tmp中的临时文件。

对于PgStat收集的统计信息,系统提供了部分标准视图以供管理员查看;同时,还提供了统计信息相关的操作函数,供管理员来定义视图。需要注意的是,使用的统计信息并非实时的,每个活动的独立数据库服务仅仅在处理空闲时才发送信息到统计信息收集器,因此查询或者事务仍然在处理中并未更新当前的统计信息。在设置了track_activities参数时,当前查询信息在统计信息收集器中是实时的。

【责任编辑:云霞TEL:(010)68476606】

results matching ""

    No results matching ""