适用范围
opengauss系列国产数据库
问题概述
业务应用侧日志频繁报错:connection is not available, request timed out
问题原因
通过持续ping当前集群的vip,发现vip频繁出现断联:

查询当前节点负载:
- cpu (按1可查看每个cpu的负载,ctrl+M可按内存排序)

- 内存 (主要查看free和available)

- IO (主要关注%util)

- 网络 (主要关注%ifutil)

通过上面的信息可以看出当前节点cpu负载过高,需深入数据库排查sql问题。
解决过程
- 最大连接数、当前使用连接数查询
show max_connections;
select count(*) from (select pg_stat_get_backend_idset());
select count(*) from pg_stat_activity;

- 查询每个客户端的连接数,从而分析那个客户端比较繁忙
select client_addr,count(*) from pg_stat_activity where client_addr IS NOT NULL group by 1 order by 2 desc;

- 查询当前执行次数最多的sql(忽略下图select 1和commit)
select client_addr,query,count(*) from pg_stat_activity where client_addr IS NOT NULL group by 1,2 order by 3 desc;

- 查询当前的长事务
SELECT query,current_timestamp - query_start AS runtime FROM pg_stat_activity where state != 'idle' ORDER BY 2 desc;

- 查看锁阻塞情况
with tl as (select a.pid,usename,granted,locktag,query_start,query,mode,a.state
from pg_locks l,pg_stat_activity a
where l.pid=a.pid and locktag in(select locktag from pg_locks where granted='f'))
select ts.pid locker_pid,ts.usename locker_user,ts.query_start locker_query_start,ts.granted locker_granted,ts.query locker_query,ts.mode locker_mode,tt.pid locked_pid,tt.query locked_query,tt.query_start locked_query_start,tt.granted locked_granted,tt.usename locked_user,tt.mode locked_mode,extract(epoch from now() - tt.query_start) as locked_times
from (select * from tl where granted='t') as ts,(select * from tl where granted='f') tt
where ts.locktag=tt.locktag order by 1;
- 查看表结构(order_retry_sum)
\d order_retry_sum

给表order_retry_sum的字段sub_id添加索引后,负载立刻降低,vip恢复正常,重启业务后不再复现该问题。
结论
当服务器cpu或者内存负载过高时会导致vip绑定失败,业务(偶发性)无法正常连接数据库vip,需结合数据库当前事务执行情况过滤最占用资源的sql,分析执行计划,提升sql性能。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




