【swap产生原理】
我们通过问答形式来探讨swap产生的原理,以帮助大家更好地理解Linux内存管理的复杂性:
1、什么是swap及其产生原因?
swap是指交换分区或文件,主要在内存使用压力大时触发内存回收,可能会将部分内存数据交换到swap空间。
2、内存回收的机制是什么?
Linux内核使用cache来缓存部分文件,提高文件读写效率。因此,引入了kswapd进程进行定期检查,以确保有足够的剩余内存空间。
当内存分配空间不足时,会直接进行内存回收。
3、如何实现内存回收?
内存回收的实现非常复杂,简而言之,主要针对文件页和匿名页,这些页通过LRU链表管理。
其中,匿名页主要通过swap进行回收,而文件页通过写回和清空进行释放。
4、几个重要的概念是什么?
内存节点(node):在NUMA架构下,CPU访问不同位置的内存会有本地内存和远端内存之分,这些是不同的节点。
内存分区(zone):Linux将内存节点进一步划分为不同的区,内存管理以zone为单位。
内存水位标记:分为high、low、min。
通过下图可以更直观地理解这些概念:

5、内存回收的行为是怎样的?
当系统剩余内存低于low时,kswapd开始进行内存回收,直到内存达到high水位。
当剩余内存达到min时,会触发直接回收。
当触发全局回收,并且file+free满足条件时,会进行进一步的回收操作。
例如,在数据库进行全备份时,cache大量使用,导致可用空间不足,从而触发内存回收:

上图展示了/proc/zoneinfo的部分内容,可以看到满足了file+free条件:

为什么会有大量的文件页cache?这是因为系统在进行内存管理时,文件页的缓存机制会导致这种情况。
【关闭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、安装numactl:yum install numactl -y。
2、修改/usr/bin/mysqld_safe文件,在cmd="mysqld_ld_preload_text$NOHUP_NICENESS"下添加以下脚本:
cmd="/usr/bin/numactl --interleave all $cmd"

3、停止MySQL服务:service mysql stop。
4、写入硬盘,防止数据丢失:sync;sync;sync。
5、延迟10秒:sleep 10。
6、清理pagecache、dentries和inodes:sysctl -q -w vm.drop_caches=3。
7、启动MySQL服务:service mysql start。
8、验证numactl –interleave all是否生效,可以通过以下命令查看,interleave_hit是采用interleave策略从该节点分配的次数,未启动interleave策略的服务器,这个值会很低:
numastat -mn -p pidof mysqld

以上就是NUMA导致的MySQL服务器SWAP问题分析与解决方案的详细内容,更多请关注php中文网其它相关文章!
                        
                        每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
                Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号