最近经常有收到MySQL实例类似内存不足的报警信息,登陆到服务器上一看发现MySQL 吃掉了99%的内存,God !

有时候没有及时处理,内核就会自己帮我们重启下MySQL,然后我们就可以看到 dmesg 信息有如下记录:

Mar 9 11:29:16 xxxxxx kernel: mysqld invoked oom-killer: gfp_mask=0x201da, order=0, oom_adj=0, oom_score_adj=0
Mar 9 11:29:16 xxxxxx kernel: mysqld cpuset=/ mems_allowed=0
Mar 9 11:29:16 xxxxxx kernel: Pid: 99275, comm: mysqld Not tainted 2.6.32-431.el6.x86_64 #1
Mar 9 11:29:16 xxxxxx kernel: Call Trace:

现描述一下具体场景吧:

大前提   :  操作系统以及MySQL 版本:

OS      :  CentOS release 6.5 (Final) Kernel : 2.6.32-431.el6.x86_64(物理机)
     MySQL :   Percona 5.6.23-72.1-log(单实例)

触发场景:Slave 不管是否有其它链接进来都会出现内存周期性的暴涨,触发内核oom-killer

据说这个问题都出现了1年多了,由于刚过来,老大就让我再查查看能不能找到什么蛛丝马迹,那么就开始Check 这个问题咯:

1. 怀疑给MySQL 分配的内存不合理,那么我就去check 了一下 innodb_buffer_pool 的大小 和物理内存的大小,发现分配给BP的大小占物理内存的60%左右,那么不是这个原因, 排除掉,要是是这个问题它们也应该早就发现了~

2. 检查操作系统各项参数配置。[vm.swappiness = 1 ; /proc/sys/vm/overcommit_memory ; oom_adj ]  在没排查到问题前可以临时设置一下 adj参数 给个 -15 或者直接 -17,这样内核就永远不会kill 掉 mysql了, 但是这样做不能根本解决问题, 而且存在一定的风险, 会不会导致MySQL 需要内存又分配不出来而hang住呢? 这个办法就想想算了吧。

3. 好吧,mysql初始化参数、操作系统参数看起来没什么配置有不恰当的地方。那我们就来找找MySQL 本身的吧!

既然MySQL 内存一直处于在飙升的状态,那么,会不会是由于内存分配的时候导致的呢,那么根据网上报了一个MySQL 内存分配引起的一个Bug,我也来在我这个环境操作一把,一看究竟:1.记录当前 MySQL 进程占用的 内存大小;2.记录 show engine innodb status ; 3. 执行 flush tables; 4.记录 show engine innodb status; 5. 记录 MySQL 进程占用大小;6 对这两次结果进行对比,主要看看在执行Flush table 前 和 Flush Table 后MySQL 分配的内存有没有明显的变化。 好吧, 这个bug 貌似不再我这里。

看了一下这个版本有个 innodb_buffer_pool_instances 参数,官网上也有关于innodb_buffer_pool_instances 和 innodb_buffer_pool_size设置不当 导致MySQL OOM 的 bug ,大概的意思就是:我们可以给innodb_buffer_pool_size 设置的比我们实际物理内存要大,比如我们物理内存是:64GB,而我们设置 innodb_buffer_pool_size=300GB,并且把 innodb_buffer_pool_instances > 5 ,我们就依旧可以把MySQL 拉起来。但是呢, 这样MySQL很容易OOM。详细信息:http://bugs.mysql.com/bug.php?id=79850 这里看过来。

还有种情况,也报过BUG,就是 slave 设置过滤的时候,也会触发OOM ,but 我这些个 Instance 没有设置, 所以就 忽略这点咯。

既然不是MySQL内存超售引起,也不是 打开表的句柄导致。那么还有什么原因呢?

我们再想想,这个现象出现在Slave,Master 和Slave 配置一样, 只是Master 上跑了生产业务,Slave 上有些Instance 跑了查询业务,有些Instance 根本就没有跑任何任务,但是还是会出发OOM,那么这种情况很可能就是 Slave 引起的囖。

那我就找了个实例上去试了一把, 不试不知道啊, 一试吓一跳。上去执行了一下:stop slave;start slave;这个命令卡了大概3分钟,再一看内存使用情况,一下子释放出来了20GB+。 到这里基本上算是定位到了问题所在了,但是Slave 我们都知道有两个线程,到底是由于SQL Thread 还是 IO Thread 导致的呢? 这个还的等待下次即将发生时在进一步排查了。

贴点内存的监控信息:
12:00:01 PM kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit
02:40:01 PM 566744 131479292 99.57 88744 618612 132384348 89.19
02:50:01 PM 553252 131492784 99.58 83216 615068 132406792 89.20
03:00:01 PM 39302700 92743336 70.24 95908 925860 132413308 89.21
03:10:01 PM 38906360 93139676 70.54 109264 1292908 132407836 89.21
03:20:01 PM 38639536 93406500 70.74 120676 1528272 132413136 89.21

我把稍微再具体点的东西记录到了这里:https://bugs.launchpad.net/percona-server/+bug/1560304

最后稍微总结一下:

现象:Slave OOM

临时解决办法: 重启Slave

长期解决办法: 小版本升级 MySQL Server

更系统点的请看郭总写的:http://backend.blog.163.com/blog/static/202294126201371651930522/

http://backend.blog.163.com/blog/static/20229412620137195534755/

解决MySQL Slave 触发 oom-killer的更多相关文章

  1. OOM killer(Out Of Memory killer)

    最近接连遇到两个情况就是接连进程把kill掉 第一个情况就是有一个java进程被kill了.原因是我这个服务器上海部署了一个node服务,这个node服务大家都不熟悉.所以在使用的时候没有注意内存的使 ...

  2. Linux 的 Out-of-Memory (OOM) Killer

    同事在 Linux 服务器上遇到点小问题,我也上去折腾半天.这还是第一次注意到 Linux 这个多年来就存在的特性:OOM Killer .说白了 OOM Killer 就是一层保护机制,用于避免 L ...

  3. OOM killer

    Linux下有一种OOM KILLER 的机制,它会在系统内存耗尽的情况下,启用自己算法有选择性的kill 掉一些进程. 1. 为什么会有OOM killer 当我们使用应用时,需要申请内存,即进行m ...

  4. 有关OOM KILLER的一些理解

    Linux下有一种OOM KILLER 的机制,它会在系统内存耗尽的情况下,启用自己算法有选择性的kill 掉一些进程. 一.为什么会有OOM killer 当我们使用应用时,需要申请内存,即进行ma ...

  5. Linux -- 内存控制之oom killer机制及代码分析

    近期,线上一些内存占用比較敏感的应用.在訪问峰值的时候,偶尔会被kill掉,导致服务重新启动.发现是Linux的out-of-memory kiiler的机制触发的. http://linux-mm. ...

  6. Linux OOM killer 与相关参数详解

    一.前言 本文是描述Linux virtual memory运行参数的第二篇,主要是讲OOM相关的参数的.为了理解OOM参数,第二章简单的描述什么是OOM.如果这个名词对你毫无压力,你可以直接进入第三 ...

  7. Mysql slave 同步错误解决

    涉及知识点 mysql 主从同步 ,参考: MySQL数据库设置主从同步 mysqlbin log查看, 参考:MySQL的binlog日志 解决slave报错, 参考: Backup stopped ...

  8. 理解和配置 Linux 下的 OOM Killer

    原文:http://www.vpsee.com/2013/10/how-to-configure-the-linux-oom-killer/ 最近有位 VPS 客户抱怨 MySQL 无缘无故挂掉,还有 ...

  9. 关闭oom killer

    最近有位 VPS 客户抱怨 MySQL 无缘无故挂掉,还有位客户抱怨 VPS 经常死机,登陆到终端看了一下,都是常见的 Out of memory 问题.这通常是因为某时刻应用程序大量请求内存导致系统 ...

随机推荐

  1. 程序员 vs HR(皮这么一下很开心)

    最近网络上一段 HR VS 程序员 的表情包火了 来来来 我们近距离感受下 来源|网络:http://t.cn/RuTKC8B 哈哈哈!大家可以留言说说你们面试时候的趣事 更多内容关注公众号:51re ...

  2. Qt-网易云音乐界面实现-1 窗口隐藏拖拽移动,自定义标题栏

    最近也换了公司,也换了新的工作,工资也象征性的涨了一点点,但是最近心里还是慌慌,不知道为什么,没有那种踏实感,感觉自己随时可以被抛弃的感觉.感觉自己在荒废时间,也感觉自己在浪费生命. 为了让自己在被抛 ...

  3. Ubuntu18.04安装Python3.6.8

    Ubuntu18.04预装了Python3.6.5 终于不再预装Python2.7了 但是系统预装的Python分散安装在各个目录里 以后改起来非常不方便 所以本次安装Python3.6.8 Pyth ...

  4. 【UGUI】 (三)------- 背包系统(上)之简易单页背包系统及检索功能的实现

    背包系统,无论是游戏还是应用,都是常常见到的功能,其作用及重要性不用我多说,玩过游戏的朋友都应该明白. 在Unity中实现一个简易的背包系统其实并不是太过复杂的事.本文要实现的是一个带检索功能的背包系 ...

  5. 【SIKIA计划】_05_Unity5.3开发2D游戏笔记

    一.界面基本操作 01.Project基本分类[Audios]音效[Material]材质[Prefabs]预制[Scenes]场景[Scripts]脚本[Sprites]精灵 02.Project丶 ...

  6. [面试]CVTE 2019提前批 Windows应用开发一面

    7.30接到面试电话问有没有时间进行一个20分钟左右的电话面试,不巧当时要去赶火车,就约到了两天后. 8.1还是同一个面试官打来电话 首先介绍项目吧,第一场面试,项目准备的也不怎么充分,讲了一个HAL ...

  7. docker实现跨主机连接

    实验环境: centos7系统 host1:192.168.42.128 host2:192.168.42.129 dokcer容器跨主机连接 1.使用网桥实现跨主机容器连接 2.使用Open vSw ...

  8. Linux 磁盘与文件系统(EXT2)简介

    Linux 中,一切(或几乎一切)都是文件. 一.Linux 磁盘分区与文件系统 1.1 磁盘分区 磁盘的分区主要分为主分区和扩展分区 1)主分区:总共最多只能有四个主分区: 2)扩展分区:只能有一个 ...

  9. NIO基本概念

    1.  IO和NIO的区别 IO     面向流(stream oriented)  阻塞(blocking io) 无                  NIO  面向缓冲区(buffer orie ...

  10. 卸载CentOS7自带的OpenJDK

    http://blog.csdn.net/xiegh2014/article/details/52343438