本文分享自华为云社区《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节点的内存池出现内存不足(即该节点阻塞了),则认为发生了内存溢出

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

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

  1. 如何保证申请内存的地址是4的倍数

    前两天遇到了一个需求: 是每次申请一块内存空间 需要的首地址必须要是4的倍数 于是瞬间就想到了这不是就是在应用层重新封装一下malloc 和free 嘛,或者你自己实现一个应用层的内存池自己来管理内存 ...

  2. cas-----保证数据一致性,cas操作间的可见性,但不保证JMM内存可见性

    先来个示例: import lombok.Data;@Data public class CasTestObjecy {private int value = 0; } package com.fen ...

  3. jvm中有哪些内存区域会发生内存溢出

    1.方法区溢出 第一种原因:上线的时候MetaSpace区域直接用默认的参数,即根本不设置其大小,这会导Meta Space区域可能才几十M而已或者设置的比较小,此时对于一个稍微大型系统,因为他有很多 ...

  4. 安卓程序如何保证低内存下依然存在

    创建通知,并且把当前的activity放到前台可以保证低内存条件下当前activity依然存在 Notification n=new .....startForeground(Process.myPi ...

  5. Java架构学习(十二)java内存结构新生代老年代JVM参数调优堆内存参数配置解决堆栈溢出

    JVM参数调优与垃圾回收机制 一.java内存结构 Java内存模型:是多线程里面的,jmm与线程可见性有关 Java内存结构:是JVM虚拟机存储空间. Java内存结构图 Java内存机构分为:方法 ...

  6. HJ94 记票统计(因为数组内存未足够分配而溢出)

    描述 请实现一个计票统计系统.你会收到很多投票,其中有合法的也有不合法的,请统计每个候选人得票的数量以及不合法的票数. 本题有多组样例输入. 输入描述: 输入候选人的人数n,第二行输入n个候选人的名字 ...

  7. 【牛客网】-【并发详解】-【并发编程基础】-【原子类】

    目录 并发编程基础 原子类 参考书目: 并发编程基础 在操作系统中,并发是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处 ...

  8. Linux操作系统浅尝辄止

    操作系统 操作系统(OS)是当今最复杂的系统软件之一,它几乎是所有复杂应用软件的基础.操作系统本质上是一组程序,他管理和控制其他程序的执行,并充当应用程序和计算机硬件之间的接口.操作系统相当于一个管理 ...

  9. 彻底理解 Raft 共识算法及 etcd/raft 源码解析

    译者序 本文翻译自 USENIX 2014 论文 In Search of an Understandable Consensus Algorithm (Extended Version)[1] ,文 ...

最新文章

  1. 关于数据库中NULL的描述,下列哪些说法符合《阿里巴巴Java开发手册》
  2. jquery自动补全
  3. 开源HTML5应用开发框架 - iio Engine
  4. 如何在Pandas中使用Excel文件
  5. scanf输入数组_清除C / C ++中的输入缓冲区,妈妈再也不用担心我的学习
  6. Win系列:VC++编写自定义组件
  7. 简单设计企业级JOB平台
  8. 本地存储Sqlite的用法:
  9. jBPM4工作流应用开发指南
  10. 视频中的外挂字幕、硬字幕、软字幕定义的区别
  11. python——txt文本处理
  12. 不能说のsecret 5
  13. 电源电压测试肯定要电流探头吗?
  14. JSONObject 与 JSON 互转
  15. 明源云与华为联合发起828 B2B企业节,共同成就好生意!
  16. android手机无法root成功,为什么有的安卓手机不能Root?
  17. Grid 布局实现九宫格图片动画
  18. html锚机链接的使用+代码
  19. 想要制作令人震撼的大屏可视化,要如何提升自己的可视化效果?
  20. linux php gettext,在Ubuntu上无法获取gettext(php)工作

热门文章

  1. Jono Bacon的社区管理指南
  2. (39)css3实现轮播图效果
  3. 前端:JS/18/JS运算符(算术运算符,赋值运算符,字符串运算符,比较运算符,逻辑运算符,三元运算符),window.prompt()
  4. 程序| 只要使用这个功能,程序运行速度瞬间提升,高到离谱!
  5. java半解释半编译_编译型语言、解释型语言、半编译半解释型语言
  6. linux testlink安装,Linux下安装testlink
  7. C++自己实现一个String类(腾讯阿里面试题目)
  8. 实现前后端数据交互方法汇总
  9. ECMAScript6 ES6语法
  10. 常见设计模式结构图助记之结构型