KingbaseES OOM 可能原因汇总
背景
不久前,遇到过一个问题。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 可能原因汇总的更多相关文章
- java.lang.ClassNotFoundException错误原因汇总
开发java很长时间了,还经常会遇到java.lang.ClassNotFoundException这样的错误,最近又处理了一次,起初怀疑是jdk版本比class文件的编译版本低了导致了,但是运维人员 ...
- 王立平--android out of memory(OOM)产生原因
开发图片视频应用常遇到这个错误. android 内存由 dalvik 和 native 2部分组成.dalvik 也就是 java 堆,创建的对象就是在这里分配的, 而 native 是通过 c/c ...
- Java报错原因汇总
1. java.lang.nullpointerexception 这个异常大家肯定都经常遇到,异常的解释是"程序 遇上了空指针",简单地说就是调用了未经初始化的对象或者是不存在的 ...
- R文件丢失异常原因汇总
引言: R文件丢失异常在java开发中是个比较常见的异常,造成这个异常的原因可能非常微小,但是给Android开发者们造成的麻烦可是巨大的,当程序员们费尽千辛万苦,找到自己错在哪里的时候,绝对会对自己 ...
- 关于git的ssh permission denied原因汇总
SSH关于公钥认证Permission denied (publickey,gssapi-with-mic的问题 http://h2appy.blog.51cto.com/609721/1112797 ...
- 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 ...
- Wish3D用户必看!模型加载失败原因汇总
上传到Wish3D的模型加载不出来,作品显示页面漆黑一片,是什么原因? 很有可能是操作过程中的小失误,不妨从以下几点检查.还是不行的请加QQ群(Wish3D交流群3):635725654,@Wish3 ...
- iOS 项目审核被拒原因汇总
1.程序运行崩溃 Your app crashes on iPhone running iOS connected to an IPv6 network when we: - app crashes ...
- Kylin 几个sql报错原因 汇总
Can't create EnumerableAggregate! while executing SQL由distinct count引起的错误 null while executing SQLjo ...
随机推荐
- Java中Double类型数据比较大小
方法一:转成字符串之后比较 如果要比较的两个double数据的字符串精度相等,可以将数据转换成string然后借助string的equals方法来间接实现比较两个double数据是否相等.注意这种方法 ...
- NC16597 [NOIP2011]聪明的质监员
NC16597 [NOIP2011]聪明的质监员 题目 题目描述 小T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 \(n\) 个矿石,从 \(1\) 到 \(n\) 逐一编号,每个矿 ...
- docker下node环境搭建
初始化⼀个NodeJs程序 以下操作必须已经安装了NodeJS. ⾸先创建⼀个空⽂件夹.并创建以下⽂件: server.js package.json Dockerfile .dockerignore ...
- 实战模拟│单点登录 SSO 的实现
目录 什么是单点登录 单点登录的凭证 父域 Cookie 方式 用户认证中心方式 localstorage方式 什么是单点登录 单点登录: SSO(Single Sign On) 用户只需登录一次,就 ...
- NC16884 [NOI2001]食物链
题目链接 题目 题目描述 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B,B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到 ...
- java geteway 手机返回数据
import lombok.extern.slf4j.Slf4j; import org.reactivestreams.Publisher; import org.springframework.c ...
- centos一些mysql常用命令
# service mysqld status #命令来查看mysql 的启动状态,active (running) 是运行中 systemctl start mysqld.service ...
- led闪烁(时序输入输出,自定义变量,时钟仿真,执行顺序)
1.设计定义 设计一个以200ms亮,200ms暗交替闪烁的led灯,并且有一个复位按钮可以停止工作. 2.设计输入 2.1端口 以固定周期交替闪烁说明由时钟控制,需要一个时钟控制端口clk,要求复位 ...
- Python常用基础语法知识点大全
记得我是数学系的,大二时候因为参加数学建模,学习Python爬虫,去图书馆借了一本Python基础书,不厚,因为有matlab和C语言基础,这本书一个星期看完了,学完后感觉Python入门很快,然后要 ...
- Jenkins性能优化
jenkins性能优化 1.评估安装插件,插件数量过多,会导致界面加载慢: 2.添加slave节点: 01.禁止在master上构建性能耗费大的任务,可以使用标签的方式使其在slave上构建: 02. ...