概述
目录
- 1. presto的内存结构
- 2. 参考文献
1. presto的内存结构
下图是presto-worker
节点的内存示意图:
图片来源于互联网
可以粗略的认为presto的jvm.properties
配置文件中的jvm堆内存会被分为3份:
- 系统内存池(
SystemMemoryPool
) - 保留内存池(
ReservedMemoryPool
) - 普通内存池(
GeneralMemoryPool
)
这三者的区别:
System Pool
是用来保留给系统使用的,默认为40%的内存空间留给系统使用。Reserved Pool
和General Pool
是用来分配query运行时内存的。
其中大部分的query使用general Pool。 而最大的一个query,使用Reserved Pool
, 所以Reserved Pool的空间等同于一个query在一个机器上运行使用的最大空间大小。
General则享有除了System Pool和General Pool之外的其他内存空间。
presto的官方文档中有几个内存配置项:
-
单个节点维度的内存配置项:
query.max-memory-per-node
,一个 query可以使用的最大内存(用户内存),这对应的就是Reserved Pool
的内存。默认jvm堆内存*0.1
。query.max-total-memory-per-node
,一个 query可以使用的最大内存(用户内存+系统内存,即包含系SystemMemoryPool
内存),默认jvm堆内存*0.3
。memory.heap-headroom-per-node
,非查询使用的内存 。不确定是否属于SystemMemoryPool
-
presto集群维度的内存配置项:
query.max-memory
,在presto集群中,一个query可以使用的最大内存(用户内存)。默认20G
query.max-total-memory
,在presto集群中,一个query可以使用的最大内存(用户内存+系统内存,即包含系SystemMemoryPool
内存)。默认query.max-memory*2
。
举个例子,presto-worker机器配置为32C128G,worker节点数为8,按如下进行分配:
- presto的
jvm堆内存
分配70G, query.max-memory-per-node
分配40G,query.max-total-memory-per-node
分配45G,query.max-memory
分配320G,40G*8=320G,query.max-total-memory
分配360G,45G*8=360G,memory.heap-headroom-per-node
分配21G,jvm堆内存*0.3=70G*0.3=21G(假如走的默认配置)。
根据上述配置可推出,
- 耗费内存最大的 一个 query,
- 在每个worker上能使用的内存=
query.max-total-memory-per-node
=45G, - 在整个presto集群上能使用的内存=
query.max-total-memory
=360G。
- 在每个worker上能使用的内存=
- 其他query,
- 在每个worker上能使用的内存=
jvm堆内存
-query.max-total-memory-per-node
-memory.heap-headroom-per-node
= 70G - 45G - 21G = 4G, - 在整个presto集群上能使用的内存=4G*8=32G,感觉这里给少了。。
- 在每个worker上能使用的内存=
注:这个配置不一定合理,只是举这个例子来理解presto的内存配置。
2. 参考文献
[1] 深入理解Presto(3):Presto内存管理
[2] Presto内存调优及原理(基础篇)
[3] Presto 0.269 Documentation
最后
以上就是热心大叔为你收集整理的presto内存配置1. presto的内存结构2. 参考文献的全部内容,希望文章能够帮你解决presto内存配置1. presto的内存结构2. 参考文献所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复