Trino Worker 规避 OOM 思路
背景
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-low-memory-killer-policy:
- 当前内存集群内存溢出:Trino 会检查当前集群内存溢出的持续时间,如果持续时间超过了预设值(默认5min),则会根据配置好的 Kill Query策略去 Kill 掉查询。
- 分析当前时刻的所有查询是否超出了预设的内存上限
- 分析查询是否超出了 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"
}
]
}
优化思路:
- 配置每个查询的使用的内存上限
a. query.low-memory-killer.delay = 4GB
b. query.max-memory = 8GB
c. query.max-memory = 8GB - 降低当集群内存不足时, 降低 Trino kill query 的等待时间和 kill 查询的策略
a. query.low-memory-killer.delay = query.low-memory-killer.delay
b. query.low-memory-killer.delay = 10s - 配置资源组,避免当集群内存负载高时插入新查询
- 开启 spill 选项,允许内存 load 到磁盘
通过以上配置,Trino Worker 就能变得稳定起来。另外可以通过 event listen 机制收集并持久化 query 日志,观察和分析 Trino 压力与瓶颈,从而针对性提升 Trino 的性能。Trino 调优我觉得是很艰难的一件事,我一步步摸索着过来,路漫漫而远兮,吾将上下而求索。
Trino Worker 规避 OOM 思路的更多相关文章
- Presto 在字节跳动的内部实践与优化
在字节跳动内部,Presto 主要支撑了 Ad-hoc 查询.BI 可视化分析.近实时查询分析等场景,日查询量接近 100 万条.本文是字节跳动数据平台 Presto 团队-软件工程师常鹏飞在 Pre ...
- Android应用性能优化(转)
人类大脑与眼睛对一个画面的连贯性感知其实是有一个界限的,譬如我们看电影会觉得画面很自然连贯(帧率为24fps),用手机当然也需要感知屏幕操作的连贯性(尤其是动画过度),所以Android索性就把达到这 ...
- 转——Android应用开发性能优化完全分析
[工匠若水 http://blog.csdn.net/yanbober 转载请注明出处.] 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉 ...
- Android 应用开发性能优化完全分析
1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只 ...
- 【转】Android应用开发性能优化完全分析
http://blog.csdn.net/yanbober/article/details/48394201 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关 ...
- Android应用开发性能优化完全分析
1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只 ...
- android开发性能分析
1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只 ...
- [转帖]分布式Unique ID的生成方法一览
分布式Unique ID的生成方法一览 http://www.importnew.com/22211.html 分布式的Unique ID的用途如此广泛,从业务对象Id到日志的TraceId,本文总结 ...
- apache 运行一段时间出现错误
环境是win2008,apache 2.4.29 Win64 VC15,php 7.1.10(7.1.11).事件完整内容: “-------------------------- 错误应用程序名称: ...
随机推荐
- 巨细靡遗流程控制,Go lang1.18入门精炼教程,由白丁入鸿儒,Go lang流程结构详解EP09
流程结构就是指程序逻辑到底怎么执行,进而言之,程序执行逻辑的顺序.众所周知,程序整体都是自上由下执行的,但有的时候,又不仅仅是从上往下执行那么简单,大体上,Go lang程序的流程控制结构一共有三种: ...
- 微软Azure配置中心 App Configuration (一):轻松集成到Asp.Net Core
写在前面 在日常开发中,我这边比较熟悉的配置中心有,携程Apollo,阿里Nacos(配置中心,服务治理一体) 之前文章: Asp.Net Core与携程阿波罗(Apollo)的第一次亲密接触 总体来 ...
- HDU 6222 Heron and His Triangle (pell 方程)
题面(本人翻译) A triangle is a Heron's triangle if it satisfies that the side lengths of it are consecutiv ...
- 【java】学习路径29-异常捕捉实例
import java.util.ArrayList;public class ExceptionCatchDemo { public static void main(String[] args) ...
- tomcat服务器和servlet的基本认识
今天下午在知乎看见了一个老哥的文章,写的是servlet写的很好,以前我对Javaweb方面的理解比较混乱今天看了这位老哥的文章后受益匪浅,知乎名叫:bravo1988 里面也有讲servlet和s ...
- 如何用 refcursor 返回结果集
可以通过返回 Refcursor 类型的函数,或者out 类型的函数或 procedure 返回结果集. 一.返回refcursor 类型的函数 create or replace function ...
- ConcurrentDictionary<T,V> 的这两个操作不是原子性的
好久不见,马甲哥封闭居家半个月,记录之前遇到的一件小事. ConcurrentDictionary<TKey,TValue>绝大部分api都是线程安全且原子性的, 唯二的例外是接收工厂委托 ...
- .NET 6当中的Web API版本控制
大家好,我是张飞洪,感谢您的阅读,我会不定期和你分享学习心得,希望我的文章能成为你成长路上的垫脚石,让我们一起精进. 为了了解ASP.NET Core Web API的版本控制,我们必须了解API中的 ...
- logstash中output{}的另类写法
日志传输路径如下: filebeat->redis->logstash->es 在filebeat配置文件中,收集日志的时候配置的有如下参数: fields: log_source: ...
- shell脚本中执行source命令不生效的解决办法
一个shell脚本文件中有一个source命令,使用bash a.sh命令执行后source命令进行验证没有生效. 这是因为在shell脚本中执行source会看到效果,但是shell脚本执行完后再次 ...