加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

postgresql 的进程监控&管理

发布时间:2020-12-13 17:31:58 所属栏目:百科 来源:网络整理
导读:转自:http://breakdayzhou.blog.163.com/blog/static/1825846312011419102526725/ 首先,在postgresql.conf中把stats_command_string = true打开,使PostgreSQL的stats collector process监控每个session的sql语句。 第一个脚本 viewsql.sh: 根据pid查看进

转自:http://breakdayzhou.blog.163.com/blog/static/1825846312011419102526725/

首先,在postgresql.conf中把stats_command_string = true打开,使PostgreSQL的stats collector process监控每个session的sql语句。

第一个脚本 viewsql.sh: 根据pid查看进程的sql执行情况
#!/bin/sh # viewsql.sh #
# use to show all active session's sql in PostgreSQL.
# ######################################################
if test -z $1 ;then
echo "Usage:$0 pid"
exit 10
fi
echo "select * from (SELECT pg_stat_get_backend_pid(s.backendid) AS
procpid,pg_stat_get_backend_activity(s.backendid) AS current_query FROM
(SELECT pg_stat_get_backend_idset() AS backendid) AS s) as querystring
where procpid=$1;" | psql


这个脚本是显示指定的pid的session目前正在执行的sql语句。
可以这么监控当前最占资源的的进程的sql


top -b -c -n 1 |grep -v grep|grep -i postgre | awk '{print $1}'| while read i ;do ./viewsql.sh $i ; done;


我用top -c,结果是:
3665 pgsql 15 0 124M 124M 122M R 30.0 2.1 0:04 postgres: pgsql pgsql [local] INSERT
可以看到:3665这个pid显示在第一条,说明它的sql可能效率比较低。
[pgsql@webtrends bin]$ ./viewsql.sh 3665
procpid | current_query 3665 | insert into access_log select * from access_log ;
(1 row)


第二个脚本topsql.sh,试试查看全部的进程sql执行情况
#/bin/bash
while [ 1==1 ];do
ps ux |grep -i "postgres:" | grep -v "grep" | sort -n -k 3 -r | awk '{print $2,$3 }' |
while read i ; do
x=($i);
psql -qt -c "select ${x[1]} as cpu_used,* from (SELECT pg_stat_get_backend_pid(s.backendid) AS
procpid,pg_stat_get_backend_activity(s.backendid) AS current_query FROM
(SELECT pg_stat_get_backend_idset() AS backendid) AS s) as querystring
where procpid=${x[0]};";
done;
sleep 1;
done;

第三个脚本,kill占用资源高的session 提供一个KILL一个session的脚本,比如:有个session占用的资源太多,如果不kill掉他的话,可能会导致系统DOWN机。 killsession.sh: #!/bin/sh # use to kill one session. # if test -z $1; then echo "Usage:$0 pid" exit 10 fi SID=$1 echo "select pg_cancel_backend($SID);"|psql [pgsql@webtrends bin]$ ./killsession.sh 3665 pg_cancel_backend 1 (1 row) 刚才那个很占资源的session的目前的SQL操作就被cancel掉了。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读