假如设置最大Heap内存为35G
需要考虑的Heap最大值因素,因为需要给系统与其他守护进程留有空间,所以最好不要将内存设置为机器内存大小
prestor参数
query.max-memory-per-node
每个机器上用于执行用户任务的内存大小,比如:排序等操作,超出限制将kill
query.max-total-memory-per-node
每个节点上用于系统与用户任务的内存大小,该参数据包括上一个参数,多出系统所用内存,比如系统分配读写等,超出限制将kill
query.max-memory
整个集群可以使用的最大用户执行内存
query.max-total-memory
整个集群可以使用的最大的系统和用户执行内存
memory.heap-headroom-per-node
各人理解是预保留的内存区域,用于一些非用户查询,有点像jvm perm(错误的理解)
该区域为不监控内存区,主要保存一些辅助信息,比如帮助jvm gc回收等
presto内存分类:通用pool,系统 pool,预留pool
通用pool主要是执行查询
系统pool主要执行查询的系统调用
预留pool与上面的memory.heap-headroom-per-node对应(错误的理解)
预留pool是为一些大的查询预留的内存空间,比如有很多并发查询,占用了大多数的空间,当有一个大的查询它一直获得不到
资源会将它分配预留空间,但是该空间的查询只 能是排队执行的
参数与pool的对应关系
0.201 前 query.max-memory-per-node 代表预留pool的大小
0201后 query.max-total-memory-per-node代表预留pool的大小
0.201后系统pool被废除,可以看到 query.max-total-memory/query.max-total-memory-per-node
来控制用户加系统内存大小
所以通用pool 在最新版本 = max heap - query.max-total-memory-per-node- memory.heap-headroom-per-node
- query.max-memory-per-node = 12GB
- query.max-total-memory-per-node =15GB
- memory.heap-headroom-per-node = 8GB
计算通用pool=35G - 15G - 8G
假如我们确定query.max-memory 48G还需要考虑query.initial-hash-partitions 的设置
如果query.initial-hash-partitions =8那么
48G / 8 =6G
那么 12G/6G =2,这表示如果在hash partition的时候,现有通用pool大小可以容忍两倍的数据倾斜。
初次察看presto相关文档,不对之处,请大家指证。