文章目录
-
- 整体架构
- 关键变量
-
-
- PgStat_LocalState pgStatLocal; // (pg_stat.c:193)
- static dlist_head pgStatPending = DLIST_STATIC_INIT(pgStatPending); (pg_stat.c:218)
- static MemoryContext pgStatPendingContext = NULL;(pg_stat.c:210)
- static const PgStat_KindInfo pgstat_kind_infos[PGSTAT_NUM_KINDS] (pg_stat.c:218)
- 一些宏
-
- 关键数据结构
-
-
- PgStat_Kind (pg_stat.h:35)
- PgStat_HashKey (pgstat_internal.h:64)
- PgStatShared_HashEntry (pgstat_internal.h:64)
- PgStat_EntryRef (pgstat_internal.h:121)
- struct PgStatShared_XXX ((pgstat_internal.h:360))
- PgStatShared_Common (pgstat_internal.h:107)
- PgStat_LocalState (pgstat_internal.h:472)
- PgStat_ShmemControl (pgstat_internal.h:405)
- PgStat_SnapshotEntry (pg_stat.c:131)
- PgStat_KindInfo (pgstat_internal.h:182)
- PgStat_SubXactStatus (pgstat_internal.h:152)
-
- 关键函数
-
-
- pgstat_restore_stats() (pg_stat.c:407) => pgstat_read_statsfile() (pg_stat.c:1483)
-
整体架构
架构图整理如下:
- variable-numbered object统计架构理解
- fixed-numbered object统计架构理解
架构整体理解如下: - 统计系统对不同类型的对象进行统计。
某些类型的统计信息是为固定num的对象收集的(最常见的是1个),例如,checkpoint的统计信息。
其他类型的统计数据是针对可变num的对象(例如关系)收集的。
参见PgStat_KindInfo获取当前处理的统计信息的列表清单。 - 某些具有固定num的对象的统计信息:
统计数据存储在普通(非动态)共享内存中;
.可变num的对象的统计信息:
对象的统计信息存储在动态共享内存中,可以通过散列表dyhash寻址找到。
统计信息计数器不是HASH项(PgStatShared_HashEntry)的一部分,而是通过PgStatShared_HashEntry->body隔离分配的。
可变编号对象的统计在运行时由PgStat_HashKey寻址。 - 为了避免共享哈希表上的争用,每个backend,在共享哈希表前面,都有一个backend本地哈希表(pgStatEntryRefHash),
pgStatEntryRefHash中包含对共享哈希表项(shared hashtable entries)的引用(PgStat_EntryRef)。