TiFlash 查询报错,报错内容是EstablishDisaggregatedTask failed: Memory limit exceeded caused by 'RSS(Resident Set Size) much larger than limit'

报错内容是:
ERROR 1105 (HY000): other error for mpp stream: Code: 0, e.displayText() = DB::Exception: Receiver state: ERROR, error message: Exchange receiver meet error : Code: 0, e.displayText() = DB::Exception: Receiver state: ERROR, error message: Code: 0, e.displayText() = DB::Exception: EstablishDisaggregatedTask failed: Memory limit exceeded caused by 'RSS(Resident Set Size) much larger than limit' : process memory size would be 13.01 GiB for (attempt to allocate chunk of 135 bytes), limit of memory for data computing : 11.98 GiB.
但是我 TiFlash 节点内容是128G 的,应该不是内存不够导致的。另外也根据TiFlash 数据落盘调整了tiflash_mem_quota_query_per_node的值,还是一样的错误。

这里比较诡异,我使用的是存算分离架构,write节点是4C16G 配置,compute 节点是16C128G,这个限制难道是读到了 write 节点的内存?


还真的是,16G * 0.7 正好是11.2

“EstablishDisaggregatedTask failed” 这里是 tiflash write 节点在处理 EstablishDisaggregatedTask 的过程中出现错误。错误的直接原因是 ‘RSS(Resident Set Size) much larger than limit’,即 write node 的内存使用较高。

按照一般预期,write node 使用的内存应该不会打到这么高,可以用 clinic 收集并上传集群在执行查询出错时候的监控以及 tiflash compute, write 节点日志。再分析下。

https://docs.pingcap.com/zh/tidb/stable/clinic-user-guide-for-tiup#远程定位集群问题

1 个赞

write node节点 内存确实也有11G 左右了,不过write node 不承载主要的查询请求,内存使用量也这么大,是需要将所有 region 的状态信息放在内存里么?
另外有参数可以调整这个限制么?发现将tiflash_query_spill_ratio这个参数调整成0.85后,报错还是limit of memory for data computing : 11.98 GiB.并没有跟着变大

将 write node 的内存调大到 32G,确实能执行下去了,但是换成其他错了。。
ERROR 1105 (HY000): other error for mpp stream: Code: 0, e.displayText() = DB::Exception: Receiver state: ERROR, error message: Code: 0, e.displayText() = DB::Exception: Receiver state: ERROR, error message: Exchange receiver meet error : Poco::Exception. Code: 1000, e.code() = 10018, e.displayText() = Exception: Region error NOT_FOUND_TIKV, e.what() = Exception, e.what() = DB::Exception,, e.what() = DB::Exception,

重试了一下,执行成功了,后续重复执行了几次,也都正常了。 这个报错内容是指?

1 个赞

@dba-kit 要不按照 JaySon-Huang 的要求,收个 clinic 看看呢。看样子是不预期的🤔。