性能监控
数据库性能视图
PostgreSQL数据库针对性能和当前状态提供了很多统计视图,这些视图都是以pg_stat开头的。是否产生这些统计数据,由几个参数决定:
*track_counts:是否收集表和索引上的统计信息,默认为on
*track_functions:可以取"none"、"pl"和"all",如果是"pl"则只收集PL/PgSQL写的函数的统计信息;"all"表示收集所有类型的函数,包括C语言和SQL写的函数。默认为"none"
*track_activities:是否收集当前正在执行的SQL。默认为on
*track_io_timing:是否收集I/O的时间信息。默认为off,即不收集。因为收集可能会导致某些平台上的性能瓶颈,默认track_io_timing参数是关闭的,所以“读数据块的总时间”和“写数据块的总时间”这两项没有数据。若打开这个配置项,在一些平台上可能会导致性能问题,可以通过PostgreSQL提供的pg_test_timing工具来测试是否有此问题
最常用的视图为pg_stat_activity,该视图可以查询出当前正在运行的SQL,
pg_stat_activity还能显示客户端的IP地址、端口、执行SQL的开始时间、事务的开始时间等信息
PostgreSQL提供了以下各个对象级别的统计信息视图:
*pg_stat_database
*pg_stat_all_tables
*pg_stat_sys_tables
*pg_stat_user_tables
*pg_stat_all_indexes
*pg_stat_sys_indexes
*pg_stat_user_indexes
pg_stat_database显示以下信息:
*各个数据库相关的活跃服务器进程数
*已提交的事务总数
*已回滚的事务总数
*已读取的磁盘块总数
*缓冲区命中的总数
*行插入、行读取、行删除的总数
*死锁发生的次数
*读数据块的总时间
*写数据块的总时间
pg_stat_all_tables、pg_stat_sys_tables、pg_stat_user_tables这三张视图的内容相似,只是pg_stat_all_tables显示的是所有表的统计信息,而pg_stat_sys_tables只显示系统表的统计信息, pg_stat_user_tables只显示用户表统计信息。这三张视图中包含的信息:
*顺序扫描的总数
*顺序扫描抓取的活数据行(liverow)的数目
*索引扫描的总数(属于该表的所有索引)
*索引扫描抓取的活数据行的数目
*插入的总行数、更新总行数、删除的总行数、HOT(Heap Only Tuple)更新的总行数
*上次手动vacuum该表的时间,上次由autovacuum自动清理该表的时间
*上次手动analyze该表的时间,上次由autovacuum自动analyze该表的时间
*vacuum的次数(不包括vacuum full)
*autovacuum的次数
*analyze的次数
*由autovacuum自动analyze此表的次数
pg_stat_user_functions对数据库内函数的调用次数及其他信息进行统计的视图:
*每个函数的调用次数
*执行每个函数花费的总时间
*执行函数时它自身花费的总时间,不包括它调用其他函数花费的时间
以下各个对象上发生I/O情况的统计视图:
*pg_statio_all_tables
*pg_statio_sys_tables
*pg_statio_user_tables
*pg_statio_all_indexes
*pg_statio_sys_indexes
*pg_statio_user_indexes
*pg_statio_all_sequences
*pg_statio_sys_sequences
*pg_statio_user_sequences
这些视图统计了这个对象上数据块的读取总数、缓存区命中的总数,如果是表,还提供了该表上所有索引的磁盘块读取总数、所有索引的缓冲区命中总数、辅助TOAST表(如果存在)上的磁盘块读取总数、辅助TOAST表(如果存在)上的缓冲区命中总数、TOAST表中索引的磁盘块读取总数、TOAST表中索引的缓冲区命中总数
这一系列pg_statio_视图在判断缓冲区效果时特别有用,可以统计出各个数据库缓冲区的命中率
这些视图中记录的信息都是自数据库启动后的统计信息,也就是说是一个累积值,这与Oracle数据库中的统计视图是一样的。如果想看某一段时间内的统计数据,还需要写一个程序或借助一些工具,在开始时间统计一次数据,结束时间再统计一次数据,两次数据进行相减才能算出这段时间内的统计数据。Oracle数据库提供了statspack的工具,PostgreSQL数据库中也有类似工具叫pgstatspack
Linux监控
top---查看全局信息,如CPU占用率、load情况、内存使用情况、topN的进程等
iostat---查看磁盘读写IOPS、读写吞吐量、读写相应时间及I/O利用率
await包括了在队列中等待的时间,
svctm指把I/O发送到磁盘上花了多少时间,不包括在I/O队列中的时间,普通硬盘通常不应该超过20ms
%util表示I/O利用率,I/O利用率与IOPS之间没有线性关系
vmstat---查看内存情况
swap大类中的si和so,如果这两项有大于0的数值,说明发生了swap交换,系统内存不足。
bi和bo可以看成当前IO的情况
sar---查看各种信息,最常见的是查看网络的流量