ps:文章涉及项目截图和代码已屏蔽
PG CPU过高
1.查看各个微服务CPU、内存使用情况
docker stats --format "table {{.Container}}\t{{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.MemPerc}}" --no-stream
2.进入数据库服务,首先通过top命令查看数据库CPU利用率高的进程
3.根据CPU占用率很高的pid查找对应正在执行的SQL语句,\watch可以让该语句没隔几秒就执行
select pid,datname,current_timestamp-xact_start as runtime,query,state from pg_stat_activity where pid=xxx;\watch
现场问题还原:从查询结果可以看到,执行时间很短runtime,但是频率非常高,基本都是查询的xxx这张表的数据。
解决:代码频繁调用同一个查询,逻辑优化
追踪慢SQL
查询执行时间超过5秒的sql语句,如果有很多 idle in transaction是这个状态的执行语句,说明业务有bug没有commit提交事务。需要重视!!
select pid,current_timestamp-query_start as runtime,query,state from pg_stat_activity where now()-query_start > interval '5 second' and state <> 'idle' order by now()-query_start desc;
现场问题还原:现场执行某个逻辑,导致整个微服务假死,排序发现执行某个sql时间很长,切处于idle in transaction状态
解决:代码中事务加载了类上。减少代码中事务的粒度。
查看连接数变化
su - postgres //切换到用户
psql
select datname,count(*) from pg_stat_activity where state <> 'idle' group by datname;