结合top命令实时捕捉几分钟内cpu使用率高的pg_sql

想找出比如两分钟内cpu使用率大于90%的慢sql,踩了无数的坑,还是因为太菜了
1.首先使用top命令两分钟刷新一次,因为top呈现的是这次刷新和上次刷新之间的情况 top -d 120,且要输出到文件中得加上-d
未使用ps,因为ps是进程整个执行过程中cpu的使用率
2.用grep,awk等可以实时处理输出数据流,awk中可以执行linux命令,实现实时数据处理输出
用过for循环,类似是for循环每个awk处理后输出的变量,再连接数据库查到对应sql,但是发现for循环只执行一次,for是貌似将所有变量放在list里面,最后再一个个的循环,因此不能实时,只能最后执行一次
3.awk中执行linux命令发现单引号不能输出,只能用单引号的八进制,命令里面的双引号需要用\转义,同理冒号的八进制是\072,代替冒号,双引号中的值是可以翻译出来的
4.psql中只想输出数据,因此加上-t,必须得-t -c 或者-tc,不能-ct,否则就会出现奇怪的错误,
5.具体命令如下:只捕捉postmaster进程,$9指cpu使用率那列,$1是进程号,sql进行了些处理,排除了些空闲进程,筛选执行时间大于两分钟的,因为有些刚执行占用cpu大的sql也会记录下来,将下面输出到文件中就可以啦
top -b -d 120 |grep ‘postmaster’|awk -F ’ ’ ‘{if($9>90) {cm=“psql -tc “select now(),pg_blocking_pids(a.pid),wait_event_type,wait_event,CURRENT_TIMESTAMP - least(query_start,xact_start) AS runtime,a.pid, state, usename, query from pg_stat_activity a where state<>\047"idle”\047 and CURRENT_TIMESTAMP - least(query_start,xact_start)>\047"0"“0”\072"0"“2”\072"0"“0”\047 and pid=”"$1;system(cm);}}’

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值