目录
- 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可以使用的最大内存(用户内存)。默认20Gquery.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.内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复