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 ...
随机推荐
- Spring Security认证器实现
目录 拦截请求 验证过程 返回完整的Authentication 收尾工作 结论 一些权限框架一般都包含认证器和决策器,前者处理登陆验证,后者处理访问资源的控制 Spring Security的登陆请 ...
- js烧脑面试题大赏
本文精选了20多道具有一定迷惑性的js题,主要考察的是类型判断.作用域.this指向.原型.事件循环等知识点,每道题都配有笔者详细傻瓜式的解析,偏向于初学者,大佬请随意. 第1题 let a = 1 ...
- input标签的事件之oninput事件
最近在写前端的时候,用到了oninput事件.(其中也涉及了onclick) 问题:鼠标点击数字和运算符的时候,文本框里的内容到达一定长度时,会出现无法继续往后面跟随光标的问题. 解决:见下面代码 这 ...
- Tapdata 实时数据融合平台解决方案(四):技术选型
作者介绍:TJ,唐建法,Tapdata 钛铂数据CTO,MongoDB中文社区主席,原MongoDB大中华区首席架构师,极客时间MongoDB视频课程讲师. 常见搭建数据中台的技术产品 数据中台包括: ...
- 2019 CSP-J 初赛解析
题面,成绩不是真实水平,就挑重点说一说 老师给的解析 T5 这是二分查找,属于是我的代码理解不太对 我的理解 #include<iostream> using namespace std; ...
- API管理之利剑 -- Eolink
随着信息化飞速增长的还有各信息系统中的应用接口( API ),API 作为信息系统内部及不同信息系统之间进行数据传输的渠道,其数量随着软件系统的不断庞大而呈指数型增长,如何管理这些 API 已经在业界 ...
- Solution -「HNOI2013」消毒
弱化一下,先考虑在二维上解决问题. 题目就转化为:有 \(n\) 个点 \((i, j)\) 需要被覆盖,而我们每次可以选一行或一列去覆盖,求覆盖所有点的最少选择次数. 如果我们对于每一个 \((i, ...
- 二分法求最长子序列长度(STL)(nlogn)
声明: 正如标题所说,只是求长度,应对题目要求,请自行判断,用错代码概不负责! 本蒟蒻的代码可能有错,有错误还请各位dalao请指出 运用了upper_bound()和lower_bound()函数 ...
- Class对象共嫩
需求:写一个"框架",不能改变该类的任何代码的前提下,可以帮我们创建任意类的对象,并且执行其中任意方法 实现: 1.配置文件 2.反射 步骤: 1.将需要创建的对象的全类名和需要执 ...
- python将命令输出写入文件或临时缓存
python将命令输出写入文件 将文件写入到对应文件,方便后期处理或保存 def write_file(file_path): with open(file=file_path, mode=" ...