写点什么

Presto 内存参数设置建议

作者:冰心的小屋
  • 2023-08-11
    北京
  • 本文字数:1311 字

    阅读完需:约 4 分钟

Presto 内存参数设置建议

Presto 有很多和内存相关的参数,如果你刚接触 Presto 难免会迷惑,接下来结合本人工作实践,分享下我的理解。

1. 内存用途

  • 给操作系统:需要预留一定比例的内存,内核运行需要内存,Page Cache 需要内存,预留内存还有一个好处可以降低 Presto 进程被 Linux OOM Killer 干掉的风险;

  • 给 Presto 进程运行:Presto 进程运行需要内存,在 etc/jvm.config 文件中可配置 JVM 使用的最大堆内存;

  • 给 SQL 查询:SQL 语句会经过语法分析 -> 语义分析 -> 逻辑计划 -> RemoteTaskFactory 创建多个 RemoteTask,RemoteTask 会在实际的 Work 中执行,所以需要限制 RemoteTask 执行时使用的内存,不然 Worker 会有内存溢出风险。

2. 内存参数设置建议

2.1 内核

  • vm.dirty_background_ratio = 80%,当系统脏页比例达到 80% 以上时,开始将脏页写入磁盘,写入过程不会阻塞新的请求;

  • vm.dirty_ratio = 95 %,系统脏页比例达到 95% 以上时,阻塞写入请求,将将脏页写入磁盘;

  • 系统内存预留:总内存的 15%~20%,假设主机内存 32GB,你可以留给操作系统 5~7GB 之间。

2.2 JVM

  • -Xmx:总内存的 80% ~ 85%,假设主机内存 32GB,最大堆内存 -Xmx25G~-Xmx27G;

  • -XX:MaxDirectMemorySize:总内存的 10% 左右,假设主机内存 32GB,-XX:MaxDirectMemorySize=3G;

  • -Djdk.nio.maxCachedBufferSize:每个线程可使用的最大临时缓冲区高速缓存,这个区域不受 GC 控制,NIO 底层实现时基于 DirectByteBuffer 用于 IO 的读写操作,该属性单位只支持 bytes,建议配置为 2 * 1024 * 1024(2MB)即 -Djdk.nio.maxCachedBufferSize=2097152。

2.3 Presto 内存参数

作用于单个 Work:

  • query.max-memory-per-node:查询可使用最大 heap,默认 JVM 最大堆内存 * 0.1;

  • query.max-total-memory-per-node:查询可使用的最大 heap + non-heap 内存;

  • memory.heap-headroom-per-node:headroom 区域,JVM 堆中的保留区域,该区域不可被追踪,该值 <= JVM 最大堆内存 - 最大 heap + non-heap 内存,另外 Presto 有两类内存池:

  1. 内存池 reserve :可使用的最大内存即 query.max-total-memory-per-node

  2. 内存池 general :可追踪的内存, SQL 执行需要的内存都在这里分配,内存大小 = JVM 最大堆内存 - headroom 区域大小。


作用于整个集群:

  • query.max-memory:查询时在整个集群中可使用的最大 heap;

  • query.max-total-memory:查询时在整个集群中可使用的最大 heap + non-heap 内存。


设置建议:

生产环境要结合表的容量、用户并发数和 worker 数量,如果查询最大内存为 100GB,假设有 10 个内存均为 32GB 的 Worker,每个 Worker 平均分担 100GB /10 = 10GB 的内存,所以:

  • query.max-memory-per-node 可以设置为 10GB 的 1~1.2 倍即 10~12 GB 之间;

  • 每个 worker 限制使用 non-heap 3GB,故 query.max-total-memory-per-node 在 13~15 GB 之间;

  • memory.heap-headroom-per-node 设置成 3GB 足够了;

  • query.max-memory 在 10 x 10~12 x 10 GB 之间;

  • query.max-total-memory 在 13 x 10 - 15 x 10 GB 之间。


下面是实际配置的例子:

  • query.max-memory-per-node=10GB

  • query.max-total-memory-per-node=13GB

  • memory.heap-headroom-per-node=3GB

  • query.max-memory=100GB

  • query.max-total-memory=130GB

发布于: 刚刚阅读数: 3
用户头像

分享技术上的点滴收获! 2013-08-06 加入

一杯咖啡,一首老歌,一段代码,欢迎做客冰屋,享受编码和技术带来的快乐!

评论

发布
暂无评论
Presto 内存参数设置建议_presto_冰心的小屋_InfoQ写作社区