tidb偶发创建连接耗时较长

【 TiDB 使用环境】生产环境
【 TiDB 版本】v6.5.0
【遇到的问题:问题现象及影响】
在 tidb 节点没有其它链接的情况下,使用 jdbc 连接数据库,有概率在握手时卡住0-30秒不等,但最终都可以连接上。

大概说一下场景,我们使用 kettle jdbc 直连 tidb,没有使用连接池,所以其实每次都会创建新连接。同时老版本 kettle 配不了 connectTimeout,导致在上述问题出现的时候,jdbc 就会报 communication link failure。这个问题之前偶尔出现过但不频繁,并且是在被 spark 并发创建大量连接时才会出现,可发现问题表现是即使没有负载也会有这个情况。

出现某一次连接慢的时候 tidb 本身没有输出什么日志,监控上面有问题的节点和其它正常的节点也没什么区别,所以因为这个我一度怀疑是负载均衡配的有问题,但后来通过直连每个节点发现了有问题的 tidb。

后来我抓包看了下,发现慢的时候是卡在 tcp 握手成功之后和 tidb 协商验证方式之前,这俩正常情况下几乎没有延迟


但慢的时候就很慢,会隔很长的时间,甚至多了tcp keepalive,不过也说明连接本身应该没问题

修改:似乎也不全是卡在同一个地方,比如这个就是卡在密码认证之后和返回认证成功之前

不知道有没有遇到过这个问题的佬

容易出现的话,把tidb的日志级别调整成debug,然后再看看有没有日志。

1 个赞

这个我也想调,但是我怕一重启现象没了查不出来了

1 个赞

通过 pd,能看到火焰图,debug/profile那里,弄下来看看。

1 个赞

是说这个吧,但我不大会看。。慢的情况大概十几次创建连接会出现一次,这个咋看啊


goroutine.txt (113.6 KB)
cpu.zip (120.8 KB)
Heap.zip (19.6 MB)
Mutex.txt (24.5 MB)

这样搞:
如果是卡住了,就把其他没卡住的链接 kill掉,只留一个卡住了。然后获取下火焰图。看看关于链接的部分卡在了哪里。然后对应着看看代码。

不过这个确实很难确定原因,也就是看看,能不能找到一些线索。

1 个赞