背景

Trino 集群如果不做任何配置优化,按照默认配置上线,Master 和 Worker 节点都很容易发生 OOM。本文从 Trino 内存设计出发, 分析 Trino 内存管理机制,到限制与优化内存分配,使 Worker 节点不易发生 OOM。

Trino 内存类型

Trino(version 400)只有一个内存池,由 Coordinator 来管理这个内存池,即管理集群内存。

Coordinator 协调员一般为集群 Master 节点,Master 节点负责 SQL 解析、分析、优化以及分配查询 Task 给 Worker 节点;Worker 节点负责处理 Task,主要为 load 数据和计算数据,这也是集群内最吃资源的一块。所以我们也是针对这块进行优化处理。

Trino 内存管理机制

Trino 会每 2s 做一次内存分析:

  • 分析当前集群内存是否溢出

    • 当前内存集群内存溢出:Trino 会检查当前集群内存溢出的持续时间,如果持续时间超过了预设值(默认5min),则会根据配置好的 Kill Query策略去 Kill 掉查询。

      • query-low-memory-killer-policy:

        • none :不会杀死任何查询
        • total-reservation :终止当前使用最多总内存的查询。
        • total-reservation-on-blocked-nodes:终止当前在内存不足的节点上使用最多内存的查询
  • 分析当前时刻的所有查询是否超出了预设的内存上限
    • 分析查询是否超出了 query.max-memory-per-node / query.max-memory / query.max-total-memory,超出则 kill 掉
    • 这里 kill 掉查询的动作是有等待时间的。Trino 默认设置是等待5分钟,5分钟后集群依旧是oom状态才会去 kill 掉查询,可以设置 query.low-memory-killer.delay 值来减少等待时间。

以上的内存管理是针对 query 的,不针对 master 节点解析SQL、分析、优化和调度的操作

Trino 资源组限制内存

Trino 资源组也可以限制用户使用内存

主要是通过 softMemoryLimit 限制内存的使用。

官方文档

softMemoryLimit (required): maximum amount of distributed memory this group may use, before new queries become queued. May be specified as an absolute value (i.e. 1GB) or as a percentage (i.e. 10%) of the cluster’s memory.

意思是:在每个查询开始之前,会判断当前用户组使用集群的内存情况,如果超过了设定值,则在队列内等待。直至该用户组使用集群内存降下到预设值。

如:下面配置的意思是,所有的用户都属于admin组,admin组限制了在集群内最高并发50条查询,最长等待队列是300;当admin使用集群内存超过80%时,查询需要在队列中等待。

{
"rootGroups": [
{
"name": "admin",
"softMemoryLimit": "80%",
"hardConcurrencyLimit": 50,
"maxQueued": 300,
}
],
"selectors": [
{
"user": ".*",
"group": "admin"
}
]
}

优化思路:

  1. 配置每个查询的使用的内存上限

    a. query.low-memory-killer.delay = 4GB

    b. query.max-memory = 8GB

    c. query.max-memory = 8GB
  2. 降低当集群内存不足时, 降低 Trino kill query 的等待时间和 kill 查询的策略

    a. query.low-memory-killer.delay = query.low-memory-killer.delay

    b. query.low-memory-killer.delay = 10s
  3. 配置资源组,避免当集群内存负载高时插入新查询
  4. 开启 spill 选项,允许内存 load 到磁盘

通过以上配置,Trino Worker 就能变得稳定起来。另外可以通过 event listen 机制收集并持久化 query 日志,观察和分析 Trino 压力与瓶颈,从而针对性提升 Trino 的性能。Trino 调优我觉得是很艰难的一件事,我一步步摸索着过来,路漫漫而远兮,吾将上下而求索。

最新文章

  1. Linux下使用vsftp
  2. Qt5.3 打印示例时出现错误
  3. 学习android的博客
  4. JSP的笔记
  5. [Django1.6]The MEDIA_ROOT and STATIC_ROOT settings must different 解决
  6. drawRect & layoutSubviews 调用时间
  7. TSP(个人模版)
  8. 【Luogu1291】百事世界杯之旅(动态规划,数学期望)
  9. 微信小程序--试水
  10. Python爬虫之Requests库的基本使用
  11. Axios Token验证拦截器
  12. Java之可变参数方法使用说明
  13. java获取随机密码
  14. 《SLAM for Dummies》中文版《SLAM初学者教程》
  15. JVM之JIT
  16. 洛谷 P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows 解题报告
  17. 流程设计器jQuery + svg/vml(Demo1 - 构建设计器UI界面)
  18. 重构改善既有代码设计--重构手法05:Introduce Explaining Variable (引入解释性变量)
  19. 最新JAVA编程题全集(50题及答案)
  20. java web 程序---登陆验证注销/重定向session_login.jsp/

热门文章

  1. Java集合容器的深度理解
  2. LuoguP3047 [USACO12FEB]附近的牛Nearby Cows(树形DP,容斥)
  3. [HFCTF2020]EasyLogin-1|JWT身份伪造
  4. day27--Java集合10
  5. C#基础_类的声明
  6. 「题解报告」P4577 [FJOI2018]领导集团问题
  7. 第六十二篇:Vue的双向绑定与按键修饰符
  8. KingbaseES 命令行安装数据库
  9. KingbaseES R6 集群手工配置VIP案例
  10. 基于 vite 创建 vue3 全家桶项目(vite + vue3 + tsx + pinia)