参考文档
https://prestodb.io/blog/2019/08/19/memory-tracking
http://armsword.com/2019/11/13/the-configuration-settings-of-presto-memory-management/#more (大佬博客,受益匪浅)
前言
良好的掌握内存配置有利于对于presto进行更好的配置和调优
Presto的内存池
在Presto引擎中,有两种类型的内存分配:user和system。User memory是和输入的数据强相关的。(例如,聚合的内存使用与其成正比)。system memory 是执行的副产品(比如表扫描和写入缓冲区),并且不一定与查询输入聚合等操作有很强的相关性。
内存的分配直接来自于presto的worker的memory pools。 memory pools由2个pools组成 General Pool和Reserved Pool,如图所示
General Pool:General Pool提供User memory和system memory的分配在正常模式下。
Reserved Pool : 当有一个worker的General Pool 内存耗尽,reserved pool将会发挥作用。这个时候coordinator 将会选出集群出消耗内存最大的查询,并将该查询分配给所有worker的reserved pool。
Reserved Pool的值等于query.max-total-memory-per-node的大小。 query.max-total-memory-per-node是单个节点User memory 和system memory占用的最大值。
而且Reserved Pool是启动时系统预留的,一起动就会占用,所以现在有一个问题,在实际中的情况来讲,我们会极少使用到Reserved Pool,而且它还占用了很多的内存资源。
所以我们可以通过配置参数
experimental.reserved-pool-enabled=false
来禁用Reserved Pool。如图所示
内存池的查看的URL为 discovery.uri/ui/worker.html?node.id (presto的etc配置中的),这样我们就可以方便的查看每个worker的内存相关情况了
presto内存相关的参数
参考资料
https://prestodb.io/docs/current/admin/properties.html
query.max-memory-per-node
在单个worker上面可以使用的最大的user memory值 (默认JVM max memory * 0.1)
query.max-total-memory-per-node
在单个worker上面可以使用的最大的user memory + system memory (默认JVM max memory * 0.3)
query.max-memory
查询在整个集群的user memory最大使用量 (默认20G)
query.max-total-memory
查询在整个集群的user memory+system memory最大使用量 (默认query.max-memory * 2)
memory.heap-headroom-per-node
这个目前不太理解
query.low-memory-killer.policy
这个配置决定了当集群内存不足时的终止策略。有三个参数none,total-reservation,total-reservation-on-blocked-nodes (后两个参数的区别以后懂了再讲)
具体配置
具体配置在presto安装目录/etc/config.properties里面配置,我这边借鉴了这篇文章的配置http://armsword.com/2019/11/13/the-configuration-settings-of-presto-memory-management/#more
,我直接贴出他的回答(假设JVM XMX 为80G)
query.max-memory=120GB # 默认为20GB,query.max-memory-per-node * 8 * 0.8 ,倾斜按照0.8算即可
query.max-memory-per-node=20GB # 默认值0.1 * XMX,一般线上按照0.25*XMX算,这个最好结合自己并发,如果并发大,大查询多,值最好小一点,稳定性考虑
query.max-total-memory-per-node=32GB # 默认值0.3*XMX,一般设置为0.4*XMX
experimental.reserved-pool-enabled=false # 不使用RESERVED_POOL
memory.heap-headroom-per-node=16GB # 默认0.3*XMX,一般使用的是0.2*XMX
query.low-memory-killer.policy=total-reservation-on-blocked-nodes # Kill策略,干掉Blocked的最大查询,GENERAL_POOL满了,防止OOM