技术
成就梦想!

配置swappiness参数与关闭NUMA

一、关于Swap

1、什么是swap分区

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

2、内存回收机制

①Linux内核使用cache对部分文件进行缓存,提升文件读写效率,引入了kswapd进程进行周期性检查,保证剩余内存空间。
②当内存分配没有足够的空间时,直接内存回收。

二、关于swappiness与配置

1、关于Swappiness

swappiness的值的大小对如何使用swap分区是有着很大的联系的。swappiness=0的时候表示最大限度使用物理内存,然后才是 swap空间,swappiness=100的时候表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面。linux的基本默认设置为60。

简单地说这个参数定义了系统对swap的使用倾向,默认值为60,值越大表示越倾向于使用swap。可以设为0,这样做并不会禁止对swap的使用,只是最大限度地降低了使用swap的可能性。

在MySQL中,特别是InnoDB管理内存缓存,它占用的内存比较多,不经常访问的内存也会不少,这些内存如果被Linux错误的交换出去了,将浪费很多CPU和IO资源。 InnoDB自己管理缓存,cache的文件数据来说占用了内存,对InnoDB几乎没有任何好处。所以,我们在MySQL的服务器上最好设置vm.swappiness=1或0。

2、配置Swappiness

cat /proc/sys/vm/swappiness   #查看当前swappiness值
echo "vm.swappiness=1" >> /etc/sysctl.conf    #配置vm.swappiness=1参数
sysctl -p   #使系统参数生效下

image
image

三、关于UNMA与配置

1、关于UNMA

NUMA(Non-Uniform Memory Access)架构是为了解决多CPU下内存访问冲突,简单来说不在将整个物理内存作为一个整体,现在的机器上都是有多个CPU和多个内存块的。以前我们都是将内存块看成是一大块内存,所有CPU到这个共享内存的访问消息是一样的。这就是之前普遍使用的SMP模型。但是随着处理器的增加,共享内存可能会导致内存访问冲突越来越厉害,且如果内存访问达到瓶颈的时候,性能就不能随之增加。NUMA(Non-Uniform Memory Access)就是这样的环境下引入的一个模型。比如一台机器是有2个处理器,有4个内存块。我们将1个处理器和两个内存块合起来,称为一个NUMA node,这样这个机器就会有两个NUMA node。在物理分布上,NUMA node的处理器和内存块的物理距离更小,因此访问也更快。比如这台机器会分左右两个处理器(cpu1, cpu2),在每个处理器两边放两个内存块(memory1.1, memory1.2, memory2.1,memory2.2),这样NUMA node1的cpu1访问memory1.1和memory1.2就比访问memory2.1和memory2.2更快。所以使用NUMA的模式如果能尽量保证本node内的CPU只访问本node内的内存块,那这样的效率就是最高的。

image

2、检查UNMA是否开启

通过命令查看UNMA是否启动:

1、通过lscpu检查
lscpu        #查看CPU信息
NUMA node0 CPU(s): 0-127     #如果内存通道都在node0上则代表NUMA未开启

NUMA node0 CPU(s): 0-5,48-53
NUMA node1 CPU(s): 6-11,54-59
NUMA node2 CPU(s): 12-17,60-65
NUMA node3 CPU(s): 18-23,66-71
NUMA node4 CPU(s): 24-29,72-77
NUMA node5 CPU(s): 30-35,78-83
NUMA node6 CPU(s): 36-41,84-89
NUMA node7 CPU(s): 42-47,90-95   #如果输出以上内容则代表NUMA开启

2、通过dmesg查询
dmesg | grep -i numa #如果输出一下内容则代表NUMA开启
[ 0.000000] NUMA: Initialized distance table, cnt=8
[ 0.000000] NUMA: Node 0 [mem 0x00000000-0x0009ffff] + [mem 0x00100000-0x7fffffff] -> [mem 0x00000000-0x7fffffff]
[ 0.000000] NUMA: Node 0 [mem 0x00000000-0x7fffffff] + [mem 0x100000000-0x87fffffff] -> [mem 0x00000000-0x87fffffff]
[ 0.000000] Enabling automatic NUMA balancing. Configure with numa_balancing= or the kernel.numa_balancing sysctl

3、通过numactl查询
numactl --hardware     #如果输出单CPU内容即代表NUMA未开启
available: 1 nodes (0)
node 0 cpus: 0 1
node 0 size: 4095 MB
node 0 free: 3724 MB
node distances:
node   0 
  0:  10 

numactl --hardware    #如果输出node多CPU即代表NUMA开启
available: 2 nodes (0-1)
node 0 cpus: 0 1 2 3 4 5 6 7 16 17 18 19 20 21 22 23
node 0 size: 8157 MB
node 0 free: 88 MB
node 1 cpus: 8 9 10 11 12 13 14 15 24 25 26 27 28 29 30 31
node 1 size: 8191 MB
node 1 free: 5176 MB
node distances:
node   0   1 
  0:  10  20 
  1:  20  10

3、关闭NUMA

MySQL采用了线程模式,对于NUMA特性的支持并不好,如果单机只运行一个MySQL实例,建议关闭NUMA来避免数据库​OOM(Out Of Memory即内存溢出)。方法有以下两种:
①BIOS中设置关闭(推荐适用于数据库直接安装到裸金属架构);
可以直接在BIOS中高级选项中关闭,有的厂商叫内存交叉,有的是直接叫NUMA。
还有的厂商内存条必须插满CPU的单位通道才能关闭,这种的话就需要选择在OS层面关闭。

②OS内核中设置关闭(下面配置);

CentOS6和CentOS7关闭操作系统NUMA的方式存在一些差异,CentOS7的关闭方法如下:
修改/etc/default/grub配置文件(追加numa=off);
image
然后编译配置文件
grub2-mkconfig -o /etc/grub2.cfg

相关文档:
NUMA检测相关文档
swappiness相关资料

赞(0)
未经允许不得转载:未来往事 » 配置swappiness参数与关闭NUMA

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址