gp_vmem_protect_limit参数的意义

1、gp_vmem_protect_limit参数说明

1)在启用了基于资源队列的资源管理系统时,gp_vmem_protect_limit参数表示每个segment分配到的内存大小。预估值计算方式:所有GP数据库进程可用内存大小/发生故障时最大的primary segment个数。如果gp_vmem_protect_limit设置过高,则查询可能会失败。

2)该参数单位为MB

3)该参数推荐值计算方法:

先计算gp_vmem值,若总内存小于256GB:

gp_vmem = ((SWAP + RAM) – (7.5GB + 0.05 * RAM)) / 1.7

若总内存大于256GB:

gp_vmem = ((SWAP + RAM) – (7.5GB + 0.05 * RAM)) / 1.17

再计算max_acting_primary_segments:当mirror segment启动后,可以在主机上运行primary segment最大个数。块镜像配置下,比如4台主机,每个主机上8个primary segment:SDW2坏掉,会导致SDW3上对应的3个mirror提升主提供服务,也就是说一个主机上最多8+3=11个primary segment(SDW1有2个mirror提升主,SDW4有3个mirror提升主)。

最后计算gp_vmem_protect_limit值:

gp_vmem_protect_limit = <gp_vmem> / <acting_primary_segments>

4)对于产生大量workfile的场景,gp_vmem的计算方式

总系统内存<256GB:

<gp_vmem> = ((<SWAP> + <RAM>) – (7.5GB + 0.05 * <RAM> - (300KB * <total_#_workfiles>))) / 1.7

总系统内存>=256GB:

<gp_vmem> = ((<SWAP> + <RAM>) – (7.5GB + 0.05 * <RAM> - (300KB * <total_#_workfiles>))) / 1.17

2、问题

最近,业务执行复杂SQL的场景,会fork上千进程来执行该SQL。按照上述说明将gp_vmem_protect_limit参数调整为合理的值后,操作系统仍旧会OOM,将GP杀掉。

通过脚本统计所有进程的内存占用:/etc/<pid>/smaps中Pss值的和,发现该值远大于gp_vmem_protect_limit*segment个数。

gp_vmem_protect_limit参数为什么没有将这个场景下的内存限制住,导致系统OOM?

3、分析

我们首先看下代码中gp_vmem_protect_limit是如何限制的?

在日志中有时会看到有下面类似的日志:

VM protect failed to allocate %d bytes from system, VM Protect %d MB available

我们找到代码位置:gp_failed_to_alloc函数中,以此为线索进行梳理。

也就是函数VmemTracker_ReserveVmem会中会进行校验,我们看下这个函数:

VmemTracker_ReserveVmemChunks函数进行检测,返回是否能够分配成功,我们接着看下这个函数:因为我们使用的是资源组,所以仅整理资源组相关代码:

内存限制的判断:segmentVmemChunks > vmemChunksQuota

我们看下segmentVmemChunks和vmem_ChunksQuata来源:

//postmaster和fork的进程会调用

CreateSharedMemoryAndSemaphores

GPMemoryProtect_ShmemInit

        VmemTracker_ShmemInit//初始化vmem tracker共享内存中的状态

关注VmemTracker_ShmemInit函数:

三个初始值:segmentVmemChunks在共享内存,初始0;vmemChunksQuota为gp_vmem_protect_limit值;redZoneChunks红线值为gp_vmem_protect_limit*0.8。那么我们搜索代码后,vmemChunksQuota和redZoneChunks是定值了,不再变化,segmentVmemChunks在开始统计内存使用前,还会初始化一个启动使用内存:

可以看到segmentVmemChunks共享内存中的值加上了一个起始值,最大是16MB,为什么要加上这个16MB呢?下面是原因:主要是每个QE进程本身的committed memory

/*
* Add the per-process startup committed memory to vmem tracker.
*
* Postgresql suggests setting vm.overcommit_memory to 2, so system level OOM
* is triggered by committed memory size.  Each postgres process has several MB
* committed memory since it being forked, in practice the size can be 6~16 MB,
* depends on build-time and runtime configurations.
*
* These memory were not tracked by vmem tracker however, as a result an idle
* (just gets launched, or just finished execution) QE process has 0 chunks in
* track, but it might have 16MB committed memory.  The vmem tracker protect
* limit will never be reached no matter how many such processes there are, but
* when there are enough such processes the system level OOM will be triggered,
* which will lead to unpredictable failures on not only postgres but also all
* the other processes on the system.
*
* To prevent this worst case we add a startup cost to the vmem tracker, so the
* vmem tracker OOM will happen instead of the system one, this is less harmful
* and easier to handle.  The startup cost, however, is a hard coded value from
* practice for now, we may want to make a better estimation at runtime in the
* future.  Another thing to improve is that this startup cost should only be
* added when vm.overcommit_memory is 2.
*/

我们再返回去看下内存申请时,受该参数限制的地方:

可以看到,先进行红线判断,超出红线也就是gp_vmem_protect_limit*0.8后,就进行清理回收,回收后再次进行分配,若segmentVmemChunks仍旧大于gp_vmem_protect_limit,则分配失败。

最后,我们看下不受vmem tracker跟踪的地方:gp_malloc中gp_mp_inited没有启动的地方不受其跟踪:

gp_malloc为GP代码中palloc、malloc等重定义的函数,在内存上下文中使用,该内存上下文是进程私有的。当然,除了调用gp_malloc外,代码中仍有直接调用操作系统malloc函数也就是不受vmem tracker跟踪的地方,但是通过SQL复现GDB跟踪,发现这种情况比较少,且申请的内存不大。

4、总结

至此,我们清晰梳理了gp_vmem_protect_limit参数的使用流程。通过共享内存参数segmentVmemChunks来统计一个segment上所有进程分配的内存,每个进程跟踪的初始值是16MB,在内存上下文中申请的内存都会统计进去。这些都是进程私有的内存,而我们通过/etc/<pid>/smaps中Pss值统计的包括进程私有和共享内存平摊后的内存。gp_vmem_protect_limit没有统计到共享内存,仍旧有操作系统OOM的风险

GPDB中gp_vmem_protect_limit参数的意义相关推荐

  1. sklearn模型中random_state参数的意义

    sklearn模型中random_state参数的意义 random_state 意义 使用情况 random_state 意义 例如:在sklearn可以随机分割训练集和测试集(交叉验证),只需要在 ...

  2. patch文件中各参数的意义

    某些打不上的patch,可以通过修改patch文件中的参数进行修改以使其可用.下面是一个完整的patch: From 0665fa1a8584c22747666a17eaafba8cd848db39 ...

  3. X264代码中一些参数的意义

    Main(int argc,char *argv[]); 为了方便起见,不妨改写为: Main(void){ ...... intargc=5; char*argv[]={ "main&qu ...

  4. yolov5s.yaml中各参数作用意义及使用netron工具来可视化yolov5s的结构

    文章目录 一.`yolov5s.yaml`中各行(参数)所表示的意义 1.1 `depth_multiple`和`width_multiple`介绍 1.2 yolov5中新增的Focus模块介绍 1 ...

  5. 【总结】python sklearn模型中random_state参数的意义

    一.前言 在学习机器学习的过程中,常常遇到random_state这个参数,并且好多时候都是 random_state=42,感觉挺有意思的,于是,百度一下,然后做一个总结. 作用:控制随机状态. 问 ...

  6. java系统变量用户变量_windows系统中的系统变量和用户变量,以及配置JDK中各个参数的意义...

    环境变量是什么? 环境变量,是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息.例如Windows和DOS操作系统中的path环境变量,当要求系统运行一个程序而没有告诉 ...

  7. CNN中各参数的意义

    太久没碰深度学习了,复习复习: 关键参数: (参数英文名基于pytorch中的Conv2d()) 输入大小(Hinput×Winput×CinputH_{input}×W_{input}×C_{inp ...

  8. Python 中product函数的用法以及该函数中repeat参数的意义

    Python中product函数用于生成两个可迭代对象的笛卡尔积: 假设我们有两个列表: A = [1, 2, 3] B = ['A', 'B', 'C'] from itertools import ...

  9. php cgminer,CGMINER中各个参数代表的意义(挖矿黑框参数)

    CGMINER中各个代表的意义(avg,A,R,HW,WU,ST,SS,NB,LW,GF,RF-) 我们在用CGMINER挖矿时出现的黑色界面中里面有很多参数,可能我们弄不明白他们究竟代表些什么意思, ...

最新文章

  1. HDU 4630 No Pain No Game 树状数组+离线操作
  2. 一般线性规划问题的2阶段单纯形算法
  3. PAT甲级——1099 Build A Binary Search Tree (二叉搜索树)
  4. 在android中如何使用UDP和TCP传输
  5. python生成数据库登录界面_python 生成数据库
  6. uctf-杂项题目分析
  7. EditPlus配置Python环境
  8. java 线程 数量_Java线程数量随时间增长的原因
  9. 机器视觉知识汇总(持续更新)
  10. 加减乘除等符号大全中英对照,在英语中的用法
  11. ca42a_demo_c++_new_delete表达式
  12. 汽车租赁系统(2)-完成登录功能
  13. Aleo Wagyu钱包
  14. PCIe扫盲系列博文连载目录
  15. FTP 设置用户名和密码
  16. Sql Server char nchar varchar nvarchar 区别
  17. matlab兼职可以做什么的,我开始做兼职了
  18. HBase基础【HBase简介、HBase安装、HBase shell操作】
  19. 《富爸爸,穷爸爸》读后感——怎么实现财务自由
  20. 比尔总动员小炎觉醒任务攻略

热门文章

  1. 水星nw315r服务器无响应,水星MW315R作为从路由怎么设置? | 192路由网
  2. 断言信息与元素等待_Sinno_Song_新浪博客
  3. 当技术为组织所累时怎么办?将你的组织架构旋转90度!
  4. 解决方案资源管理器中显示bin,Debug等文件夹
  5. 影响一个系统性能的方方面面
  6. 常用的70个数据分析网址
  7. restful什么意思_RESTful的真正含义是什么?
  8. 如何来投放广告更赚钱
  9. 苏州新导RFID智能机房资产管理系统,RFID资产管理追踪系统
  10. 戴尔EMC服务器重装系统