tikv-go客户端内存泄露

【 TiDB 使用环境】测试
【 client-go 版本】v2.0.7
【复现路径】

  • 客户端进程中连接tikv服务, 然后将网卡down掉

【遇到的问题:问题现象及影响】

  • 客户端进程内存不断的增长,一天能上涨800MB
  • 网卡上线后,内存也没有释放

【其他分析】

  • 通过日志发现tikv-go客户端不断的重连pd

[2023/12/01 14:45:10.483 +08:00] [WARN] [pd_service_discovery.go:400] [“[pd] failed to get cluster info for the leader”] [leader-addr=http://10.10.10.31:2379] [error=“[PD:client:ErrClientGetClusterInfo]error:rpc error: code = DeadlineExceeded desc = context deadline exceeded target:10.10.10.31:2379 status:CONNECTING: error:rpc error: code = DeadlineExceeded desc = context deadline exceeded target:10.10.10.31:2379 status:CONNECTING”]
[2023/12/01 14:45:10.523 +08:00] [WARN] [pd_service_discovery.go:400] [“[pd] failed to get cluster info for the leader”] [leader-addr=http://10.10.10.31:2379] [error=“[PD:client:ErrClientGetClusterInfo]error:rpc error: code = Unavailable desc = connection error: desc = "transport: Error while dialing: dial tcp 10.10.10.31:2379: i/o timeout" target:10.10.10.31:2379 status:TRANSIENT_FAILURE: error:rpc error: code = Unavailable desc = connection error: desc = "transport: Error while dialing: dial tcp 10.10.10.31:2379: i/o timeout" target:10.10.10.31:2379 status:TRANSIENT_FAILURE”]

排查思路:

  1. 检查客户端代码:检查客户端代码,特别是与连接TiKV和PD相关的部分。确保代码中没有造成内存泄漏的问题,例如未关闭的连接、未释放的资源等。可以使用内存分析工具(如pprof、heapster等)来检查内存使用情况和泄漏情况。
  2. 检查TiKV Go客户端配置:检查TiKV Go客户端的配置参数,确保配置参数的设置合理。特别关注与连接PD相关的参数,例如pd.endpointspd.request-timeout等。
  3. 检查PD的状态:使用TiUP或PD-CTL工具检查PD集群的状态,确保PD集群中的所有节点都正常运行,并且没有异常的Leader分布。您可以使用命令tiup ctl:v5.1.1 pd -u <pd_address> storetiup ctl:v5.1.1 pd -u <pd_address> leader来查看PD集群的状态信息。
  4. 检查网络连接:检查客户端进程与TiKV服务之间的网络连接是否正常。确保网络连接稳定,并且没有丢包或延迟过高的情况。可以使用ping命令或其他网络诊断工具来测试连接的连通性和延迟。

就一个client实例, 一个连接 ,其他的都没有

// connect代码就下列, 看看有没有问题

func newClient(pdAddrs string) (*tikvClient, error) {

    pdOpt := rawkv.WithPDOptions(pd.WithMaxErrorRetry(2))
    secureOpt := rawkv.WithSecurity(config.DefaultConfig().Security)
    cli, err := rawkv.NewClientWithOpts(context.TODO(), pdAddrs, pdOpt, secureOpt)

    if err != nil {
        fmt.Println("Create tikv client failure, ", now(), err)
	    return nil, err
    }

    client := new(tikvClient)
   client.cli = cli

   return client, nil

}

网卡不断就好

这不是你自己的代码吗

建议不要单独使用 tikv 因为社区基本上没有人能帮助到你~
能使用 TiDB 就使用 TiDB~

我调用tikv-go的代码

这个问题不知道,帮顶

网络通信出现异常

这种是不是重启就好了

请问你的client代码连接完成后有没有及时关闭?