[转]找到MySQL发生swap的原因
背景:
最近遇到了一个郁闷的问题:明明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(查看vm.swappiness = 10),最好是设置为 0。原因很简单,对数据库这种需要集中CPU资源、大内存、高I/O的程序而言,如果用SWAP分区代替内存,那数据库服务性能将是不可接受的,还不如直接被OOM kill(数据库进程通常占用最多内存,最容易被OOM kill)来的痛快(早死晚死都是死,还不如痛快的死,反正很快就能重生,嗯)。
先介绍完这么多信息,大家肯定已经不耐烦了,我们就来看看现场并进行排查吧。
现场排查
首先,看下系统整体的状况,能看出来什么呢,有几个关键信息:
系统负载不算高,最近的平均load是6.8;
CPU负载也不算高,有大量的空闲,idle为 98.4%;
内存主要分配给mysqld进程,占用了80.2%;
尽管物理内存有256G,空闲的也将近39G,但确实发生swap了,并且把SWAP都耗尽了。
得到第一个排查结果:物理内存还有不少空闲,但却把swap都耗尽了。作为一个有经验的DBA,遇到这种情况第一反应是什么呢?嗯,先不点破,继续往下看。
再执行 free -gt 查看内存、SWAP消耗情况,如下图.3所示
图3
看出来了吧:遇到这种情况,第一条件反射很直接就是:发生内存泄露(memory leak)了。
一般来说,如果发现内存统计结果中,cached 和 used 相差特别大的话,基本可确定系统发生内存泄露。相应的处理手法有:
治标的办法:择机重启进程,彻底释放内存归还给OS;
治本的办法:找到代码中导致泄露的代码,修复之(我们这次面对的是mysql代码,还是去官方提交bug吧,哈哈);
治本的办法:升级程序版本,通常新版本会解决旧版本存在的问题,推荐此方案。
再看下MySQL中内存相关选项怎么配置的:
图4
除了 innodb-buffer-pool 分配的稍微多一些外,其他的还算正常。看了下,MySQL的版本是 5.6.19,看来是有必要升级到5.6系列的最新版本。
到这里,我们得到第二个排查结果:mysqld进程发生内存泄露,建议择机重启进程,并尽快安排升级到最新版本。
然而,仅仅是因为mysqld进程内存泄露导致的SWAP吗,貌似不全然?还记得上面我们有个地方还没点破的不:物理内存还有不少空闲,但把swap都耗尽了。绝大多数情况是因为没有关闭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,推荐此方案。
说到这里,这个问题已经基本分析清楚了,相关的解决建议也给了,根据自己的情况去评估选择哪个方案即可。
[转]找到MySQL发生swap的原因的更多相关文章
- MySQL针对Swap分区的运维注意点
Linux有很多很好的内存.IO调度机制,但是并不会适用于所有场景.对于运维人员来说,Linux比较让人头疼的一个地方是:它不会因为MySQL很重要就避免将分配给MySQL的地址空间映射到swap上. ...
- 谈谈MySQL无法连接的原因和分析方法
[可能的原因] MySQL无法连接的原因有很多,比如: 1.数据库的请求量突增,实例连接数超过max_connections,或用户连接数超过max_user_connections, 这种情况连接时 ...
- mysql主从同步异常原因及恢复
mysql主从同步异常原因及恢复 前言 mysql数据库做主从复制,不仅可以为数据库的数据做实时备份,保证数据的完整性,还能做为读写分离,提升数据库的整体性能.但是,mysql主从复制经常会因为某些原 ...
- SQL语句优化、mysql不走索引的原因、数据库索引的设计原则
SQL语句优化 1 企业SQL优化思路 1.把一个大的不使用索引的SQL语句按照功能进行拆分 2.长的SQL语句无法使用索引,能不能变成2条短的SQL语句让它分别使用上索引. 3.对SQL语句功能的拆 ...
- RDS MySQL 空间问题的原因和解决
来源:https://help.aliyun.com/knowledge_detail/41739.html RDS MySQL 空间问题的原因和解决 更新时间:2016-07-22 17:20:14 ...
- 牛客网Java刷题知识点之拥塞发生的主要原因、TCP拥塞控制、TCP流量控制、TCP拥塞控制的四大过程(慢启动、拥塞避免、快速重传、快速恢复)
不多说,直接上干货! 福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号: 大数据躺过的坑 Java从入门到架构师 人工智能躺过的坑 ...
- MySQL发生系统错误2 系统无法找到指定文件
https://blog.csdn.net/digitalmon/article/details/78152187 https://www.cnblogs.com/gaogaoyanjiu/p/104 ...
- mysql 创建外键时发生错误的原因和解决方法
可以去网上查看错误号,就能知道到底哪里出错了 https://zhidao.baidu.com/question/359868536.html 这里1452对应的错误是因为建立外键的表中还有数据,所以 ...
- mysql负载飙高原因分析
某些进程/服务消耗更多CPU资源(服务响应更多请求或存在某些应用瓶颈):发生比较严重的swap(可用物理内存不足):发生比较严重的中断(因为SSD或网络的原因发生中断):磁盘I/O比较慢(会导致CPU ...
随机推荐
- 转载:C# socket端口复用-多主机头绑定
什么是端口复用: 因为在winsock的实现中,对于服务器的绑定是可以多重绑定的,在确定多重绑定使用谁的时候,根据一条原则是谁的指定最明确则将包递交给谁,而且没有权限之分.这种多重绑定便称之为端口复用 ...
- 如何在ubuntu中安装php
如何在ubuntu中安装php 情衅 | 浏览 692 次 发布于2016-05-07 12:36 最佳答案 关于Ubuntu下的LAMP配置步骤: 首先要安装LAMP 就是Apache,PH ...
- c语言作业01-分支、顺序结构
1.本章思考总结 1.1思维导图 1.2本章学习体会及代码量学习体会 1.2.1学习体会 这一个星期算是我学习c语言的起点,因为暑假没有提前自学c语言,所以一上课时会觉得比较吃力也难以跟上其他大部分同 ...
- C语言典型编程2
关于C的一些小而精的编程,适合希望提升编程能力的初学者学习:关键编程也就几句,但思维可以迁移到其他编程语言.同一问题,算法多种. //任意整数的任意次方取后3位(算数取位)#include<st ...
- python--第二十四天总结
CMDB介绍 CMDB --Configuration Management Database 配置管理数据库, CMDB存储与管理企业IT架构中设备的各种配置信息,它与所有服务支持和服务交付流程都紧 ...
- 【1天】黑马程序员27天视频学习笔记【Day02】
02.01常量的概述和使用 * A:什么是常量 * 在程序执行的过程中其值不可以发生改变 * B:Java中常量的分类 * 字面值常量 * 自定义常量(面向对象部分讲) * C:字面 ...
- 原型设计工具—Axure
作为软件设计的一员,需要在软件开发初期确保软件的具体内容,防止后期大幅度的修改. 在这样的情况下,原型设计软件就起到了关键的作用. 摘要: 原型设计为什么这么重要呢? 因为它帮助我们搭建了低保真或高保 ...
- CentOS7+CDH5.14.0安装全流程记录,图文详解全程实测-6CM安装前环境检查
检查环境 在正式开始安装CDH之前最好先检查一下能不能相互免密ssh,以及防火墙是否关闭,集群中的时间是否统一,java版本是否是oracle的版本,主节点mysql是否安装正确等. ssh测试 例如 ...
- 记忆化搜索 P1464 Function
题目描述 对于一个递归函数w(a,b,c) 如果a≤0 or b≤0 or c≤0就返回值1. 如果a>20 or b>20 or c>20就返回w(20,20,20) 如果a< ...
- Falsk SqlAlchemy
pip install mysql-connector from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Fl ...