背景

不久前,遇到过一个问题。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. 关于使用koa 跨域问题你可能会遇到

    var cors = require('koa2-cors');// 跨域const allowOrigins = ["http://localhost:8080" // 需要跨域 ...

  2. kubernetes之常用核心资源对象

    部门产品线本身是做DEVOPS平台,最近部署架构也在往K8S上靠了,不得不学一下K8S.自己搭建了K8S集群与harbor仓库来学习. 1.kubernetes之常用核心资源对象 1.1.K8s服务部 ...

  3. SQL语句的整理

    mysql语句的整理 1.SQL DML 和 DDL 可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL). SQL (结构化查询语言)是用于执行查询的语法.但是 SQ ...

  4. idea中创建Java类时,自动在文件头中添加作者和创建时间

    在Settings中找到File and Code Templates 设置如下图所示. 效果展示:

  5. appium简单使用

    App 测试通常会用到的工具 adb :Android 的控制工具,用于获取Android的各种数据和控制 Appium Desktop:内嵌了Appium Server和Inspector的综合工具 ...

  6. 常用Linux命令整理

    常见系统命令 export 查看或修改环境变量 # 例:临时修改命令提示符为字符串$ export PS1=$ # 例:临时修改命令提示符显示系统时间 时间使用\t 表示 export PS1=&qu ...

  7. JAVA编程练习01作业

    1.已知y与x的关系:,要求:从键盘上输入一个x的值,输出其对应的y的值. 2. 输入一个圆半径(r),计算并输出圆的面积和周长. 3.输入一个三位正整数n,输出其个位.十位和百位上的数字. 4.根据 ...

  8. 001 Redis 配置

    Redis缓存 1.配置Redis //Redis 配置文件 @Configuration public class RedisConfiguration { @Bean public RedisTe ...

  9. 温控器/胎压检测/电表/热泵显示控制器等,低功耗高抗干扰断/段码(字段式)LCD液晶显示驱动IC-VK2C22A/B,替代市面16C22,44*4/40*4点显示

    产品品牌:永嘉微电/VINKA 产品型号:VK2C22A/B 封装形式:LQFP52/48 产品年份:新年份 概述: VK2C22是一个点阵式存储映射的LCD驱动器,可支持最大176点(44SEGx4 ...

  10. 基于.NetCore开发博客项目 StarBlog - (16) 一些新功能 (监控/统计/配置/初始化)

    系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...