一. 前言
我们知道,在Presto中,查询内存的分GENERAL内存池内存和RESERVED内存池内存。本文主要讲述在Presto中GENERAL POOL和RESERVED POOL的划分意义以及大小计算。
二. GENERAL_POOL和RESERVED_POOL
GENERAL_POOL和RESERVED_POOL 具有如下特点:
-
在Presto中,查询任务一开始都会被提交到GENERAL POOL中运行。
-
RESERVED内存池设计是为了给最耗内存的那个查询使用的,并且此内存池最多只会执行一条查询。
-
Presto会定期扫描所有查询,当GENERAL使用内存被占满但是RESERVED又是空的时候,Presto将执行最耗内存的查询从通用区移到保留区内执行。
-
不在保留区的查询,只能申请使用通用区的内存使用。
上述的核心代码如下所示:
三. Presto中GENERAL_POOL和RESERVED_POOL 的大小管理
1. 开启保留区内存时(开启experimental.reserved-pool-enabled):
保留区内存的大小 = query.max-total-memory-per-node
通用区内存的大小 = xmx大小 - memory.heap-headroom-per-node的大小 - 保留区的大小
2. 关闭保留区内存时:
保留区内存的大小 = 0
通用区内存的大小 = xmx大小 - memory.heap-headroom-per-node的大小