求助:卡死问题排查
Describe the bug (描述bug) adx服务在启动的时候大概率会出现卡死。vars接口显示创建了大量bthread和channel_connections,并且不断增长,最后导致OOM。如果能成功启动,服务运行还是比较稳定,高峰时bthread最多1800个,channel_connections最多2500个。
brpc服务接收到请求后会广播给下游dsp。协议基本都是http。我们对每一个dsp请求都会启一个bthread,bthread里同步请求下游服务,设定的超时时间为500ms左右。处理服务请求的bthread会join每个dsp的bthread。
服务最高并发不到100。dsp120个左右。
gdb调试的时候,worker线程堆栈目前看到有两种:
-
worker都在发送dsp请求,暂停在dsp的CallMethod。看堆栈貌似把pthread卡住了
-
worker都在建立ssl链接
有没有排查思路?
To Reproduce (复现方法)
Expected behavior (期望行为)
Versions (各种版本) OS: ubuntu 22.04.3 Compiler: g++ 11.4 brpc: 1.6 protobuf: 3.20.1
Additional context/screenshots (更多上下文/截图)
有设置FLAGS_usercode_in_pthread这个gflag吗?
有设置FLAGS_usercode_in_pthread这个gflag吗?
没有设置过
有用BTHREAD_ATTR_PTHREAD启动bthread吗?
默认情况下,CallMethod是跑在bthread上的,不会阻塞worker pthread。
既然一直有chan connection创建,可以先尝试确认下这个chan connection是往哪里连的,是不是同一个ip,然后dgb抓出来的两处堆栈,可以想办法trace下每次的锁占用时间。看看是不是有一个地方锁被占用没释放导致的。