【SWAP产生原理】

先从swap产生的原理来分析,由于linux内存管理比较复杂,下面以问答的方式列了一些重要的点,方便大家理解:

1、swap是如何产生的

swap指的是一个交换分区或文件,主要是在内存使用存在压力时,触发内存回收,这时可能会将部分内存的数据交换到swap空间。

2、内存回收的机制

<1>Linux内核使用cache对部分文件进行缓存,提升文件读写效率。所以 引入了kswapd进程进行周期性检查,保证剩余内存空间。

<2>当内存分配没有足够的空间时,直接内存回收。

3、内存回收如何实现

这部分实现非常复杂,简单来说,内存回收操作主要针对内存的文件页和匿名页,这些页都通过LRU链表来管理。

其中anon的匿名页内存主要回收手段是swap,文件页释放方式是写回和清空。

4、讲几个重要的概念

<1>内存节点node,在NUMA的情况下,CPU访问不同位置的内存,会有本地内存和远端内存之分,这两个就是不同的节点。

<2>内存分区 zone,linux对内存节点做了进一步划分,将一个节点划分为不同的区。内存管理的逻辑以zone为单位。

<3>内存水位标记,分为high、low、min

通过下图可以比较直观的了解

5、内存回收行为

<1>当系统剩余内存低于low时,kswapd开始起作用进行内存回收,直到内存达到high水位。

<2>当剩余内存达到min时就会触发直接回收。

<3>当触发全局回收,并且file+free<=high时,一定会进行针对匿名页的swap。

下面举例:

在数据库做全备份时cache大量使用,剩余可用空间不足,触发内存回收,

上图是/proc/zoneinfo的部分内容,可以看到满足了file+free<=high的条件,同一时间触发了swap,将内存匿名页的数据写入交换区

有大量的文件页cache,为什么会出现file+free<=high的情况,分析下来全备文件缓存时,node 0的nr_inactive_file很低,大部分非活动的文件页都分布在node 1上,是由于开启NUMA导致的。

【关闭NUMA的方案】

1、 在mysqld_safe脚本中加上“numactl –interleave all”来启动mysqld

2、 Linux Kernel启动参数中加上numa=off,需要重启服务器

3、 在BIOS层面关闭NUMA

4、 MySQL 5.6.27/5.7.9开始引用innodb_numa_interleave选项

对于2、3、4关闭NUMA的方案比较简单,不做详细描述,下面重点描述下方案1

【开启numa interleave访问的步骤】

1、 yum install numactl -y

2、修改/usr/bin/mysqld_safe文件

cmd="`mysqld_ld_preload_text`$NOHUP_NICENESS"下新增一条脚本

cmd="/usr/bin/numactl --interleave all $cmd"

3、service mysql stop

4、#写入硬盘,防止数据丢失

sync;sync;sync

5、#延迟10秒

sleep 10

6、#清理pagecache、dentries和inodes

sysctl -q -w vm.drop_caches=3

7、service mysql start

8、验证numactl –interleave all是否生效,可以通过下面命令,interleave_hit是采用interleave策略从该节点分配的次数,没有启动interleave策略的服务器,这个值会很低

numastat -mn -p `pidof mysqld`

NUMA导致的MySQL服务器SWAP问题分析与解决方案的更多相关文章

  1. NUMA导致的MySQL服务器SWAP问题分析

    [作者] 王栋:携程技术保障中心数据库专家,对数据库疑难问题的排查和数据库自动化智能化运维工具的开发有强烈的兴趣. [问题描述] 我们知道当mysqld进程使用到SWAP时,就会严重影响到MySQL的 ...

  2. 谈谈Mysql主从同步延迟分析及解决方案

    一.MySQL的数据库主从复制原理 MySQL主从复制实际上基于二进制日志,原理可以用一张图来表示: 分为四步走: 1. 主库对所有DDL和DML产生的日志写进binlog: 2. 主库生成一个 lo ...

  3. MySQL服务器发生OOM的案例分析

    [问题] 有一台MySQL5.6.21的服务器发生OOM,分析下来与多种因素有关 [分析过程] 1.服务器物理内存相对热点数据文件偏小,62G物理内存+8G的SWAP,数据文件大小约550G 触发OO ...

  4. MySQL针对Swap分区的运维注意点

    Linux有很多很好的内存.IO调度机制,但是并不会适用于所有场景.对于运维人员来说,Linux比较让人头疼的一个地方是:它不会因为MySQL很重要就避免将分配给MySQL的地址空间映射到swap上. ...

  5. 利用innodb_force_recovery 解决WAMP MySQL服务器无法正常启动的问题

    有次公司突然断电,导致wamp mysql无法重启 二 分析    初步估计是mysql日志损坏问题,从日志内容分析来看,数据库在机器crash 导致日志文件损坏,重启之后无法正常恢复,更无法正常对外 ...

  6. MySQL大事务导致的Insert慢的案例分析

    [问题] 有台MySQL服务器不定时的会出现并发线程的告警,从记录信息来看,有大量insert的慢查询,执行几十秒,等待flushing log,状态query end [初步分析] 从等待资源来看, ...

  7. 改进动态设置query cache导致额外锁开销的问题分析及解决方法-mysql 5.5 以上版本

    改进动态设置query cache导致额外锁开销的问题分析及解决方法 关键字:dynamic switch for query cache,  lock overhead for query cach ...

  8. MySQL服务器 IO 100%的分析与优化方案

    前言 压力测试过程中,如果因为资源使用瓶颈等问题引发最直接性能问题是业务交易响应时间偏大,TPS逐渐降低等.而问题定位分析通常情况下,最优先排查的是监控服务器资源利用率,例如先用TOP 或者nmon等 ...

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

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

随机推荐

  1. java 7 升级后,控制面板里找不到java图标了

    如果电脑里只装了jre的情况下,好像从java 7 update 9开始,通过java自动升级程序完成升级后,控制面板里的java图标就不见了. 只好重新从java.sun.com上下载最新版的jre ...

  2. 借读:分布式锁和双写Redis

      本帖最后由 howtodown 于 2016-10-3 16:01 编辑问题导读1.为什么会产生分布式锁?2.使用分布式锁的方法有哪些?3.本文创造的分布式锁的双写Redis框架都包含哪些内容? ...

  3. linux c 编程 ------ 串口编程

    http://blog.csdn.net/specialshoot/article/details/50707965 对于串口的打开操作,必须使用O_NOCTTY参数.O_NOCTTY如果路径名指向终 ...

  4. 五大常见的MySQL高可用方案

      1. 概述 我们在考虑MySQL数据库的高可用的架构时,主要要考虑如下几方面: 1.1 如果数据库发生了宕机或者意外中断等故障,能尽快恢复数据库的可用性,尽可能的减少停机时间,保证业务不会因为数据 ...

  5. sql数据库连接字符串在APP.config配置文件内的两种写法

    第一种方法 写法: <configuration> <appSettings> <add key="connectionstring" value=& ...

  6. Java SpringMVC框架学习(二)httpServeltRequest和Model传值的区别

    HttpServletRequest 为什么大多程序在controller中给jsp传值时使用model.addAttribute()而不使用httpServeletRequest.setAttrib ...

  7. Export SQLite data to Excel in iOS programmatically(OC)

    //For the app I have that did this, the SQLite data was fairly large. Therefore, I used a background ...

  8. alert换行警示

    alert("再次向您问好!在这里,我们向您演示" + '\n' + "如何向警告框添加折行.")

  9. Django进阶之缓存和信号

    一.缓存 简介 由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者mem ...

  10. python实现两个经纬度点之间的距离和方位角

    from:http://blog.csdn.net/zhuqiuhui/article/details/53180395 1.  求两个经纬点的方位角,P0(latA, lonA), P1(latB, ...