执行单条sql的内存超出了阈值

为提高效率,请提供以下信息,问题描述清晰能够更快得到解决:
【 TiDB 使用环境】
【概述】场景+问题概述
执行一条delete语句时,因错误使用where条件,导致单条sql删除的数据过多,使用了大量内存,出现了OOM.

已经设置单条 SQL 语句可以占用的最大内存阈值, mem-quota-query设置为1G,但执行的时候超出了这个值.请问下超出阈值的原因,是否还有其他参数需要设置?

【TiDB 版本】
v5.0.3

【附件】

  1. TiUP Cluster Edit Config 信息

  2. TiKV-Trouble-Shooting
    7:44左右执行了这条有问题的sql,导致内存急升,最后出现oom killer,然后自动重启了.


    [相关日志信息]

tidb在这个时间范围内有相应的警告信息

[2021/10/15 07:44:54.000 +08:00] [WARN] [memory_usage_alarm.go:141] ["tidb-server has the risk of OOM. Running SQLs and heap profile will be recorded in record path"] ["is server-memory-quota set"=false] ["system memory total"=33566277632] ["system memory usage"=26857930752] ["tidb-server memory usage"=4167543728] [memory-usage-alarm-ratio=0.8] ["record path"="/tmp/1000_tidb/MC4wLjAuMDo0MDAwLzAuMC4wLjA6MTAwODA=/tmp-storage/record"]

dmesg

[4120475.131668] [ 8708]  1000  8703  8542792  4316978   15009        0             0 time-monitor
[4120475.131670] [12989]  1000 12989  3004165  2691485    5353        0             0 tidb-server
[4120475.131673] [23383]    89 23383    22563      269      46        0             0 pickup
[4120475.131675] Out of memory: Kill process 8708 (time-monitor) score 528 or sacrifice child
[4120475.132373] Killed process 8708 (time-monitor), UID 1000, total-vm:34171168kB, anon-rss:17267912kB, file-rss:0kB, shmem-rss:0kB
[4134730.929258] tidb-server invoked oom-killer: gfp_mask=0x201da, order=0, oom_score_adj=0
[4134730.929264] tidb-server cpuset=/ mems_allowed=0

查一下 information_schema.cluster_slow_query 有没有这个 delete 语句及 Mem_max 内存统计的大小(单位 byte),另外还可以设置 txn-total-size-limit 单个事务大小,最好还是 where 条件后面加 limit 进行限制

1 个赞

确认一下即使是修改好之后的where条件,执行时影响的行数到底有多少呢?
如果到了100w级别,那1G估计不够,可以考虑再加大一点。

有一个session级别的变量: tidb_mem_quota_query 作用与 mem_quota_query配置参数一样。
可以先用客户端连接之后调大这个变量,然后执行sql,不断调整,直到能够满足这个sql执行的内存阈值,然后修改mem_quota_query配置。

或者是优化sql,分段分批次delete

正常sql应该是30W左右. 现在已经加limit分批次去删数据了.
因为这条sql执行导致重启了,在cluster_slow_query没有记录;
但是有看到其他sql使用的memory超过1G的.

单个业务出现故障,去修复,去优化问题都不是很大. 主要担心因为单条sql的问题,影响整个服务. 像今天的问题就导致出现了好多慢sql.

除了限制内存,还可以设置执行时间限制,通常执行慢的 SQL 都比较耗资源
https://docs.pingcap.com/zh/tidb/stable/system-variables#max_execution_time

ok 多谢

像创建索引这样的语句也会受这个参数影响吗?

add index 等 DDL 不会受 max_execution_time 影响

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。