Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 428|回复: 0

NUMA导致的MySQL服务器SWAP问题分析与解决方案

[复制链接]
  • TA的每日心情
    奋斗
    前天 12:49
  • 签到天数: 789 天

    [LV.10]以坛为家III

    2049

    主题

    2107

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    722638
    发表于 2021-5-27 16:38:32 | 显示全部楼层 |阅读模式

    【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`

     

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-9-8 03:37 , Processed in 0.059141 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表