一、OOM机制概述

Linux 内核有个机制叫OOM killer(Out Of Memory killer),该机制会监控那些占用内存过大,尤其是瞬间占用内存很快的进程,为防止内存耗尽而自动把该进程杀掉。

进程被Linux杀掉几个可能的原因:

  • 内存泄露;
  • 你的进程所需要的内存资源太大,系统无法满足;
  • 也不一定全是你的问题,也有可能是同一主机的其他进程占用资源过多。

数据库OOM可能的故障现象:

  • 数据库切换、服务中断 ……
  • 通过数据库的log确认有进程被kill 9,然后通过同时间的系统日志确认

二、操作系统参与OOM

vm.overcommit_memory 接受三种值:

  • 0 – 这是缺省值,它允许overcommit,但过于明目张胆的overcommit会被拒绝,比如malloc一次性申请的内存大小就超过了系统总内存。
  • 1 – 允许overcommit,对内存申请来者不拒。
  • 2 – 禁止overcommit。

OOM参数影响系统的可分配内存。举例如下:操作系统内存 4G、swap 2G。以 kingbase 为例,shared_buffers 最大值:

  • vm.overcommit_memory = 0 , shared_buffers 最大值为 6G
  • vm.overcommit_memory = 1 , shared_buffers 最大值可以超过 6G,没有限制
  • vm.overcommit_memory = 2 , 根据 (物理内存 + swap)* overcommit_ratio 确定可分配的内存,相当于可用内存不超过3G(所有进程可用的总内存,包括操作系统占用)。 默认 overcommit_ratio 50%。

如果vm.overcommit_memory = 2,正常不会发生OOM,只是在执行时报错。类似如下:

ERROR:  out of memory
DETAIL: Failed on request of size 16384 in memory context "ExecutorState".

三、OOM问题原因排查

1、查看操作系统日志

grep "Out of memory" /var/log/messages*
Out of memory: Kill process <pid>(checkpoint) score 9 or sacrifice child
checkpoint invoked oom-killer: gfp_mask=0x201da, order=0, oom_score_adj=0

有的系统Log里会输出kill时的全部进程和每个进程的内存使用情况,用于确认当时的情况。

dmesg -T
[Wed May 15 14:03:08 2019] Out of memory: Kill process 83446 (machine) score 250 or sacrifice child
[Wed May 15 14:03:08 2019] Killed process 83446 (machine) total-vm:1920560kB, anon-rss:1177488kB, file-rss:1600kB

2、确认问题时间点的内存使用情况

Linux 系统默认每10分钟会收集系统状态,数据保存在/var/log/sa 目录。用户可以找到对应时间点的文件,运行sar命令,如:sar -r -f sa04 ,取得当时的系统状态信息。类似结果显示如下:

从上图可以看出,10:40 左右,系统可用内存不足,接着引发oom,之后可用内存恢复。

3、操作系统内存排查

查看系统内存使用情况:查看系统内存,关注可用内存情况:

free –g

cat /proc/meminfo

查看进程占用内存情况:

ps aux | sort -nrk5 | more 查看TOP VSZ ,表示请求的共享内存段的大小。这个并不表示实际分配的内存段,如shared_buffer = 1024M,但实际启动时并没有真正分配1024M内存(除非使用大页)。

ps aux | sort –nrk6 | more  查看每个进程实际占用的物理内存大小

注:当前时间点内存占用并不能反应OOM时间点实际内存占用情况,只能查看哪些进程是可能的影响因素。

清除linux系统的cache

# echo 3 > /proc/sys/vm/drop_caches

4、排查OOM时间点的运行业务

  1. 如有可能,逐个停止、排查业务,确认最占用系统内存的业务。
  2. 如果所有业务都停止后,还未释放内存,那可能是操作系统占用,需要排查操作系统问题。如以上例子,停止所有业务应用后,操作系统还占用大量内存,需要排查操作系统问题。
  3. 查看问题时间点,是否有crontab , job 等定时任务,确认是否有长时间运行的任务。
  4. 查看数据库sys_log,确认是否有耗时的SQL、大量量临时IO的SQL。
  5. 如果是 R6 版本,可以分析问题时间点kwr , ksh 报告。

5、查看数据库内存配置参数

查看数据库内存配置参数,计算主机可承受的负荷。样例数据如下:

主机内存:                           256G

SWAP:                                   22G

shared_buffers:                 100G

max_connections:   4000

work_mem:                        100M

temp_buffers:          32M

wal_buffers:              64M

autovacuum_max_workers:   3

autovacuum_work_mem:        -1

maintenance_work_mem:      10G

current connections:        150

数据库占用内存计算公式:max_connections*work_mem + max_connections*temp_buffers +shared_buffers+wal_buffers+(autovacuum_max_workers * autovacuum_work_mem)+ maintenance_work_mem

数据库理论峰值 =4000 * 100M + 4000 * 32M + 100G + 64M + 10G = 620G

数据库当前值 = 150 * 100M + 150 * 32M + 100G + 64M + 10G = 130G

主机可承受连接数极值 = ( 250G - 100G - 10G ) / ( 100M + 32M ) = 1080

注意:这里的极限值其实是以每个连接占用132M 进行估算的,实际会话可能并不会占用这么多内存,且并不会有同时这么多并发排序操作。

OOM故障处理流程的更多相关文章

  1. MSTP故障处理手册

    H3C核心交换机常见故障定位手册.pdf MSTP故障处理手册.pdf 目 录 1 MSTP故障处理 1.1 广播风暴故障处理 1.1.1 故障描述 1.1.2 故障处理流程 1.1.3 故障处理步骤 ...

  2. Ceph剖析:故障检测

    作者:吴香伟 发表于 2014/10/10 版权声明:可以任意转载,转载时务必以超链接形式标明文章原始出处和作者信息以及版权声明 心跳是用于OSD节点间检测对方是否故障的,以便及时发现故障节点进入相应 ...

  3. 京东MySQL监控之Zabbix优化、自动化

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://wangwei007.blog.51cto.com/68019/1833332 随 ...

  4. VRRP配置与维护手册-1

    http://www.gpxz.com/diannao/hulianwang/80526.html 一  VRRP简介< xmlnamespace prefix ="o" n ...

  5. 美团Java团队分享:如何实践支付通道自动化管理

    随着支付业务量激增,支付团队不断壮大.为了满足日益增长的业务需求,大量的支付通道逐渐接入,但由于对接的各银行和第三方系统的稳定性参差不齐,支付通道故障时有发生,作为承接上下游的核心系统,要在一系列不稳 ...

  6. 深入解析 SQL Server 高可用镜像实现原理

    作者:郭忆 本文由 网易云 发布. SQL Server 是 windows 平台 .NET 架构下标配数据库解决方案,与 Oracle.MySQL 共同构成了 DB-Engines Ranking ...

  7. 转-4年!我对OpenStack运维架构的总结

    4年!我对OpenStack运维架构的总结 原创: 徐超 云技术之家 今天 前言 应“云技术社区”北极熊之邀,写点东西.思来想去云计算范畴实在广泛,自然就聊点最近话题异常火热,让广大云计算从业者爱之深 ...

  8. mysql原理~二阶段提交

    一 简介:今天咱们来聊聊 mysql 两阶段提交二 事务过程    perpare-commit 两个过程1  perpare阶段 redo日志   1.设置undo state=TRX_UNDO_P ...

  9. 深入解析SQL Server高可用镜像实现原理

    本文来自网易云社区 SQL Server 是windows平台.NET架构下标配数据库解决方案,与Oracle.MySQL共同构成了DB-Engines Ranking的第一阵营,在国内外企业市场中有 ...

随机推荐

  1. sql-DDL-约束

    约束 对表中的数据进行限定,保证数据的正确性.有效性和完整性. 6个约束 1. 主键约束Primary Key: 唯一,不能为null -- 主键约束.和唯一约束不能同时设置 1. 含义:非空且唯一 ...

  2. Multiparty Cardinality Testing for Threshold Private Set-2021:解读

    本文记录阅读该论文的笔记. 本文基于阈值加法同态加密方案提出了一个新的允许\(N\)方检查其输入集的交集是否大于\(n-t\)的IPSI方案,该协议的通信复杂度为\(O(Nt^2)\). 注意:\(N ...

  3. 解决github.com 的响应时间过长以及hosts配置不能保存的问题

    github.com 的响应时间过长 1 获取github可以使用的DNS域名 DNS查询 选择TTL值最小的 2 修改hosts配置 打开之后在最后加上如下内容,保存即可 3 出现hosts不能保存 ...

  4. ASP.NET Core 根据环境变量支持多个 appsettings.json配置文件 (开发和生产)

    新建一个项目,web根目录会出现一个 appsettings.json  配置文件, 此时添加--新建项,输入  appsettings.Development.json 再新增一个,appsetti ...

  5. springboot项目上传存储图片到七牛云服务器

    springboot项目上传存储图片到七牛云服务器 问题描述: 当图片存在本地时会出现卡顿的现象.比如一篇图文混排的文章,如果图片没有加载完,可能整个文章都显示不出来,因为它们都是用的同一个服务器. ...

  6. java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver

    java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver at java.net.URLClassLoader.findCla ...

  7. 2022-7-13 java_1 第七组 刘昀航

    @ 目录 前言 一.一些基本的指令 二.java 1.java的三个版本 2.java特点 3.运行一个java程序 三.java的数据类型 1.java基本数据类型 2.强制转换的原理 3.八种基本 ...

  8. 4-10 CS后台项目练习-3 || Redis

    13. 类别管理--根据id查询类别详情--持久层 13.1. 规划SQL语句 本次需要执行的SQL语句大致是: select * from pms_category where id=? 关于字段列 ...

  9. 如何在 pyqt 中实现桌面歌词

    前言 酷狗.网抑云和 QQ 音乐都有桌面歌词功能,这篇博客也将使用 pyqt 实现桌面歌词功能,效果如下图所示: 代码实现 桌面歌词部件 LyricWidget 在 paintEvent 中绘制歌词. ...

  10. 【高并发】通过源码深度分析线程池中Worker线程的执行流程

    大家好,我是冰河~~ 在<高并发之--通过ThreadPoolExecutor类的源码深度解析线程池执行任务的核心流程>一文中我们深度分析了线程池执行任务的核心流程,在ThreadPool ...