You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Presto运行时内存收集机制及查询内存使用获取方法咨询

关于Presto运行时查询内存收集与管控的逻辑拆解

嘿,我来帮你理清这段代码里Presto是怎么收集和处理运行中查询内存的~

首先,这段代码是ClusterMemoryManager定期巡检内存时的核心逻辑片段,咱们一步一步拆解:

1. 单查询内存的收集入口

代码里的query.getUserMemoryReservation()是获取单个运行中查询内存使用量的关键:

  • 这个方法返回的是该查询当前已申请并保留的用户内存字节数,涵盖了查询执行过程中各类算子(比如Join、Aggregate)、中间缓存数据等占用的内存。
  • 背后的实现逻辑是:Presto为每个查询分配对应的MemoryPool,查询执行时会向内存池申请内存,QueryExecution会实时跟踪自己在内存池中的预留内存量,这个方法就是直接读取该统计值。

2. 集群级内存的汇总

遍历所有QueryExecution(正在运行的查询)时,代码会把每个查询的内存使用量bytes累加到totalBytes中,这一步就是收集集群整体内存使用情况的过程,用来判断集群是否处于内存紧张状态。

3. 内存超限的管控逻辑

拿到单查询内存和限制后,代码会做两种场景的超限处理:

  • 开启资源超配(resourceOvercommit=true)的查询:只有当集群已经触发OOM(outOfMemory为true)时,才会强制终止该查询。这类查询允许在集群有剩余内存时超额使用,但集群内存耗尽时会被优先清理。
  • 未开启资源超配的查询:只要查询的实际内存使用bytes超过了它的内存上限(取全局maxQueryMemory和会话级sessionMaxQueryMemory的较小值),就会直接终止查询,并抛出内存超限异常。

简单来说,ClusterMemoryManager就是通过定期遍历所有运行查询,调用getUserMemoryReservation()获取单查询内存,再汇总集群整体内存,以此为依据做内存超限的管控。

内容的提问来源于stack exchange,提问作者lulijun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:52:39