美文网首页
presto内存配置以及调优(防止OOM等操作)

presto内存配置以及调优(防止OOM等操作)

作者: 早点起床晒太阳 | 来源:发表于2020-07-02 16:36 被阅读0次

    参考文档
    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,如图所示


    image.png

    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。如图所示


    image.png

    内存池的查看的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
    

    相关文章

      网友评论

          本文标题:presto内存配置以及调优(防止OOM等操作)

          本文链接:https://www.haomeiwen.com/subject/fqmrqktx.html