398 Star 1.4K Fork 1.6K

GVPopenGauss / openGauss-server

 / 详情

开启enable_snapshot之后进行压测数据库连接超时

待办的
缺陷
创建于  
2023-09-05 16:25

【标题描述】: 开启enable_snapshot之后进行压测数据库连接超时
【测试类型:SQL功能/存储功能/接口功能/工具功能/性能/并发/压力长稳/故障注入/安全/资料/编码规范】【测试版本:5.0.0】 问题描述

【操作系统和硬件信息】(查询命令: cat /etc/system-release, uname -a):
Centos7
【测试环境】(单机/1主x备x级联备):
单机
【被测功能】:

【测试类型】:
压力测试
【数据库版本】(查询命令: gaussdb -V):

【预置条件】:

【操作步骤】(请填写详细的操作步骤):
内部自动化测试发现,只要开启enable_wdr_snapshot就是必现。没法提供详细的复现步骤

【预期输出】:
数据库正常执行
【实际输出】:
数据库执行数小时后,gsql无法连接。经过分析,提供导致数据库阻塞的两个线程堆栈,thread55为snapshot线程,thread56为snapshot起的worker线程。
thread 56
thread 55
【原因分析】:

  1. 这个问题的根因
    简单分析了这个问题。问题出现流程如下
    snapshot线程执行过程中需要调用wdr_xdb_query函数 -> 使用libpq起了一个worker线程用于执行视图查询语句 -> 在PQGetResult函数执行过程,两个线程进行message交互时,snapshot线程收到SIGTERM信号,转而执行die函数 -> die函数需要执行instrSnapshotCancel,又需要关闭这个worker线程 -> 此时worker线程在等待snapshot线程接收message,snapshot线程在等待worker被关闭,互相等待阻塞 -> snapshot占用的锁释放不掉,导致整个数据库卡死。

这个instrSnapshotCancel的执行时机不太合理。按理说,此时设置一下参数,不做过多操作,等待下一次check_for_interrups的时候再做处理,应该更合适一些把?

  1. 问题推断过程
  2. 还有哪些原因可能造成类似现象
    还有几个社区自研的线程是用同样的方法处理SIGTERM的,不知道是否会有相同问题。
  3. 该问题是否有临时规避措施
    关闭enable_wdr_snapshot.
  4. 问题解决方案
  5. 预计修复问题时间

【日志信息】(请附上日志文件、截图、coredump信息):

【测试代码】:

评论 (5)

kenxx 创建了缺陷

Hey @kenxx, Welcome to openGauss Community.
All of the projects in openGauss Community are maintained by @opengauss_bot.
That means the developers can comment below every pull request or issue to trigger Bot Commands.
Please follow instructions at Here to find the details.

Hi @kenxx, please use the command /sig xxx to add a SIG label to this issue.
For example: /sig sqlengine or /sig storageengine or /sig om or /sig ai and so on.
You can find more SIG labels from Here.
If you have no idea about that, please contact with @xiangxinyong , @zhangxubo .

kenxx 修改了描述
kenxx 修改了描述
opengauss_bot 负责人设置为ljy
kenxx 修改了描述
周斌 关联项目设置为openGauss 5.1.1 community

这个问题是在使用dblink时,原有的work线程发生了中断,导致死锁。需要进一步分析。

我们这边分析有几个初步结论,看看能不能参考一下:
1、libpq是一个客户端库,在内核里使用的话,有可能导致这个会话会法马上响应信号中断(CHECK_FOR_INTERRUPTS处理)
2、在信号中断函数die,里面发libpq取消,由于此时postmaster的pmState可能已经进入PM_STOP_BACKENDS、或PM_WAIT_BACKENDS状态,postmaster此时可能无法向应这个libpq取消请求
3、die函数里,也不能做过于复杂的操作,理论上还存在这种情况:该session获得了某个实例级别的锁,这时收到停机信号,代码转跳到die函数,发起libpq取消请求。如果postmaster、或者被取消的线程也需要这把锁,则这时就触发了另一种死锁。详细参考PG的这段说明
输入图片说明

因此我们得出一个初步结论:在内核里尽量不要使用libpq这种客户端库,于是,解决方法大概有这几种
1、用其它机制代替libpq,如bgwoker来跨库执行SQL,海量数据库目前采用这种方法解决,但这个方法改动量可能会比较大。
2、die函数里不要直接做取消操作,参考PG的做法,die函数里,仅设置一个中断标记,工作线程等到下一次调CHECK_FOR_INTERRUPTS才处理这个中断。看个改法看起来简单一些,但缺点是无法马上处理信号中断。
3、不要做跨库查询,wdr_xdb_query即可以用普通内置函数实现,从而避免了这个问题,但这个修改可能会影响wdr相关功能

周斌 负责人ljy 修改为Carl
kenxx 修改了描述
kenxx 修改了描述
周聪 添加协作者陈栋
周聪 取消协作者陈栋
周聪 添加协作者陈栋
周聪 修改了备注
周聪 修改了备注

该问题与contrib/dblink无关

陈栋 负责人Carl 修改为周斌
陈栋 添加协作者Carl
陈栋 取消协作者陈栋
陈栋 取消协作者Carl
周斌 添加协作者周斌
周斌 负责人周斌 修改为douxin
周斌 取消协作者周斌
周斌 添加协作者申正
wan005 优先级设置为次要

登录 后才可以发表评论

状态
负责人
项目
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
预计工期 (小时)
参与者(6)
13084139 opengauss bot 1686829535 11976283 chen zhikai 999 1671161198
C++
1
https://gitee.com/opengauss/openGauss-server.git
git@gitee.com:opengauss/openGauss-server.git
opengauss
openGauss-server
openGauss-server

搜索帮助