在进行技术测试时,观察数据库性能,并找到性能方面存在问题,对数据库做监控是必不可少的。
这里我们常用的是pg_stat_activity,该视图可以查询出当前正在运行的SQL。
postgresql中pg_stat_activity动态统计
pg_stat_activity:一行服务器进程,显示当前连接进程的状态信息,比如状态和当前查询
。
pg_stat_activity视图具体信息:
postgres=# \d+ pg_stat_activity
View "pg_catalog.pg_stat_activity"
Column | Type | Storage | Description
------------------+--------------------------+----------+-------------
datid | oid | plain | 后端连接到的数据库的OID
datname | name | plain | 后端连接到的数据库的名称
pid | integer | plain | 后端的进程 ID
usesysid | oid | plain | 登录到这个后端的用户的 OID
usename | name | plain | 登录到这个后端的用户的名称
application_name | text | extended | 连接到这个后端的应用的名称
client_addr | inet | main | 连接到这个后端的客户端的IP 地址。 如果这个域为空,它表示客户端通过服务器机器上的一个 Unix 套接字连接或者这是一个内部进程(如自动清理)
client_hostname | text | extended | 已连接的客户端的主机名,
由client_addr的反向 DNS 查找报告。这个域将只对 IP 连接非空,并且只有log_hostname被启用时才会非空。
client_port | integer | plain | 客户端用以和这个后端通信的 TCP 端口号,如果使用Unix 套接字则为-1
backend_start | timestamp with time zone | plain | 进程被启动的时间,对于客户端后端,这是客户端连接到服务器的时间
xact_start | timestamp with time zone | plain | 进程的当前事务被启动的时间,如果没有活动事务则为空。如果当前查询是它的第一个事务,这一列等于query_start。
query_start | timestamp with time zone | plain | 当前活动查询被开始的时间,如果state不是active,这个域为上一个查询被开始的时间
state_change | timestamp with time zone | plain | state上一次被改变的时间
waiting | boolean | plain | 事务是否为等待状态
state | text | extended | 后端的当前总体状态。
| | | • active:后端正在执行一个查询。
| | | • idle:后端正在等待一个新的客户端命令。
| | | • idle in transaction:后端在一个事务中,但是当前没有正在执行一个查询。
| | | • idle in transaction (aborted):这个状态与idle intransaction相似,
| | | 不过在该事务中的一个语句导致了一个错误。
| | | • fastpath function call:后端正在执行一个 fast-path 函数。
| | | • disabled:如果在这个后端中track_activities被禁用,则报告这个状态。
query | | text | extended | 最近查询的文本。
backend_type 如果state为active,这个域显示当前正在执行的查询。
在所有其他状态下,它显示上一个被执行的查询。 默认情况下,查询文本被截断为024个字符;可以通过参数更改此值。
视图定义:
SELECT s.datid,
d.datname,
s.pid,
s.usesysid,
u.rolname AS usename,
s.application_name,
s.client_addr,
s.client_hostname,
s.client_port,
s.backend_start,
s.xact_start,
s.query_start,
s.state_change,
s.wait_event_type,
s.wait_event,
s.state,
s.backend_xid,
s.backend_xmin,
s.query,
s.backend_type
FROM pg_stat_get_activity(NULL::integer) s(datid, pid, usesysid, application_name, state, query, wait_event_type, wait_event, xact_start, query_start, backend_start, state_change, client_addr, client_hostname, client_port, backend_xid, backend_xmin, backend_type, ssl, sslversion, sslcipher, sslbits, sslcompression, sslclientdn)
LEFT JOIN pg_database d ON s.datid = d.oid
LEFT JOIN pg_authid u ON s.usesysid = u.oid;
pg_stat_activity监控正在频繁执行的sql
select state,usename,datname,pid,wait_event_type,
wait_event,substr(query ,1,50),
xact_start, query_start,query
from pg_stat_activity where state <>'idle';
在Postgresql调优过程中,Linux命令工具也有很大帮助,常用的命令有:
top:查看全局信息,如CPU占用率,load情况,内存使用情况,topN的进程,idle
iostat:可以查看磁盘的读写IOPS,读写吞吐量,读写响应时间,I/O利用率
使用Linux监控pg步骤:
1)根据top信息,找出CPU占用率比较高的postgres进程id=XXXXX
2)通过 select pid,state,usename,datname,query from pg_stat_activity where pid= 'XXXXX’找到该进程sql,然后进行优化;