中那些消耗 和 CPU PostgreSQL I 如何发现
装置
要求
pg_stat_kcache以一个裁减的方式提供,允许 PostgreSQL 9.4 或更高版本,并且须要曾经装置好 pg_stat_statements 裁减。须要 PostgreSQL 9.4 或更高版本,由于以前版本提供的 pg_stat_statements 没有提供 queryid 字段。
从 PGDG 软件仓库
假设您从 PGDG 软件仓库(Debian/Ubuntu <上的 APT 或 RHEL/Rocky <上的 YUM)装置了 PostgreSQL,那么介绍的装置方法是从相反的软件仓库去失掉它。
关于 Debian/Ubuntu:
apt install postgresqlXYpgstatkcache
和 RHEL/Rocky:
yum install pg_stat_kcacheXY
或许对 PostgreSQL 11 及更高版本:
yum install pg_stat_kcache_XY
(其中 XY 是您的 PostgreSQL 主版本编号)
编译
该模块可以经常使用规范的 PGXS 机制来构建。为此,pg_config程序必定在您的$PATH性能中可用。装置步骤如下:
git clone https:cd pg_stat_kcachemakemake install
PostgreSQL 设置
如今可以经常使用该裁减了。然而,由于它须要一些共享内存来保留其计数器,因此必定在 PostgreSQL 启动时加载该模块。因此,您必定在postgresql.conf中将模块增加到shared_preload_libraries。您须要从新启动主机,能力运行性能更改。由于此裁减须要依赖 pg_stat_statements,因此还须要将其增加到shared_preload_libraries。
将以下参数增加到您的postgresql.conf中:
shared_preload_libraries
从新启动 PostgreSQL 实例后,您可以在须要访问统计信息的每个数据库中装置该裁减:
性能
可以在postgresql.conf中,性能以下 GUC 参数:
•pg_stat_kcache.linux_hz(整型,自动值 -1):告知pg_stat_kcache在 linux 中的 CONFIG_HZ 性能选项值。这用于pg_stat_kcache补救采样误差。自动值为 -1,尝试在启动时猜想它。
•pg_stat_kcache.track(枚举型,自动 top):控制pg_stat_kcache跟踪哪些语句。指定 top 以跟踪顶层语句(由客户端间接纳回的语句),指定 all 以跟踪包含嵌套语句在内的一切语句(例如在函数中调用的语句),或指定 none 以禁用语句统计信息搜集。
•pg_stat_kcache.track_planning(布尔型,自动 off):控制pg_stat_kcache能否跟踪布局的操作和继续期间(须要 PostgreSQL 13 或更高版本)。
用法
pg_stat_kcache会创立多个对象。
pg_stat_kcache 视图
称号 |
类型 |
形容 |
datname |
name |
数据库的称号 |
plan_user_time |
double precision |
在此数据库中布局语句时经常使用的用户层 CPU 期间(以秒和毫秒为单位)(须要启用 pg_stat_kcache.track_planning,否则为零) |
plan_system_time |
double precision |
在此数据库中布局语句时经常使用的系统层 CPU 期间(以秒和毫秒为单位)(须要启用 pg_stat_kcache.track_planning,否则为零) |
plan_minflts |
bigint |
在此数据库中布局语句时出现的页面回收(软页面失误)次数(须要启用 pg_stat_kcache.track_planning,否则为零) |
plan_majflts |
bigint |
在此数据库中布局语句时出现的页面失误(硬页面失误)次数(须要启用 pg_stat_kcache.track_planning,否则为零) |
plan_nswaps |
bigint |
在此数据库中布局语句时出现的换入换出次数(须要启用 pg_stat_kcache.track_planning,否则为零) |
plan_reads |
bigint |
在此数据库中布局语句时由文件系统层读取的字节数(须要启用 pg_stat_kcache.track_planning,否则为零) |
plan_reads_blks |
bigint |
在此数据库中布局语句时由文件系统层读取的 8K 块数(须要启用 pg_stat_kcache.track_planning,否则为零) |
plan_writes |
bigint |
在此数据库中布局语句时由文件系统层写入的字节数(须要启用 pg_stat_kcache.track_planning,否则为零) |
plan_writes_blks |
bigint |
在此数据库中布局语句时由文件系统层写入的 8K 块数(须要启用 pg_stat_kcache.track_planning,否则为零) |
plan_msgsnds |
bigint |
在此数据库中布局语句时发送的 IPC 信息数(须要启用 pg_stat_kcache.track_planning,否则为零) |
plan_msgrcvs |
bigint |
在此数据库中布局语句时收到的 IPC 信息数(须要启用 pg_stat_kcache.track_planning,否则为零) |
plan_nsignals |
bigint |
在此数据库中布局语句时接纳的信号数(须要启用 pg_stat_kcache.track_planning,否则为零) |
plan_nvcsws |
bigint |
在此数据库中布局语句时主动出现的高低文切换次数(须要启用 pg_stat_kcache.track_planning,否则为零) |
plan_nivcsws |
bigint |
在此数据库中布局语句时主动出现的高低文切换次数(须要启用 pg_stat_kcache.track_planning,否则为零) |
exec_user_time |
double precision |
在此数据库中口头语句时所用的用户层 CPU 期间(以秒和毫秒为单位) |
exec_system_time |
double precision |
在此数据库中口头语句时所用的系统层 CPU 期间(以秒和毫秒为单位) |
exec_minflts |
bigint |
在此数据库中口头语句时出现的页面回收(软页面失误)次数 |
exec_majflts |
bigint |
在此数据库中口头语句时出现的页面失误(硬页面失误)次数 |
exec_nswaps |
bigint |
在此数据库中口头语句时出现的换入换出次数 |
exec_reads |
bigint |
在此数据库中口头语句时由文件系统层读取的字节数 |
exec_reads_blks |
bigint |
在此数据库中口头语句时由文件系统层读取的 8K 块数 |
exec_writes |
bigint |
在此数据库中口头语句时由文件系统层写入的字节数 |
exec_writes_blks |
bigint |
在此数据库中口头语句时由文件系统层写入的 8K 块数 |
exec_msgsnds |
bigint |
在此数据库中口头语句时发送的 IPC 信息数 |
exec_msgrcvs |
bigint |
在此数据库中口头语句时收到的 IPC 信息数 |
exec_nsignals |
bigint |
在此数据库中口头语句时接纳的信号数 |
exec_nvcsws |
bigint |
在此数据库中口头语句时主动出现的高低文切换次数 |
exec_nivcsws |
bigint |
在此数据库中口头语句时主动出现的高低文切换次数 |
pg_stat_kcache_detail 视图
称号 |
类型 |
形容 |
query |
text |
查问文本 |
top |
bool |
假设语句是顶层的,则为 True |
datname |
name |
数据库的称号 |
rolname |
name |
角色称号 |
plan_user_time |
double precision |
在此数据库中布局语句时经常使用的用户层 CPU 期间(以秒和毫秒为单位)(须要启用 pg_stat_kcache.track_planning,否则为零) |
plan_system_time |
double precision |
在此数据库中布局语句时经常使用的系统层 CPU 期间(以秒和毫秒为单位)(须要启用 pg_stat_kcache.track_planning,否则为零) |
plan_minflts |
bigint |
在此数据库中布局语句时出现的页面回收(软页面失误)次数(须要启用 pg_stat_kcache.track_planning,否则为零) |
plan_majflts |
bigint |
在此数据库中布局语句时出现的页面失误(硬页面失误)次数(须要启用 pg_stat_kcache.track_planning,否则为零) |
plan_nswaps |
bigint |
在此数据库中布局语句时出现的换入换出次数(须要启用 pg_stat_kcache.track_planning,否则为零) |
plan_reads |
bigint |
在此数据库中布局语句时由文件系统层读取的字节数(须要启用 pg_stat_kcache.track_planning,否则为零) |
plan_reads_blks |
bigint |
在此数据库中布局语句时由文件系统层读取的 8K 块数(须要启用 pg_stat_kcache.track_planning,否则为零) |
plan_writes |
bigint |
在此数据库中布局语句时由文件系统层写入的字节数(须要启用 pg_stat_kcache.track_planning,否则为零) |
plan_writes_blks |
bigint |
在此数据库中布局语句时由文件系统层写入的 8K 块数(须要启用 pg_stat_kcache.track_planning,否则为零) |
plan_msgsnds |
bigint |
在此数据库中布局语句时发送的 IPC 信息数(须要启用 pg_stat_kcache.track_planning,否则为零) |
plan_msgrcvs |
bigint |
在此数据库中布局语句时收到的 IPC 信息数(须要启用 pg_stat_kcache.track_planning,否则为零) |
plan_nsignals |
bigint |
在此数据库中布局语句时接纳的信号数(须要启用 pg_stat_kcache.track_planning,否则为零) |
plan_nvcsws |
bigint |
在此数据库中布局语句时主动出现的高低文切换次数(须要启用 pg_stat_kcache.track_planning,否则为零) |
plan_nivcsws |
bigint |
在此数据库中布局语句时主动出现的高低文切换次数(须要启用 pg_stat_kcache.track_planning,否则为零) |
exec_user_time |
double precision |
在此数据库中口头语句时所用的用户层 CPU 期间(以秒和毫秒为单位) |
exec_system_time |
double precision |
在此数据库中口头语句时所用的系统层 CPU 期间(以秒和毫秒为单位) |
exec_minflts |
bigint |
在此数据库中口头语句时出现的页面回收(软页面失误)次数 |
exec_majflts |
bigint |
在此数据库中口头语句时出现的页面失误(硬页面失误)次数 |
exec_nswaps |
bigint |
在此数据库中口头语句时出现的换入换出次数 |
exec_reads |
bigint |
在此数据库中口头语句时由文件系统层读取的字节数 |
exec_reads_blks |
bigint |
在此数据库中口头语句时由文件系统层读取的 8K 块数 |
exec_writes |
bigint |
在此数据库中口头语句时由文件系统层写入的字节数 |
exec_writes_blks |
bigint |
在此数据库中口头语句时由文件系统层写入的 8K 块数 |
exec_msgsnds |
bigint |
在此数据库中口头语句时发送的 IPC 信息数 |
exec_msgrcvs |
bigint |
在此数据库中口头语句时收到的 IPC 信息数 |
exec_nsignals |
bigint |
在此数据库中口头语句时接纳的信号数 |
exec_nvcsws |
bigint |
在此数据库中口头语句时主动出现的高低文切换次数 |
exec_nivcsws |
bigint |
在此数据库中口头语句时主动出现的高低文切换次数 |
pg_stat_kcache_reset 函数
重置 pg_stat_kcache 搜集的统计信息。可以由超级用户调用:
pg_stat_kcache_reset
pg_stat_kcache 函数
此函数是一个汇合前往函数,用于输入共享内存结构中计数器的内容。pg_stat_kcache 视图会经常使用此函数。该函数可以被任何用户调用:
pg_stat_kcache
它提供以下列:
称号 |
类型 |
形容 |
queryid |
bigint |
pg_stat_statements 中的查问标识符 |
top |
bool |
假设语句是顶层的,则为 True |
userid |
oid |
用户 OID |
dbid |
oid |
数据库 OID |
plan_user_time |
double precision |
在此数据库中布局语句时经常使用的用户层 CPU 期间(以秒和毫秒为单位)(须要启用 pg_stat_kcache.track_planning,否则为零) |
plan_system_time |
double precision |
在此数据库中布局语句时经常使用的系统层 CPU 期间(以秒和毫秒为单位)(须要启用 pg_stat_kcache.track_planning,否则为零) |
plan_minflts |
bigint |
在此数据库中布局语句时出现的页面回收(软页面失误)次数(须要启用 pg_stat_kcache.track_planning,否则为零) |
plan_majflts |
bigint |
在此数据库中布局语句时出现的页面失误(硬页面失误)次数(须要启用 pg_stat_kcache.track_planning,否则为零) |
plan_nswaps |
bigint |
在此数据库中布局语句时出现的换入换出次数(须要启用 pg_stat_kcache.track_planning,否则为零) |
plan_reads |
bigint |
在此数据库中布局语句时由文件系统层读取的字节数(须要启用 pg_stat_kcache.track_planning,否则为零) |
plan_reads_blks |
bigint |
在此数据库中布局语句时由文件系统层读取的 8K 块数(须要启用 pg_stat_kcache.track_planning,否则为零) |
plan_writes |
bigint |
在此数据库中布局语句时由文件系统层写入的字节数(须要启用 pg_stat_kcache.track_planning,否则为零) |
plan_writes_blks |
bigint |
在此数据库中布局语句时由文件系统层写入的 8K 块数(须要启用 pg_stat_kcache.track_planning,否则为零) |
plan_msgsnds |
bigint |
在此数据库中布局语句时发送的 IPC 信息数(须要启用 pg_stat_kcache.track_planning,否则为零) |
plan_msgrcvs |
bigint |
在此数据库中布局语句时收到的 IPC 信息数(须要启用 pg_stat_kcache.track_planning,否则为零) |
plan_nsignals |
bigint |
在此数据库中布局语句时接纳的信号数(须要启用 pg_stat_kcache.track_planning,否则为零) |
plan_nvcsws |
bigint |
在此数据库中布局语句时主动出现的高低文切换次数(须要启用 pg_stat_kcache.track_planning,否则为零) |
plan_nivcsws |
bigint |
在此数据库中布局语句时主动出现的高低文切换次数(须要启用 pg_stat_kcache.track_planning,否则为零) |
exec_user_time |
double precision |
在此数据库中口头语句时所用的用户层 CPU 期间(以秒和毫秒为单位) |
exec_system_time |
double precision |
在此数据库中口头语句时所用的系统层 CPU 期间(以秒和毫秒为单位) |
exec_minflts |
bigint |
在此数据库中口头语句时出现的页面回收(软页面失误)次数 |
exec_majflts |
bigint |
在此数据库中口头语句时出现的页面失误(硬页面失误)次数 |
exec_nswaps |
bigint |
在此数据库中口头语句时出现的换入换出次数 |
exec_reads |
bigint |
在此数据库中口头语句时由文件系统层读取的字节数 |
exec_reads_blks |
bigint |
在此数据库中口头语句时由文件系统层读取的 8K 块数 |
exec_writes |
bigint |
在此数据库中口头语句时由文件系统层写入的字节数 |
exec_writes_blks |
bigint |
在此数据库中口头语句时由文件系统层写入的 8K 块数 |
exec_msgsnds |
bigint |
在此数据库中口头语句时发送的 IPC 信息数 |
exec_msgrcvs |
bigint |
在此数据库中口头语句时收到的 IPC 信息数 |
exec_nsignals |
bigint |
在此数据库中口头语句时接纳的信号数 |
exec_nvcsws |
bigint |
在此数据库中口头语句时主动出现的高低文切换次数 |
exec_nivcsws |
bigint |
在此数据库中口头语句时主动出现的高低文切换次数 |
降级裁减
请留意,除 SQL 对象外,其余更改都须要从新启动 PostgreSQL。无论裁减能否降级,重启成功后,大少数新代码都会被启用,由于裁减只担任在 SQL 中地下外部数据结构。
另请留意,当汇合前往函数的字段出现变动时,须要从新启动 PostgreSQL 能力加载新版本的裁减。在从新启动成功之前,降级裁减将失败,并显示相似以下内容的信息:
could find pg_stat_kcacheso
Bug 和限度
没有发现已知的失误。
跟踪布局器资源经常使用状况须要 PostgreSQL 13 或更高版本。
咱们会假设一个内核块的大小是 512 字节。关于 Linux 来说,状况确实如此,但关于另一些 Unix 系统来说,状况或许并非如此。
请参见:
在没有提供原生的 getrusage(2) 的平台上,除了 user_time 和 system_time 之外的一切字段都将为 NULL。
在提供了原生的 getrusage(2) 的平台上,某些字段或许没有保养。这是一个依赖于系统平台的行为,请参考你的系统中 getrusage(2) 手册页来了解更多细节。
假设pg_stat_kcache.track是 all,则 pg_stat_kcache 会跟踪嵌套语句。为了坚持成功的便捷,跟踪的嵌套级别的最大层级数限度为 64,但这关于正当的场景来说应该足够了。
即使pg_stat_kcache.track是 all,pg_stat_kcache 视图也只会输入顶层语句的统计信息。因此,有一种状况是,即使在布局一条嵌套语句时经常使用的用户层 CPU 期间很高,pg_stat_kcache 视图的 plan_user_time 还是很小。在这种状况下,布局一条嵌套语句时经常使用的用户层 CPU 期间会计入到 exec_user_time。