# [Know Issue] TiDB 执行点查慢之 goroutine 泄漏问题

## Issue

一个点查sql执行慢，compile 时长大

## Root Cause

查看慢sql详细信息后给的反馈信息是这样的：这条SQL不是prepare的。通过分析sql语句，认为可能是golang runtime的问题。

### Diagnostic Steps

生产上有不少点查慢sql，一直在产生，显示优化时长太长，这些sql手动执行很快。
排查步骤：
1，收集慢sql所在节点的tidb debug信息，命令：`curl http\://{tidb server-ip:status\_port/debug/zip?seconds=60 --output tidb\_debug.zip`
2，通过监控查看各个节点的内存使用情况，发现慢sql所在tidb节点的内存使用率明显高于其他节点的内存使用率。
3，排查发现问题sql只在一个tidb-server节点产生。
4，应用连的是负载均衡地址。

### Resolution

经开发排查，检查 goroutine 发现有大约 1.7 万 goroutine 卡在 (\*slowQueryRetriever).parseSlowLog 上，heap profile 显示 parse slow log 占用了 95GB，于是判断是 goroutine 泄漏导致的内存泄漏。而接近十三万个 goroutine 使得 go runtime 的调度压力上升，从而出现 build plan 耗时 2.5 秒。

该问题在 v4.0.9 修复：<https://github.com/pingcap/tidb/pull/21496> ，重启 TiDB 可以临时解决，但随着慢日志的查询越来越多，该问题可能会重新出现。

### Workaround

要想彻底解决这个问题，有2个办法：1，定期清理slow log文件 2，升级版本。