背景

不久前,遇到过一个问题。KingbaseES数据库主机系统触发OOM现象是数据库进程被KILL, 数据库进入crash然后restart(when restart_after_crash=on).

导致OOM的原因很多, 当然要具体情况,具体分析。从数据库层面分析内存分为共享内存(shared buffer)和私有内存(例如catalog cache,relcache等)。目前版本还不支持查看shared buufer详细使用情况(这类功能往往需要插件实现)。所以本例仅对会话私有内存占用过大进行归类。最常见的原因汇总如下, 以及对应的规避方法。

汇总

1、分区表特别多, 分区的catalog cache占用大量内存(连接会话可能会读入每个子分区的结构到catalog cache),特别需要注意explain里面信息并不代表relcache里的信息。

- 避免方法: 使用KingbaseESV8R6以上的高版本(高版本会解决分区裁剪问题),或不要设置过多分区。

2、业务使用了大量长连接, 总连接数过多,并且没有设置连接的生命周期, 连接时间越长, 连接总数越多,访问的元数据可能积累越多, 导致每个会话的私有内存非常大。

- 避免方法1: 降低应用连接到数据库的总连接数, 并且设置连接的生命周期(例如, 一个连接最多使用15分钟后自动释放),避免出现某些连接占用大量私有内存。

- 避免方法2: 使用连接池。

3、数据库实例未使用HUGEPAGE, 导致page table占用较大内存,最终引起OOM.

- 避免方法: 检查系统是否开启HUGEPAGE,建议开启HUGEPAGE。

5、设置了较大的work_mem, 并且有大量SQL使用了hash agg或hash join, 导致内存消耗过多,当然还容易产生过多临时文件。

- 避免方法: 调小work_mem,业务层减少此类sql请求的并发量。

- 注意,可能某些版本已经支持enable_hashagg_disk, 可以开启防止内存不足时无法使用hashagg。

6、数据库有性能问题, 遇到应用程序配置的连接池上限较大, 导致同一时期向数据库请求了大量连接, 最终耗费大量内存引起OOM.

- 避免方法1: 降低应用到数据库的总连接数, 并且设置连接的生命周期(例如, 一个连接最多使用15分钟后自动释放).

- 避免方法2: 设置连接上限。

- 避免方法3: 找到低效topSQL并优化.

7、如果是分区数量导致的问题, 首先要分析是什么分区类型.

如果是hash分区, 通常一个长连接的每次SQL请求的数据定位到的分区是不同的子分区, 连接使用久了就会hold所有的子分区的元数据, 占用内存大.

如果是按时间的范围分区,, 每次SQL请求的基本上都是当前时期的子分区, 所以长连接hold的分区数量不会太多, 内存消耗问题可能性低.

- 如果是hash分区产生的内存消耗问题怎么办? 除了前面提到的6点方法, 还有2种方法,- 1、通过业务层改造减少分区数量也能减少内存消耗.- 2、业务层集成数据库的hash算法, 把和不同分区相关的数据操作分配到不同的线程, 不同的线程使用不同的数据库连接,这样每个连接只会用到某些特定的子分区, 不会导致每个连接都hold所有分区表.

总结

其实对于KingbaseES数据库,如果业务类型多为排序并发的sql为主。那么建议给数据库所在服务器分配大内存,256GB以上。因为每个session都会用到work_mem内存,如果work_mem设置为100MB,总共有2000个session上限,那么这部分内存的上限就是100*2000。这是非常恐怖的数值,当然这种极端情况很少发生。如果单个会话work_mem内存用满就会用到磁盘排序,如果io拥挤会对数据库性能有严峻考验。

综上所述,我们需要在合理范围内把服务器内存分配给数据库使用,并严格把控数据库的内存使用情况,避免内存耗尽。

审计

没错,当OOM发生后,我们可以找到一些蛛丝马迹。

由于OOM发的是KILL -9的信号,被KILL的进程根本无法记录当时正在执行的QUERY或者当时的状态。

如果我们需要在OOM后,还能找到被OOM进程当时执行的QUERY,在请求时(语句分析和计划后)就记录下它在执行什么(开启log_statement='all'),超过track_activity_query_size长度的QUERY都被截断。

KingbaseES OOM 可能原因汇总的更多相关文章

  1. java.lang.ClassNotFoundException错误原因汇总

    开发java很长时间了,还经常会遇到java.lang.ClassNotFoundException这样的错误,最近又处理了一次,起初怀疑是jdk版本比class文件的编译版本低了导致了,但是运维人员 ...

  2. 王立平--android out of memory(OOM)产生原因

    开发图片视频应用常遇到这个错误. android 内存由 dalvik 和 native 2部分组成.dalvik 也就是 java 堆,创建的对象就是在这里分配的, 而 native 是通过 c/c ...

  3. Java报错原因汇总

    1. java.lang.nullpointerexception 这个异常大家肯定都经常遇到,异常的解释是"程序 遇上了空指针",简单地说就是调用了未经初始化的对象或者是不存在的 ...

  4. R文件丢失异常原因汇总

    引言: R文件丢失异常在java开发中是个比较常见的异常,造成这个异常的原因可能非常微小,但是给Android开发者们造成的麻烦可是巨大的,当程序员们费尽千辛万苦,找到自己错在哪里的时候,绝对会对自己 ...

  5. 关于git的ssh permission denied原因汇总

    SSH关于公钥认证Permission denied (publickey,gssapi-with-mic的问题 http://h2appy.blog.51cto.com/609721/1112797 ...

  6. MySQL Server has gone away报错原因汇总分析(转自:http://cenalulu.github.io/mysql/mysql-has-gone-away/)

    原因1. MySQL 服务宕了 判断是否属于这个原因的方法很简单,执行以下命令,查看mysql的运行时长 $ mysql -uroot -p -e "show global status l ...

  7. Wish3D用户必看!模型加载失败原因汇总

    上传到Wish3D的模型加载不出来,作品显示页面漆黑一片,是什么原因? 很有可能是操作过程中的小失误,不妨从以下几点检查.还是不行的请加QQ群(Wish3D交流群3):635725654,@Wish3 ...

  8. iOS 项目审核被拒原因汇总

    1.程序运行崩溃 Your app crashes on iPhone running iOS connected to an IPv6 network when we: - app crashes ...

  9. Kylin 几个sql报错原因 汇总

    Can't create EnumerableAggregate! while executing SQL由distinct count引起的错误 null while executing SQLjo ...

随机推荐

  1. 理论+案例,带你掌握Angular依赖注入模式的应用

    摘要:介绍了Angular中依赖注入是如何查找依赖,如何配置提供商,如何用限定和过滤作用的装饰器拿到想要的实例,进一步通过N个案例分析如何结合依赖注入的知识点来解决开发编程中会遇到的问题. 本文分享自 ...

  2. Flex & Bison 开始

    Flex 与 Bison 是为编译器和解释器的编程人员特别设计的工具: Flex 用于词法分析(lexical analysis,或称 scanning),把输入分割成一个个有意义的词块,称为记号(t ...

  3. Java中时间方法大全01(持续更新)

    下面这些方法都可以封装到一个工具类中 /** * 获取当前时间的时间戳 */ public static int getCurrentTimeIntValue() { return (int) (Sy ...

  4. CesiumJS 2022^ 源码解读[6] - 三维模型(ModelExperimental)新架构

    目录 1. ModelExperimental 的缓存机制 1.1. 缓存池 ResourceCache 1.2. 缓存对象的键设计 ResourceCacheKey 2. 三维模型的加载与解析 2. ...

  5. 面试突击64:了解 HTTP 协议吗?

    HTTP(Hyper Text Transfer Protocol)超文本传输协议,下文简称 HTTP,它的作用是用于实现服务器端和客户端的数据传输的.它可以传输任意的数据类型,如文本.HTML.图片 ...

  6. Linux教我们丢掉键盘

    前言 本篇博客并非博主编写,而是跟着黑马教程整理的. 因为Linux都是一些操作命令,也不想深入研究,所以就用此博客记录一下平时的基本知识,方便日后查找. 一.常用命令 命令 对应英文 作用 ls l ...

  7. 浏览器js调试

    经常忘记,还是需要记录一下啊 右键,检查元素 在元素DOM节点右击,复制CSS选择器 function sleep (time) { return new Promise((resolve) => ...

  8. Linux综合运用

    一. Linux用户和组及其权限管理 请根据以下项目要求,写出操作过程和命令并进行相应的验证测试操作. 项目要求: 某软件开发公司即将开始在Linux系统上进行项目的开发.要实现的环境是:公司有软件开 ...

  9. 04.nvue开发

    nvue开发注意项 nvue专用内置组件跟api https://uniapp.dcloud.io/nvue-outline?id=_2开发nvue页面 网络示例 https://www.cnblog ...

  10. 彻底理解DDS(信号发生器)的fpga实现(verilog设计代码)

    DDS(Direct Digital Synthesis)是一种把一系列数字信号通过D/A转换器转换成模拟信号的数字合成技术. 它有查表法和计算法两种基本合成方法.在这里主要记录DDS查表法的fpga ...