0、导读

MySQL数据库服务器发生SWAP相信很多人都遇到过,如何找出元凶,又如何应对呢?

1、写在前面

在昨晚的知数堂公开课中,其实用的就是本次的案例。本次公开课的PPT、视频已上传到百度云盘,链接: https://pan.baidu.com/s/1eR53Qd8,欢迎转存及转发(扫描下方二维码识别)

知数堂培训全新MySQL DBA课程第九期和Python运维开发班第三期正在招生中,扫描下方二维码加入QQ群 529671799 (加群暗号:知数堂) 获得最新信息。

关于知数堂

http://zhishuedu.com

“知数堂培训”是由资深MySQL专家叶金荣、吴炳锡联合推出专业优质在线培训课程,主要有MySQL DBA实战优化和Python运维开发两个课程,是业内最有良心、最有品质的培训课程。

2、问题交代

我的朋友小芳(这次不是小明了,hoho),最近遇到了一个郁闷的问题:明明OS还有大量的空闲内存,可是却发生了SWAP,百思不得其解,她就来找我搬救兵了(嗯,我可不是派来的)。

先看下SWAP是干嘛的,了解下它的背景知识。

在Linux下,SWAP的作用类似Windows系统下的“虚拟内存”。当物理内存不足时,拿出部分硬盘空间当SWAP分区(虚拟成内存)使用,从而解决内存容量不足的情况。

SWAP意思是交换,顾名思义,当某进程向OS请求内存发现不足时,OS会把内存中暂时不用的数据交换出去,放在SWAP分区中,这个过程称为SWAP OUT当某进程又需要这些数据且OS发现还有空闲物理内存时,又会把SWAP分区中的数据交换回物理内存中,这个过程称为SWAP IN。在vmstat的输出结果中,分别表现为 si\so 两列,如下图.1

图1

看到这里我们就知道了,发生SWAP的最直接可能的原因是进程向OS申请内存时,发现物理内存不足,当没有SWAP可用的话,这时可能会一直等待,也可能会触发OOM-killer机制,OS把消耗内存最多的那个进程kill掉以释放内存,这个选择取决于内核参数 vm.swappiness。该参数可选范围从 0 - 100,设为 0 就是希望最大限度使用物理内存,尽量不使用swap,设为 100 则是希望积极使用swap。在运行数据库进程的服务器上,我们通常强烈建议这个值小于等于10,最好是设置为 0。原因很简单,对数据库这种需要集中CPU资源、大内存、高I/O的程序而言,如果用SWAP分区代替内存,那数据库服务性能将是不可接受的,还不如直接被OOM kill(数据库进程通常占用最多内存,最容易被OOM kill)来的痛快(早死晚死都是死,还不如痛快的死,反正很快就能重生,嗯)。

先介绍完这么多信息,大家肯定已经不耐烦了,我们就来看看现场并进行排查吧。

3、现场排查

首先,看下系统整体的状况,如下图.2所示


图2

从上图能看出来什么呢,有几个关键信息:

  • 系统负载不算高,最近的平均load是6.8;

  • CPU负载也不算高,有大量的空闲,idle为 98.4%;

  • 内存主要分配给mysqld进程,占用了80.2%;

  • 尽管物理内存有256G,空闲的也将近39G,但确实发生swap了,并且把SWAP都耗尽了。

得到第一个排查结果:物理内存还有不少空闲,但却把swap都耗尽了。作为一个有经验的DBA,遇到这种情况第一反应是什么呢?嗯,先不点破,继续往下看。

再执行 free -gt 查看内存、SWAP消耗情况,如下图.3所示


图3

看出来了吧,尤其是参加过 知数堂培训MySQL DBA优化班课程 的同学应该都知道,我们在课上多次强调:遇到这种情况,第一条件反射很直接就是:发生内存泄露(memory leak)了。

一般来说,如果发现内存统计结果中,cached 和 used 相差特别大的话,基本可确定系统发生内存泄露。相应的处理手法有:

  • 治标的办法:择机重启进程,彻底释放内存归还给OS;

  • 治本的办法:找到代码中导致泄露的代码,修复之(我们这次面对的是mysql代码,还是去官方提交bug吧,哈哈);

  • 治本的办法:升级程序版本,通常新版本会解决旧版本存在的问题,推荐此方案。

再看下MySQL中内存相关选项怎么配置的:


图4

除了 innodb-buffer-pool 分配的稍微多一些外,其他的还算正常。看了下,MySQL的版本是 5.6.19,看来是有必要升级到5.6系列的最新版本。

到这里,我们得到第二个排查结果:mysqld进程发生内存泄露,建议择机重启进程,并尽快安排升级到最新版本

然而,仅仅是因为mysqld进程内存泄露导致的SWAP吗,貌似不全然?还记得上面我们有个地方还没点破的不:物理内存还有不少空闲,但把swap都耗尽了。同样滴,这种案例在我们知数堂的MySQL DBA培训课程里也被多次谈及,绝大多数情况是因为没有关闭NUMA引起的。在运行数据库进程的服务器上,强烈建议关闭NUMA,在之前的分享 比较全面的MySQL优化参考(上篇) 中也有提及。我们接着来看下NUMA的状况:

图5

图6

从上面图.5、图.6可见,NUMA问题导致其中一个CPU可分配的内存远小于另一个(1.8G vs 38G),那么这个CPU上如果要申请大内存时,显然不够了,所以发生SWAP。关于NUMA的相关背景知识我这里不赘述。

因此,我们得到第三个排查结果:由于服务器硬件、系统设置不当,没有关闭NUMA,导致发生SWAP。建议方案有:

  • 在BIOS设置层面关闭NUMA,缺点是需要重启OS;

  • 或修改GRUB配置文件,缺点也是要重启OS;

  • 升级MySQL版本到5.6.27及以后,新增了一个选项 innodb_numa_interleave,只需要重启mysqld实例,无需重启OS,推荐此方案。

说到这里,这个问题已经基本分析清楚了,相关的解决建议也给了,根据自己的情况去评估选择哪个方案即可。

4、写在最后

类似的案例发生也不是一次两次了,我肯定以后还会继续存在,看完案例的的同学也没办法立刻把所有服务器上的NUMA策略全部修整过来,或者可能冲动一下想修复,但过几天就又给忘光了。

老叶曾多次在各种场合不厌其烦地强调一些基础的MySQL运维、开发规范,也正是因为看到了其实还有不少此类问题的存在。这些基础的规范都没执行到位的话,早晚是有一天要去填坑的,不管是填自己的挖下的坑,还是前人留下的坑,哈哈。

最后,作为一篇有诚意的案例总结,需要有诚意的广告才能搭配。

文章转自老叶茶馆公众号,原文链接:https://mp.weixin.qq.com/s/N1jmaOycqJEZEU8lLCkF9Q

找到MySQL服务器发生SWAP罪魁祸首相关推荐

  1. 升级mysql服务器二进制备份_MySQL二进制日志备份和恢复详解

    基本概念 定义: 二进制日志包含了所有更新了数据或者已经潜在更新了数据(例如,没有匹配任何行的一个DELETE)的所有语句. 作用: 1.二进制日志的主要目的是在恢复使能够最大可能地更新数据库,因为二 ...

  2. python连接服务器失败_python-查询期间失去与MySQL服务器的连接

    python-查询期间失去与MySQL服务器的连接 我有一个巨大的表,我需要处理其中的所有行. 我总是收到此"丢失的连接"消息,并且无法重新连接并将光标恢复到原来的位置. 这基本上 ...

  3. (转)MySQL 服务器内存使用

    原文作者: Peter Zaitsev 原文来源: http://www.mysqlperformanceblog.com/2006/05/17/mysql-server-memory-usage 译 ...

  4. MySQL服务器学习笔记!(二) ——数据库各项操作

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

  5. 账户系统db服务器为创建快照,Mysql 服务器同步(replication)设置.docx

    Mysql 服务器同步(replication)设置 Mysql 服务器同步(replication)设置MySQL支持单向.异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服 ...

  6. 闰秒导致MySQL服务器的CPU sys过高

    今天,有个哥们碰到一个问题,他有一个从库,只要是启动MySQL,CPU使用率就非常高,其中sys占比也比较高,具体可见下图. 注意:他的生产环境是物理机,单个CPU,4个Core. 于是,他抓取了CP ...

  7. mysqladmin - 管理 MySQL 服务器、获取运行状态

    官方文档 mysqladmin 是管理 MySQL 服务器的客户端,可以用来检测服务器的配置和当前状态.创建和删除数据库等. 1. mysqladmin 的调用语法 shell> mysqlad ...

  8. MYSQL服务器登录和权限设置

    服务器端:进入命令提示符(管理员权限) net start mysql:启动服务器: net stop mysql:关闭服务器: mysql -u用户名 -p密码:登录mysql,-u与用户名之间可有 ...

  9. mysql闰秒_闰秒导致MySQL服务器的CPU sys过高

    今天,有个哥们碰到一个问题,他有一个从库,只要是启动MySQL,CPU使用率就非常高,其中sys占比也比较高,具体可见下图. 注意:他的生产环境是物理机,单个CPU,4个Core. 于是,他抓取了CP ...

最新文章

  1. 小白爬虫scrapy第三篇
  2. Java编程思想(第4版)读书笔记——01
  3. 零中频接收机频率转换图_接收机抗噪声技术
  4. CentOS 命令大全 (转)
  5. NOIP2013货车运输
  6. echarts 3d地图_独占进博会800m2展厅!3D炫酷光影秀带你邂逅金山往事..._政务_澎湃新闻...
  7. 【C语言】三子棋游戏
  8. 51nod 1050 循环数组最大子段和 单调队列优化DP
  9. img 图片加载出错时 显示默认图片
  10. fluidsim元件库下载_FluidSIM5|FluidSIM(液压气动仿真软件)下载 v5.0中文免费版 附安装教程 - 121下载站...
  11. Centos7设置SSH安全策略–指定IP登陆
  12. 小规模免税新政,账务怎么做?
  13. 六自由度机械臂研究(1)- 简介, 自由度与改装
  14. 域渗透——获取用户明文密码
  15. JDBC的PreparedStatement接口
  16. python columns函数_pandas 对 column 使用函数
  17. 时序分析 19 VAR(Vector Autoregression) 向量自回归
  18. If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
  19. STM32外部引脚电路个人总结
  20. 小孩子初次办身份证需携带什么资料?年龄有要求吗?

热门文章

  1. python聚类分析散点图_使用sklearn对iris数据集进行聚类分析
  2. mysql 存储过程临时表_在MySQL存储过程中创建的临时表的范围
  3. 埋点是什么意思_(一百二十二)埋点方案举例,如何做埋点方案
  4. libaio源码安装_MySQL5.7.17 编译安装及二进制安装详解
  5. linux shell期末测试,LINUX期末复习---SHELL编程
  6. 2440 linux文件写,添加yaffs2文件系统 - Linux2.6.39在S3C2440上的移植_Linux编程_Linux公社-Linux系统门户网站...
  7. oracle查看本机字符集,查看、修改oracle字符集,查看oracle版本
  8. iscsi:IO操作流程(三)
  9. java创建response对象_javaweb入门-----request与response的作用
  10. javacript 字典