【TDengine 使用环境】
预生产环境
【TDengine 版本】
3.3.6.9
【操作系统以及版本】
20.04.1-Ubuntu
【部署方式】容器部署
【遇到的问题:问题现象及影响】
我在linux下使用https://github.com/taosdata/taos-connector-odbc中实现的odbc c++连接器,其commit 8dbcadc14f2ad946849cacd8f9295c3410c71cbe (HEAD → main, tag: ver-3.4.1.7, tag: ver-3.4.1.6, tag: ver-3.4.0.0)。采用SQLBindParameter的方式实现数据批量插入。过一段时间之后出现hb线程持续占用CPU较高,top -Hp的线程占用资源情况如下图:
请问这个hb线程是否是taos相关线程,其作用是啥?其占用CPU持续较高是否正常?
这个进程是我们开发的使用taos-connector-odbc(采用native连接)向taosd写入数据的应用程序。taosd在本机的docker容器里面,没有使用集群功能。
1.hb = Heartbeat(心跳),负责定期向 TDengine 集群的mnode(管理节点)上报客户端应用信息,包括连接数、查询状态等,用于服务端的监控和管理。
2.可能的原因:连接数过多,使用 SQLBindParameter 批量插入时,如果频繁创建新连接而不关闭,appHbMgrs和connKeyCnt持续增长,每轮心跳需要遍历处理大量连接,导致单次循环耗时过长Native连接未释放:每次 TDengineConnection 打开 Native 连接都会注册到 hb 管理器,若未正确Close/Dispose,累积的连接都参与心跳上报
3.建议排查
a.确认连接是否复用 — 检查代码中每次批量插入是否复用了同一个 TDengineConnection,而不是每次 new一个
b.确认连接是否释放 — 检查 Close()/Dispose() 是否在 finally 中调用
freemine
(freemine)
6
只是提醒一下,SQLFreeStmt 不全等同于 SQLFreeHandle(…SQL_HANDLE_STMT…)。当你确信需要释放stmt handle,建议使用SQLFreeHandle。
嗯。我是在每次批量插入结束时使用SQLFreeStmt清理下SQLHSTMT,并不是要释放SQLHSTMT。SQLHSTMT同SQLHDBC一样也是在程序启动时使用SQLAllocHandle创建,在程序退出时使用SQLFreeHandle释放。
freemine
(freemine)
8
个人建议你,对这个版本的taos-connector-odbc,先不要cache stmt handle。你改过后,试试看,问题会不会解决。(我不确认直接相关,只是怀疑)