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
相关产品推荐
相关产品推荐

