在数据库层获得底层系统的信息是一个对DBA,友好的功能,在数据库内部通过命令获得底层系统的性能信息,对于数据库监控也是一个好的获取数据库的方式,可以直接将这些信息插入到数据库表内等等。
EDB 公司针对POSTGRESQL 开发出一套system_stats 系统通过extension的方式与POSTGRESQL 结合,获取
1 系统信息
2 CPU 信息,CPU 使用率
3 内存信息
4 IO 信息
5 磁盘信息
6 系统负载信息
7 系统的进程信息
安装非常简单 https://github.com/EnterpriseDB/system_stats
下载源码编译包,在PG的环境下进行make make install 后,就可以使用了,此次测试环境为 PG14 ,在进入到POSTGRESQL 环境下,直接运行
create extension system_stats;
功能就可以使用了。
通过执行 select * from pg_sys_os_info(); 命令可以获得当前数据库所在得系统的版本,主机名,以及process 和 thread的数量,和主机的架构,主机运行的多长时间等信息。
select * from pg_sys_cpu_info(); 通过这个命令可以对当前系统的CPU的信息进行展示。
select * from pg_sys_cpu_usage_info(); 的信息可以获得当前CPU 的工作情况,如CPU 运行繁忙度的信息,系统用户的时间信息等,从中可以获得CPU 是否繁忙的情况。
其中对于内存的信息获取对数据库运维来说是重要的,
select total_memory/1024/1024 as total_memory_MB,used_memory/1024/1024 as used_memory_MB,free_memory/1024/1024 as free_memory_MB,swap_used/1024/1024 as swap_used_MB from pg_sys_memory_info();
从这里可以看到系统中内存和使用的内存,以及 swap 的内存是否被使用过等等信息。
对于 select * from pg_sys_io_analysis_info(); 来说可以获得磁盘系统的工作情况,尤其对于系统磁盘的环境监控和比对系统繁忙期的IO 工作情况有很大的帮助,如 平均读取时间 平均写入时间等信息,都可以通过现有表的信息进行计算后获得。
对于磁盘的空间使用的情况,也可以通过 sys_disk_info 表来进行获取
select file_system,total_space/1024/1024 as TOTAL_MB,used_space/1024/1024 as USED_MB,free_space/1024/1024 as free_space_MB from pg_sys_disk_info();
这里可以获知系统中磁盘空间的使用和剩余的情况等等, 更有意思的是,我们经常对系统中进行的TOP 操作中的system avg load的信息这里也可以提供
select * from pg_sys_load_avg_info();
当然这里还可以通过系统表查询当前数据库所在服务器的网络包的发送和收取的情况,了解系统网络的工作情况,以及工作的繁忙度等问题。
select * from pg_sys_cpu_memory_by_process();
最后在系统表中获知当前的PROCESS 的信息,与ps -ef 是雷同的,同时可以在这里获知每个process 的CPU 与内存的使用情况等等。
最后是使用这个功能的用户有谁,默认SUPERUSER 是具有使用这个功能的用户,一般用户是无法使用这个功能的。
除此之外,可以通过monitor_system_stats 将权限赋予一般的用户,具有查看这些系统表的权限。