写点什么

presto 是如何保证作业内存不会发生冲突和溢出

  • 2022 年 3 月 22 日
  • 本文字数:1559 字

    阅读完需:约 5 分钟

本文分享自华为云社区《presto是如何保证作业内存不会发生冲突和溢出?presto内存管理机制深入分析》,作者:breakDawn。


presto 计算引擎作为一个纯内存计算引擎,是如何保证计算过程不会发生作业内存溢出的?本篇文章会进行深入的学习和分析。


首先,presto 分了如下 3 个内存池


System Pool

System Pool,指系统内存池,是用来保留给系统和缓冲区使用的,默认为 40%的内存空间留给系统使用。看来对于 presto 来说,作业之间的缓冲区是存在共用的,认为是系统、通用层面的部分。

General Pool

常规内存池,用来分配每个 query 运行时内存的。其中大部分的 query 使用 general Pool。

Reserved Pool

保留内存池,用来为可能突然触发的超大作业进行内存保留分配。即最大的一个 query,会使用 Reserved Pool

Reserved Pool 的空间等同于一个 query 在一个机器上运行使用的最大空间大小,默认是 10%的空间。


在真正执行物理计划前,内存需求都来自于 systemMemoryPool,包括临时数据结构,传输 buffer 等执行物理计划时,不同的 Operator 类型都根据需要申请内存,比如 aggregationOperator 使用 getEsctimatedSize()方法预估需要的内存。这里获取的内存来自于 reservatedMemoryPool 或者 generalMemoryPool,究竟使用哪个 pool 取决于当前查询是否耗用内存最大


问:为什么要引出一个 Reserved 内存池且只提供给 1 个作业使用?

如果没有 Reserved Pool, 那么当 query 非常多,并且把内存空间几乎快要占完的时候,某一个内存消耗比较大的 query 开始运行。但是这时候已经没有内存空间可供这个 query 运行了,这个 query 一直处于挂起状态,一直在等待可用的内存。但是其他的小内存 query 跑完后, 可能只腾出一点点的空间, 又有新的小内存 query 加进来。由于小内存 query 占用内存小,很容易找到可用内存。 这种情况下,大内存 query 就一直挂起直到饿死。

所以为了防止出现这种饿死的情况,必须预留出来一块空间,共大内存 query 运行。 预留的空间大小等于 query 允许使用的最大内存。Presto 每秒钟,挑出来一个内存占用最大的 query,允许它使用 reserved pool,避免一直没有可用内存供该 query 运行。

保留池的选举机制(Reserved 池是如何选出来的)

如下图所示:

Presto 内存管理,分两部分:

1. query 内存(作业内存)管理

query 划分成很多 task, 每个 task 会有一个线程循环获取 task 的状态,包括 task 所用内存。汇总成 query 所用内存。如果 query 的汇总内存超过一定大小,则强制终止该 query。

2. 机器内存管理

coordinator 有一个线程,定时的轮训每台机器,查看当前的机器内存状态。当 query 内存和机器内存汇总之后,coordinator 会挑选出一个内存使用最大的 query,分配给 Reserved Pool。内存管理是由 coordinator 来管理的, coordinator 每秒钟做一次判断,指定某个 query 在所有的机器上都能使用 reserved 内存。


问:如果某台机器上,,没有运行该 query,那岂不是该机器预留的内存浪费了?为什么不在单台机器上挑出来一个最大的 task 执行?

原因还是死锁,假如 query,在其他机器上享有 reserved 内存,很快执行结束。但是在某一台机器上不是最大的 task(即这个 task 在另一个节点可能只排第二名,被另一个大作业占了保留池, 导致下一步卡住了,无法连续的执行),一直得不到运行,导致该 query 无法结束。所以首要目的是保证 此刻已感知到的最大作业尽快执行完毕。


如何在内存不足时杀掉不需要的 query?

每次作业提交存在一个会话级别的配置 query_max_memory,即本次查询规定的最大内存在轮询过程种如果发现内存超出本次查询上限内存, 会杀掉这个 query。


还有个会话配置 resource_overcommit 如果设为 true,后面即使内存暂时超出单作业规定内存,业不会被杀掉但如果整个集群的内存出现不足,他仍然会被杀掉

  • 集群内存不足的判定:

  • 存在某个 worker 节点的内存池出现内存不足(即该节点阻塞了),则认为发生了内存溢出


点击关注,第一时间了解华为云新鲜技术~​

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

提供全面深入的云计算技术干货 2020.07.14 加入

华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算! 传送门:https://bbs.huaweicloud.com/

评论

发布
暂无评论
presto是如何保证作业内存不会发生冲突和溢出_内存_华为云开发者社区_InfoQ写作平台