版本:
Release Version: v4.0.0-rc-141-g7267747ae
Git Commit Hash: 7267747ae0ec624dffc3fdedb00f1ed36e10284b
执行操作:insert操作
内存分析:
grafana监控:
qps:
memory:
cpu:
connection:
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 下有两个可能:
- 外部程序没等 tidb 正常返回成功就开始执行下一条语句了,导致 TiDB 内接受处理的并发请求数在累加,造成了内存消耗多;
- tidb 正常处理完 insert 语句后,内部有一些后台清理操作或者泄漏,导致内存没有马上被释放;
请确认下会不会有上面问题 1 存在,如果不是问题 1 的话。
能帮忙在模式 2 跑一段时间,然后通过 show processlist 或者 connection 的监控看看链接数会不会一直累加。
另外麻烦把 profile 的数据给一下,主要想看 heap 和 goroutines,之前那个只有 svg 图,不太好看是否有后台 goroutine 在持续运行并占用内存。
测试结果:
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没有释放
感谢!@lindoubled
目前发现一点可能造成内存泄漏的地方,能否帮忙试试把 oom-use-tmp-storage 这个配置关闭,然后再尝试在你的环境跑一下看能否复现?如果不能复现应该就是这个相关 feature 导致的。
另外我这边也会尝试在本地复现一下这个问题。
我在本地复现这个问题了,确实是对应功能导致的内存泄漏。
我看你用的是 4.0.0-rc 版本,我后面确认了下 4.0.0-rc2 上这个 bug 已经解决,可以的话能否升级到 4.0.0-rc2 使用?
1 个赞
@qw4990-PingCAP
结论:
确实是oom-use-tmp-storage参数问题
测试结果:
我只改了其中一台配置,其它两台oom还是true
感谢热心帮忙,谢谢,我们会尽快升级到4.0.0-rc2 版本