【 TiDB 使用环境】生产环境
【 TiDB 版本】V 7.1.0
【遇到的问题:问题现象及影响】 TIDBserver 内存占用过高如何进行分析
要查看当前实例或集群的内存使用情况,你可以查询系统表 INFORMATION_SCHEMA.(CLUSTER_)MEMORY_USAGE
。
要查看本实例或集群中内存相关的操作和执行依据,可以查询系统表 INFORMATION_SCHEMA.(CLUSTER_)MEMORY_USAGE_OPS_HISTORY
。对于每个实例,该表保留最近 50 条记录。
MEMORY_USAGE_OPS_HISTORY这个视图里显示为0条,这是怎么情况,还有其他的手段能获取到tidbserver这个进程占用的内存都包括哪些呢?
tidb server 突然激增一般都是慢SQL,分析一波
线上只有写入,没有读请求哦
这……,我真还没遇到这种情况
cat tidb.log|grep expensive
试一下,包含执行或未执行完的所有慢查询里没有的大内存SQL
看一下dashboard里面哪些top sql,一般都是他们搞的鬼
一般从topsql入手,解决了topsql问题资源消耗大问题后面问题应该也解决了
可以参考的排查思路:
tidb-server 内存过高 -》说明存有较多的数据消耗了内存 -》涉及过多数据的操作通常是慢SQL -》排查慢SQL -》tidb dashboard -》查看集群top sql 和慢查询SQL -》选定、确认内存过高的时段和tidb-server实例节点 -》确认某类或某几类SQL -》分析SQL使用情况 -》优化SQL 或 业务调整 -》扩容内存或扩容tidb-server节点
只有INSERT+DELETE操作,没有SELECT读请求
在dashborad看资源利用率,一般都是慢sql引起的,如果没慢sql,看是不是语句占用内存过大
看一下那段时间dashboard里面的top sql,一般都是慢sql引起的
线上读写SQL都停掉了,但是TIDBSERVER进程占的内存还是没降低,会不会跟我这边创建的表的个数多有关系,目前库里有6万多张表
如何能看到TIDBSERVER进程里哪些线程占用的内存多呢、一般MySQL原生80上SYS库里有个MEM的视图,非常清晰的能看到哪些线程占用多少内存
线程能看到,用这个命令 top -Hp pidof tidb-server
但是结果看不出什么来。
还有其他的办法么? 这个问题跟SQL关系不大
curl -G tidb_ip:port/debug/pprof/heap > heap.profile
然后使用go tool pprof db.heap.prof → top命令查看