tidb-server 内存一路飙高

版本:

Release Version: v4.0.0-rc-141-g7267747ae
Git Commit Hash: 7267747ae0ec624dffc3fdedb00f1ed36e10284b

执行操作:insert操作

内存分析:

grafana监控:

qps:

memory:

image

cpu:

image

connection:

image

executor:

如上所示:内存一路飙高,parse和compile响应时间也升高

不知道跟短连接和长连接有没有关系,前端语言是php

补充下调用图:

heap.rar (10.8 KB)

内存消耗大的函数:

问题收到,会尽快答复,多谢

@lindoubled 你好,我是 TiDB 的研发同学; 想先确认两个问题:

1.这些 insert 是以什么形式在执行,是否被包含在一个事务内,如:
begin
insert ...
insert ...
...
commit
2.每句 insert 后会有很多行数据吗,如:
insert into xx values (...), (...), ... (...)

1、是一条一个事务

2、是insert into xxx values(…)

这个是我们insert语句:类似这样

INSERT INTO `gamehub`.`logs_user_login` (`id`,
 `app_id`, 
`channel_id`, 
`login_time`, 
`login_ip`, 
`login_ua`, 
`input_data`, 
`access_token`, 
`token_hash`, 
`created_at`)

VALUES (NULL,
 '4123832704872364',
 'c27274, 
'1590050384', 
'10.59.110.117',
 'ua02||an_2.3.0||com.yy.cb_default_2.3.0_0||did=an-anid-38c03f34d412b92ac11bddb6da5d824a,imei1=,imei2=,meid1=,meid2=,oaid=f3f3d3c6-e9dd-b22a-cbc3-f2a7fa3b2619,anid=a609bb930421f0ca,tkio=f3f3d3c6-e9dd-b22a-cbc3-f2a7fa3b2619||android-OS-10;HUAWEI;LYA-AL00||+1588756981+c598b9982ce1a1ef1d8da21cce058449',
'{"app_id":"4123832704872364","uid":"111","username":"test","token":"access_token=Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9kZW1vLWFwaS1teS50bHN5LmN5LmNvbVwvdjNcL21lbWJlclwvbG9naW4iLCJpYXQiOjE1OTAwNTcyMDksImV4cCI6MTU5Mzk0NTIwOSwibmJmIjoxNTkwMDU3MjA5LCJqdGkiOiJyV2FmbUI0MW5Uc2VXQ21xIiwic3ViIjo2NjA3MjAsInBydiI6IjIzYmQ1Yzg5NDlmNjAwYWRiMzllNzAxYzQwMDg3MmRiN2E1OTc2ZjciLCJweHQiOjE1OTI2NDkyMDksInZpaSI6M30.0ppEAd76YYJ_3ovaM0jttuXLUGQSUQoOSCaQQJdFffw&client_app_id=008283405babc75a&client_ua=ua02||an_2.4.0||com.u17173.game173.sample_default_1.0_0||did=an-anid-6a3027fdce09c92eab5d1d2d8799257b,imei1=,imei2=,meid1=,meid2=,oaid=f3f3d3c6-e9dd-b22a-cbc3-f2a7fa3b2619,anid=9ce6dba3a0b1b51f,tkio=f3f3d3c6-e9dd-b22a-cbc3-f2a7fa3b2619||android-OS-10;HUAWEI;LYA-AL00||","channel_id":"c17173","timestamp":"1590058024","sign":"023d7d9cfe11e02ea876a319d4296b5eabbed3c746a2a2d88f036a2ea6cceffe"}',
 '0f77a6ba981b11461bae1b0300bbe4e8', 
'0f77a6ba981b11461bae1b0300bbe4e8', 
'2020-05-21 18:47:04');

有一个现象是:


1、php框架连接tidb,worker形式(长连接),做insert操作,这时候tidb-server内存正常


2、用php直连tidb,就是来一条insert,连接下tidb,然后断开,之后反复如此(短连接),

这时候tidb-server内存就一路飙高了

所以不知道是不是和连接模式有关系

收到,感谢反馈,这边确认下

@lindoubled 感谢回复,目前怀疑模式 2 下有两个可能:

  1. 外部程序没等 tidb 正常返回成功就开始执行下一条语句了,导致 TiDB 内接受处理的并发请求数在累加,造成了内存消耗多;
  2. tidb 正常处理完 insert 语句后,内部有一些后台清理操作或者泄漏,导致内存没有马上被释放;

请确认下会不会有上面问题 1 存在,如果不是问题 1 的话。

能帮忙在模式 2 跑一段时间,然后通过 show processlist 或者 connection 的监控看看链接数会不会一直累加。

另外麻烦把 profile 的数据给一下,主要想看 heap 和 goroutines,之前那个只有 svg 图,不太好看是否有后台 goroutine 在持续运行并占用内存。

模式1:意思是goroutine一直增加么?

麻烦按照上面的思路确认下,多谢

  1. 看下内存不断升高时,show procelist 或者查看监控tidb,是否是connect数量不断升高,成正比
  2. 如果不是1的情况,请按照上面的方法采集所需信息,麻烦了

测试结果:

1、goroutine和heap profile :

heap_goroutine_profile.rar (102.4 KB)

2、goroutine和heap debug=1信息:

goroutine和heap debug=1信息.rar (100.2 KB)

3、proto profile:

profile001.pb.gz (58.2 KB)

4、heap svg图:

heap_svg.rar (12.8 KB)

5、内存top:

6、grafana监控图:

qps:

memory:

connection:

goroutine :

executor:

上图中memory已经用到了swap

补充信息:

内存、connection、goroutine图:

从上面信息,貌似压测完之后connection和goroutine都有释放,memory中heap也有释放(释放到一定程度之后就不释放了),但memory中process没有释放

这个问题正在分析,有结论后会尽快答复,多谢

这个是debug=1信息:

goroutine和heap debug=1信息.rar (100.2 KB)

感谢!@lindoubled

目前发现一点可能造成内存泄漏的地方,能否帮忙试试把 oom-use-tmp-storage 这个配置关闭,然后再尝试在你的环境跑一下看能否复现?如果不能复现应该就是这个相关 feature 导致的。

另外我这边也会尝试在本地复现一下这个问题。

我在本地复现这个问题了,确实是对应功能导致的内存泄漏。

我看你用的是 4.0.0-rc 版本,我后面确认了下 4.0.0-rc2 上这个 bug 已经解决,可以的话能否升级到 4.0.0-rc2 使用?

1赞

@qw4990-PingCAP,好的,我们试试看

@qw4990-PingCAP

结论:

确实是oom-use-tmp-storage参数问题

测试结果:

我只改了其中一台配置,其它两台oom还是true

感谢热心帮忙,谢谢,我们会尽快升级到4.0.0-rc2 版本

:+1: 感谢反馈